The address may not contain a prefix length if the peer address has been specified already.
// Allocate an empty address object to be filled out with the attributes // of the new address. struct rtnl_addr *addr = rtnl_addr_alloc(); // Fill out the mandatory attributes of the new address. Setting the // local address will automatically set the address family and the // prefix length to the correct values. rtnl_addr_set_ifindex(addr, ifindex); rtnl_addr_set_local(addr, local_addr); // The label of the address can be specified, currently only supported // by IPv4 and DECnet. rtnl_addr_set_label(addr, "mylabel"); // The peer address can be specified if necessary, in either case a peer // address will be sent to the kernel in order to fullfil the interface // requirements. If none is set, it will equal the local address. // Note: Real peer addresses are only supported by IPv4 for now. rtnl_addr_set_peer(addr, peer_addr); // In case you want to have the address have a scope other than global // it may be overwritten using rtnl_addr_set_scope(). The scope currently // cannot be set for IPv6 addresses. rtnl_addr_set_scope(addr, rtnl_str2scope("site")); // Broadcast and anycast address may be specified using the relevant // functions, the address family will be verified if one of the other // addresses has been set already. Currently only works for IPv4. rtnl_addr_set_broadcast(addr, broadcast_addr); rtnl_addr_set_anycast(addr, anycast_addr); // Build the netlink message and send it to the kernel, the operation will // block until the operation has been completed. Alternatively the required // netlink message can be built using rtnl_addr_build_add_request() to be // sent out using nl_send_auto_complete(). rtnl_addr_add(handle, addr, 0); // Free the memory rtnl_addr_put(addr);
// Allocate an empty address object to be filled out with the attributes // matching the address to be deleted. Alternatively a fully equipped // address object out of a cache can be used instead. struct rtnl_addr *addr = rtnl_addr_alloc(); // The only mandatory parameter besides the address family is the interface // index the address is on, i.e. leaving out all other parameters will // result in all addresses of the specified address family interface tuple // to be deleted. rtnl_addr_set_ifindex(addr, ifindex); // Specyfing the address family manually is only required if neither the // local nor peer address have been specified. rtnl_addr_set_family(addr, AF_INET); // Specyfing the local address is optional but the best choice to delete // specific addresses. rtnl_addr_set_local(addr, local_addr); // The label of the address can be specified, currently only supported // by IPv4 and DECnet. rtnl_addr_set_label(addr, "mylabel"); // The peer address can be specified if necessary, in either case a peer // address will be sent to the kernel in order to fullfil the interface // requirements. If none is set, it will equal the local address. // Note: Real peer addresses are only supported by IPv4 for now. rtnl_addr_set_peer(addr, peer_addr); // Build the netlink message and send it to the kernel, the operation will // block until the operation has been completed. Alternatively the required // netlink message can be built using rtnl_addr_build_delete_request() // to be sent out using nl_send_auto_complete(). rtnl_addr_delete(handle, addr, 0); // Free the memory rtnl_addr_put(addr);
Allocation/Freeing | |
rtnl_addr * | rtnl_addr_alloc (void) |
void | rtnl_addr_put (struct rtnl_addr *addr) |
Cache Management | |
nl_cache * | rtnl_addr_alloc_cache (struct nl_handle *handle) |
Addition | |
nl_msg * | rtnl_addr_build_add_request (struct rtnl_addr *addr, int flags) |
Build netlink request message to request addition of new address. | |
int | rtnl_addr_add (struct nl_handle *handle, struct rtnl_addr *addr, int flags) |
Request addition of new address. | |
Deletion | |
nl_msg * | rtnl_addr_build_delete_request (struct rtnl_addr *addr, int flags) |
Build a netlink request message to request deletion of an address. | |
int | rtnl_addr_delete (struct nl_handle *handle, struct rtnl_addr *addr, int flags) |
Request deletion of an address. | |
Attributes | |
void | rtnl_addr_set_label (struct rtnl_addr *addr, const char *label) |
char * | rtnl_addr_get_label (struct rtnl_addr *addr) |
void | rtnl_addr_set_ifindex (struct rtnl_addr *addr, int ifindex) |
int | rtnl_addr_get_ifindex (struct rtnl_addr *addr) |
void | rtnl_addr_set_family (struct rtnl_addr *addr, int family) |
int | rtnl_addr_get_family (struct rtnl_addr *addr) |
void | rtnl_addr_set_prefixlen (struct rtnl_addr *addr, int prefix) |
int | rtnl_addr_get_prefixlen (struct rtnl_addr *addr) |
void | rtnl_addr_set_scope (struct rtnl_addr *addr, int scope) |
int | rtnl_addr_get_scope (struct rtnl_addr *addr) |
void | rtnl_addr_set_flags (struct rtnl_addr *addr, unsigned int flags) |
void | rtnl_addr_unset_flags (struct rtnl_addr *addr, unsigned int flags) |
unsigned int | rtnl_addr_get_flags (struct rtnl_addr *addr) |
int | rtnl_addr_set_local (struct rtnl_addr *addr, struct nl_addr *local) |
nl_addr * | rtnl_addr_get_local (struct rtnl_addr *addr) |
int | rtnl_addr_set_peer (struct rtnl_addr *addr, struct nl_addr *peer) |
nl_addr * | rtnl_addr_get_peer (struct rtnl_addr *addr) |
int | rtnl_addr_set_broadcast (struct rtnl_addr *addr, struct nl_addr *bcast) |
nl_addr * | rtnl_addr_get_broadcast (struct rtnl_addr *addr) |
int | rtnl_addr_set_anycast (struct rtnl_addr *addr, struct nl_addr *anycast) |
nl_addr * | rtnl_addr_get_anycast (struct rtnl_addr *addr) |
int | rtnl_addr_set_multicast (struct rtnl_addr *addr, struct nl_addr *multicast) |
nl_addr * | rtnl_addr_get_multicast (struct rtnl_addr *addr) |
Flags Translations | |
char * | rtnl_addr_flags2str (int flags, char *buf, size_t size) |
int | rtnl_addr_str2flags (const char *name) |
struct nl_msg* rtnl_addr_build_add_request | ( | struct rtnl_addr * | addr, | |
int | flags | |||
) |
addr | Address object representing the new address. | |
flags | Additional netlink message flags. |
Minimal required attributes:
The scope will default to universe except for loopback addresses in which case a host scope is used if not specified otherwise.
Definition at line 737 of file addr.c.
References NLM_F_CREATE.
Referenced by rtnl_addr_add().
00738 { 00739 int required = ADDR_ATTR_IFINDEX | ADDR_ATTR_FAMILY | 00740 ADDR_ATTR_PREFIXLEN | ADDR_ATTR_LOCAL; 00741 00742 if ((addr->ce_mask & required) != required) { 00743 nl_error(EINVAL, "Missing mandatory attributes, required are: " 00744 "ifindex, family, prefixlen, local address."); 00745 return NULL; 00746 } 00747 00748 return build_addr_msg(addr, RTM_NEWADDR, NLM_F_CREATE | flags); 00749 }
int rtnl_addr_add | ( | struct nl_handle * | handle, | |
struct rtnl_addr * | addr, | |||
int | flags | |||
) |
handle | Netlink handle. | |
addr | Address object representing the new address. | |
flags | Additional netlink message flags. |
Definition at line 765 of file addr.c.
References nl_get_errno(), nl_send_auto_complete(), nl_wait_for_ack(), nlmsg_free(), and rtnl_addr_build_add_request().
00766 { 00767 struct nl_msg *msg; 00768 int err; 00769 00770 msg = rtnl_addr_build_add_request(addr, flags); 00771 if (!msg) 00772 return nl_get_errno(); 00773 00774 err = nl_send_auto_complete(handle, msg); 00775 nlmsg_free(msg); 00776 if (err < 0) 00777 return err; 00778 00779 return nl_wait_for_ack(handle); 00780 }
struct nl_msg* rtnl_addr_build_delete_request | ( | struct rtnl_addr * | addr, | |
int | flags | |||
) |
addr | Address object to be deleteted. | |
flags | Additional netlink message flags. |
Minimal required attributes:
Optional attributes:
Definition at line 811 of file addr.c.
Referenced by rtnl_addr_delete().
00812 { 00813 int required = ADDR_ATTR_IFINDEX | ADDR_ATTR_FAMILY; 00814 00815 if ((addr->ce_mask & required) != required) { 00816 nl_error(EINVAL, "Missing mandatory attributes, required are: " 00817 "ifindex, family"); 00818 return NULL; 00819 } 00820 00821 return build_addr_msg(addr, RTM_DELADDR, flags); 00822 }
int rtnl_addr_delete | ( | struct nl_handle * | handle, | |
struct rtnl_addr * | addr, | |||
int | flags | |||
) |
handle | Netlink handle. | |
addr | Address object to be deleted. | |
flags | Additional netlink message flags. |
Definition at line 838 of file addr.c.
References nl_get_errno(), nl_send_auto_complete(), nl_wait_for_ack(), nlmsg_free(), and rtnl_addr_build_delete_request().
00840 { 00841 struct nl_msg *msg; 00842 int err; 00843 00844 msg = rtnl_addr_build_delete_request(addr, flags); 00845 if (!msg) 00846 return nl_get_errno(); 00847 00848 err = nl_send_auto_complete(handle, msg); 00849 nlmsg_free(msg); 00850 if (err < 0) 00851 return err; 00852 00853 return nl_wait_for_ack(handle); 00854 }