libnl 1.1.4

Allocation/Freeing

struct rtnl_rule * rtnl_rule_alloc (void)
 
void rtnl_rule_put (struct rtnl_rule *rule)
 

Cache Management

struct nl_cache * rtnl_rule_alloc_cache_by_family (struct nl_handle *handle, int family)
 Build a rule cache including all rules of the specified family currently configured in the kernel.
 
struct nl_cache * rtnl_rule_alloc_cache (struct nl_handle *handle)
 Build a rule cache including all rules currently configured in the kernel.
 

Rule Addition

struct nl_msg * rtnl_rule_build_add_request (struct rtnl_rule *tmpl, int flags)
 Build netlink request message to add a new rule.
 
int rtnl_rule_add (struct nl_handle *handle, struct rtnl_rule *tmpl, int flags)
 Add a new rule.
 

Rule Deletion

struct nl_msg * rtnl_rule_build_delete_request (struct rtnl_rule *rule, int flags)
 Build a netlink request message to delete a rule.
 
int rtnl_rule_delete (struct nl_handle *handle, struct rtnl_rule *rule, int flags)
 Delete a rule.
 

Attribute Modification

void rtnl_rule_set_family (struct rtnl_rule *rule, int family)
 
int rtnl_rule_get_family (struct rtnl_rule *rule)
 
void rtnl_rule_set_prio (struct rtnl_rule *rule, int prio)
 
int rtnl_rule_get_prio (struct rtnl_rule *rule)
 
void rtnl_rule_set_mark (struct rtnl_rule *rule, uint64_t mark)
 
uint64_t rtnl_rule_get_mark (struct rtnl_rule *rule)
 
void rtnl_rule_set_table (struct rtnl_rule *rule, int table)
 
int rtnl_rule_get_table (struct rtnl_rule *rule)
 
void rtnl_rule_set_dsfield (struct rtnl_rule *rule, int dsfield)
 
int rtnl_rule_get_dsfield (struct rtnl_rule *rule)
 
void rtnl_rule_set_src_len (struct rtnl_rule *rule, int len)
 
int rtnl_rule_get_src_len (struct rtnl_rule *rule)
 
void rtnl_rule_set_dst_len (struct rtnl_rule *rule, int len)
 
int rtnl_rule_get_dst_len (struct rtnl_rule *rule)
 
int rtnl_rule_set_src (struct rtnl_rule *rule, struct nl_addr *src)
 
struct nl_addr * rtnl_rule_get_src (struct rtnl_rule *rule)
 
int rtnl_rule_set_dst (struct rtnl_rule *rule, struct nl_addr *dst)
 
struct nl_addr * rtnl_rule_get_dst (struct rtnl_rule *rule)
 
int rtnl_rule_set_iif (struct rtnl_rule *rule, const char *dev)
 
char * rtnl_rule_get_iif (struct rtnl_rule *rule)
 
void rtnl_rule_set_action (struct rtnl_rule *rule, int type)
 
int rtnl_rule_get_action (struct rtnl_rule *rule)
 
void rtnl_rule_set_realms (struct rtnl_rule *rule, realm_t realms)
 
realm_t rtnl_rule_get_realms (struct rtnl_rule *rule)
 

Detailed Description

Function Documentation

◆ rtnl_rule_alloc()

struct rtnl_rule * rtnl_rule_alloc ( void  )

Definition at line 419 of file rule.c.

420{
421 return (struct rtnl_rule *) nl_object_alloc(&rule_obj_ops);
422}
struct nl_object * nl_object_alloc(struct nl_object_ops *ops)
Allocate a new object of kind specified by the operations handle.
Definition: object.c:42

◆ rtnl_rule_put()

void rtnl_rule_put ( struct rtnl_rule *  rule)

Definition at line 424 of file rule.c.

425{
426 nl_object_put((struct nl_object *) rule);
427}
void nl_object_put(struct nl_object *obj)
Release a reference from an object.
Definition: object.c:178

◆ rtnl_rule_alloc_cache_by_family()

struct nl_cache * rtnl_rule_alloc_cache_by_family ( struct nl_handle *  handle,
int  family 
)
Parameters
handlenetlink handle
familyaddress family

Allocates a new rule cache, initializes it properly and updates it to include all rules of the specified address family currently configured in the kernel.

Note
The caller is responsible for destroying and freeing the cache after using it. (nl_cache_destroy_and_free())
Returns
The new cache or NULL if an error occured.

Definition at line 449 of file rule.c.

451{
452 struct nl_cache * cache;
453
454 cache = nl_cache_alloc(&rtnl_rule_ops);
455 if (cache == NULL)
456 return NULL;
457
458 /* XXX RULE_CACHE_FAMILY(cache) = family; */
459
460 if (handle && nl_cache_refill(handle, cache) < 0) {
461 free(cache);
462 return NULL;
463 }
464
465 return cache;
466}
struct nl_cache * nl_cache_alloc(struct nl_cache_ops *ops)
Allocate an empty cache.
Definition: cache.c:170
int nl_cache_refill(struct nl_handle *handle, struct nl_cache *cache)
(Re)fill a cache with the contents in the kernel.
Definition: cache.c:680

References nl_cache_alloc(), and nl_cache_refill().

Referenced by rtnl_rule_alloc_cache().

◆ rtnl_rule_alloc_cache()

struct nl_cache * rtnl_rule_alloc_cache ( struct nl_handle *  handle)
Parameters
handlenetlink handle

Allocates a new rule cache, initializes it properly and updates it to include all rules currently configured in the kernel.

Note
The caller is responsible for destroying and freeing the cache after using it. (nl_cache_destroy_and_free())
Returns
The new cache or NULL if an error occured.

Definition at line 479 of file rule.c.

480{
481 return rtnl_rule_alloc_cache_by_family(handle, AF_UNSPEC);
482}
struct nl_cache * rtnl_rule_alloc_cache_by_family(struct nl_handle *handle, int family)
Build a rule cache including all rules of the specified family currently configured in the kernel.
Definition: rule.c:449

References rtnl_rule_alloc_cache_by_family().

◆ rtnl_rule_build_add_request()

struct nl_msg * rtnl_rule_build_add_request ( struct rtnl_rule *  tmpl,
int  flags 
)
Parameters
tmpltemplate with data of new rule
flagsadditional netlink message flags

Builds a new netlink message requesting a addition of a new rule. The netlink message header isn't fully equipped with all relevant fields and must thus be sent out via nl_send_auto_complete() or supplemented as needed. tmpl must contain the attributes of the new address set via rtnl_rule_set_* functions.

Returns
The netlink message

Definition at line 564 of file rule.c.

565{
566 return build_rule_msg(tmpl, RTM_NEWRULE, NLM_F_CREATE | flags);
567}
#define NLM_F_CREATE
Create config object if it doesn't already exist.

References NLM_F_CREATE.

Referenced by rtnl_rule_add().

◆ rtnl_rule_add()

int rtnl_rule_add ( struct nl_handle *  handle,
struct rtnl_rule *  tmpl,
int  flags 
)
Parameters
handlenetlink handle
tmpltemplate with requested changes
flagsadditional netlink message flags

Builds a netlink message by calling rtnl_rule_build_add_request(), sends the request to the kernel and waits for the next ACK to be received and thus blocks until the request has been fullfilled.

Returns
0 on sucess or a negative error if an error occured.

Definition at line 581 of file rule.c.

582{
583 int err;
584 struct nl_msg *msg;
585
586 msg = rtnl_rule_build_add_request(tmpl, flags);
587 if (!msg)
588 return nl_errno(ENOMEM);
589
590 err = nl_send_auto_complete(handle, msg);
591 nlmsg_free(msg);
592 if (err < 0)
593 return err;
594
595 return nl_wait_for_ack(handle);
596}
void nlmsg_free(struct nl_msg *n)
Free a netlink message.
Definition: msg.c:656
int nl_send_auto_complete(struct nl_handle *handle, struct nl_msg *msg)
Send netlink message and check & extend header values as needed.
Definition: nl.c:373
int nl_wait_for_ack(struct nl_handle *handle)
Wait for ACK.
Definition: nl.c:801
struct nl_msg * rtnl_rule_build_add_request(struct rtnl_rule *tmpl, int flags)
Build netlink request message to add a new rule.
Definition: rule.c:564

References nl_send_auto_complete(), nl_wait_for_ack(), nlmsg_free(), and rtnl_rule_build_add_request().

◆ rtnl_rule_build_delete_request()

struct nl_msg * rtnl_rule_build_delete_request ( struct rtnl_rule *  rule,
int  flags 
)
Parameters
rulerule to delete
flagsadditional netlink message flags

Builds a new netlink message requesting a deletion of a rule. The netlink message header isn't fully equipped with all relevant fields and must thus be sent out via nl_send_auto_complete() or supplemented as needed. rule must point to an existing address.

Returns
The netlink message

Definition at line 618 of file rule.c.

619{
620 return build_rule_msg(rule, RTM_DELRULE, flags);
621}

Referenced by rtnl_rule_delete().

◆ rtnl_rule_delete()

int rtnl_rule_delete ( struct nl_handle *  handle,
struct rtnl_rule *  rule,
int  flags 
)
Parameters
handlenetlink handle
rulerule to delete
flagsadditional netlink message flags

Builds a netlink message by calling rtnl_rule_build_delete_request(), sends the request to the kernel and waits for the next ACK to be received and thus blocks until the request has been fullfilled.

Returns
0 on sucess or a negative error if an error occured.

Definition at line 635 of file rule.c.

637{
638 int err;
639 struct nl_msg *msg;
640
641 msg = rtnl_rule_build_delete_request(rule, flags);
642 if (!msg)
643 return nl_errno(ENOMEM);
644
645 err = nl_send_auto_complete(handle, msg);
646 nlmsg_free(msg);
647 if (err < 0)
648 return err;
649
650 return nl_wait_for_ack(handle);
651}
struct nl_msg * rtnl_rule_build_delete_request(struct rtnl_rule *rule, int flags)
Build a netlink request message to delete a rule.
Definition: rule.c:618

References nl_send_auto_complete(), nl_wait_for_ack(), nlmsg_free(), and rtnl_rule_build_delete_request().

◆ rtnl_rule_set_family()

void rtnl_rule_set_family ( struct rtnl_rule *  rule,
int  family 
)

Definition at line 660 of file rule.c.

661{
662 rule->r_family = family;
663 rule->ce_mask |= RULE_ATTR_FAMILY;
664}

◆ rtnl_rule_get_family()

int rtnl_rule_get_family ( struct rtnl_rule *  rule)

Definition at line 666 of file rule.c.

667{
668 if (rule->ce_mask & RULE_ATTR_FAMILY)
669 return rule->r_family;
670 else
671 return AF_UNSPEC;
672}

◆ rtnl_rule_set_prio()

void rtnl_rule_set_prio ( struct rtnl_rule *  rule,
int  prio 
)

Definition at line 674 of file rule.c.

675{
676 rule->r_prio = prio;
677 rule->ce_mask |= RULE_ATTR_PRIO;
678}

◆ rtnl_rule_get_prio()

int rtnl_rule_get_prio ( struct rtnl_rule *  rule)

Definition at line 680 of file rule.c.

681{
682 if (rule->ce_mask & RULE_ATTR_PRIO)
683 return rule->r_prio;
684 else
685 return -1;
686}

◆ rtnl_rule_set_mark()

void rtnl_rule_set_mark ( struct rtnl_rule *  rule,
uint64_t  mark 
)

Definition at line 688 of file rule.c.

689{
690 rule->r_mark = mark;
691 rule->ce_mask |= RULE_ATTR_MARK;
692}

◆ rtnl_rule_get_mark()

uint64_t rtnl_rule_get_mark ( struct rtnl_rule *  rule)

Definition at line 694 of file rule.c.

695{
696 if (rule->ce_mask & RULE_ATTR_MARK)
697 return rule->r_mark;
698 else
699 return UINT_LEAST64_MAX;
700}

◆ rtnl_rule_set_table()

void rtnl_rule_set_table ( struct rtnl_rule *  rule,
int  table 
)

Definition at line 702 of file rule.c.

703{
704 rule->r_table = table;
705 rule->ce_mask |= RULE_ATTR_TABLE;
706}

◆ rtnl_rule_get_table()

int rtnl_rule_get_table ( struct rtnl_rule *  rule)

Definition at line 708 of file rule.c.

709{
710 if (rule->ce_mask & RULE_ATTR_TABLE)
711 return rule->r_table;
712 else
713 return -1;
714}

◆ rtnl_rule_set_dsfield()

void rtnl_rule_set_dsfield ( struct rtnl_rule *  rule,
int  dsfield 
)

Definition at line 716 of file rule.c.

717{
718 rule->r_dsfield = dsfield;
719 rule->ce_mask |= RULE_ATTR_DSFIELD;
720}

◆ rtnl_rule_get_dsfield()

int rtnl_rule_get_dsfield ( struct rtnl_rule *  rule)

Definition at line 722 of file rule.c.

723{
724 if (rule->ce_mask & RULE_ATTR_DSFIELD)
725 return rule->r_dsfield;
726 else
727 return -1;
728}

◆ rtnl_rule_set_src_len()

void rtnl_rule_set_src_len ( struct rtnl_rule *  rule,
int  len 
)

Definition at line 730 of file rule.c.

731{
732 rule->r_src_len = len;
733 if (rule->ce_mask & RULE_ATTR_SRC)
734 nl_addr_set_prefixlen(rule->r_src, len);
735 rule->ce_mask |= RULE_ATTR_SRC_LEN;
736}

◆ rtnl_rule_get_src_len()

int rtnl_rule_get_src_len ( struct rtnl_rule *  rule)

Definition at line 738 of file rule.c.

739{
740 if (rule->ce_mask & RULE_ATTR_SRC_LEN)
741 return rule->r_src_len;
742 else
743 return -1;
744}

◆ rtnl_rule_set_dst_len()

void rtnl_rule_set_dst_len ( struct rtnl_rule *  rule,
int  len 
)

Definition at line 746 of file rule.c.

747{
748 rule->r_dst_len = len;
749 if (rule->ce_mask & RULE_ATTR_DST)
750 nl_addr_set_prefixlen(rule->r_dst, len);
751 rule->ce_mask |= RULE_ATTR_DST_LEN;
752}

◆ rtnl_rule_get_dst_len()

int rtnl_rule_get_dst_len ( struct rtnl_rule *  rule)

Definition at line 754 of file rule.c.

755{
756 if (rule->ce_mask & RULE_ATTR_DST_LEN)
757 return rule->r_dst_len;
758 else
759 return -1;
760}

◆ rtnl_rule_set_src()

int rtnl_rule_set_src ( struct rtnl_rule *  rule,
struct nl_addr *  src 
)

Definition at line 783 of file rule.c.

784{
785 return __assign_addr(rule, &rule->r_src, src, &rule->r_src_len,
786 RULE_ATTR_SRC | RULE_ATTR_SRC_LEN);
787}

◆ rtnl_rule_get_src()

struct nl_addr * rtnl_rule_get_src ( struct rtnl_rule *  rule)

Definition at line 789 of file rule.c.

790{
791 if (rule->ce_mask & RULE_ATTR_SRC)
792 return rule->r_src;
793 else
794 return NULL;
795}

◆ rtnl_rule_set_dst()

int rtnl_rule_set_dst ( struct rtnl_rule *  rule,
struct nl_addr *  dst 
)

Definition at line 797 of file rule.c.

798{
799 return __assign_addr(rule, &rule->r_dst, dst, &rule->r_dst_len,
800 RULE_ATTR_DST | RULE_ATTR_DST_LEN);
801}

◆ rtnl_rule_get_dst()

struct nl_addr * rtnl_rule_get_dst ( struct rtnl_rule *  rule)

Definition at line 803 of file rule.c.

804{
805 if (rule->ce_mask & RULE_ATTR_DST)
806 return rule->r_dst;
807 else
808 return NULL;
809}

◆ rtnl_rule_set_iif()

int rtnl_rule_set_iif ( struct rtnl_rule *  rule,
const char *  dev 
)

Definition at line 811 of file rule.c.

812{
813 if (strlen(dev) > IFNAMSIZ-1)
814 return nl_errno(ERANGE);
815
816 strcpy(rule->r_iif, dev);
817 rule->ce_mask |= RULE_ATTR_IIF;
818 return 0;
819}

◆ rtnl_rule_get_iif()

char * rtnl_rule_get_iif ( struct rtnl_rule *  rule)

Definition at line 821 of file rule.c.

822{
823 if (rule->ce_mask & RULE_ATTR_IIF)
824 return rule->r_iif;
825 else
826 return NULL;
827}

◆ rtnl_rule_set_action()

void rtnl_rule_set_action ( struct rtnl_rule *  rule,
int  type 
)

Definition at line 829 of file rule.c.

830{
831 rule->r_type = type;
832 rule->ce_mask |= RULE_ATTR_TYPE;
833}

◆ rtnl_rule_get_action()

int rtnl_rule_get_action ( struct rtnl_rule *  rule)

Definition at line 835 of file rule.c.

836{
837 if (rule->ce_mask & RULE_ATTR_TYPE)
838 return rule->r_type;
839 else
840 return nl_errno(ENOENT);
841}

◆ rtnl_rule_set_realms()

void rtnl_rule_set_realms ( struct rtnl_rule *  rule,
realm_t  realms 
)

Definition at line 843 of file rule.c.

844{
845 rule->r_realms = realms;
846 rule->ce_mask |= RULE_ATTR_REALMS;
847}

◆ rtnl_rule_get_realms()

realm_t rtnl_rule_get_realms ( struct rtnl_rule *  rule)

Definition at line 849 of file rule.c.

850{
851 if (rule->ce_mask & RULE_ATTR_REALMS)
852 return rule->r_realms;
853 else
854 return 0;
855}