libnl  1.1.4

Allocation/Freeing

struct rtnl_addr * rtnl_addr_alloc (void)
 
void rtnl_addr_put (struct rtnl_addr *addr)
 

Cache Management

struct nl_cache * rtnl_addr_alloc_cache (struct nl_handle *handle)
 

Addition

struct nl_msg * rtnl_addr_build_add_request (struct rtnl_addr *addr, int flags)
 Build netlink request message to request addition of new address. More...
 
int rtnl_addr_add (struct nl_handle *handle, struct rtnl_addr *addr, int flags)
 Request addition of new address. More...
 

Deletion

struct nl_msg * rtnl_addr_build_delete_request (struct rtnl_addr *addr, int flags)
 Build a netlink request message to request deletion of an address. More...
 
int rtnl_addr_delete (struct nl_handle *handle, struct rtnl_addr *addr, int flags)
 Request deletion of an address. More...
 

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)
 
struct nl_addr * rtnl_addr_get_local (struct rtnl_addr *addr)
 
int rtnl_addr_set_peer (struct rtnl_addr *addr, struct nl_addr *peer)
 
struct nl_addr * rtnl_addr_get_peer (struct rtnl_addr *addr)
 
int rtnl_addr_set_broadcast (struct rtnl_addr *addr, struct nl_addr *bcast)
 
struct nl_addr * rtnl_addr_get_broadcast (struct rtnl_addr *addr)
 
int rtnl_addr_set_anycast (struct rtnl_addr *addr, struct nl_addr *anycast)
 
struct nl_addr * rtnl_addr_get_anycast (struct rtnl_addr *addr)
 
int rtnl_addr_set_multicast (struct rtnl_addr *addr, struct nl_addr *multicast)
 
struct 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)
 

Detailed Description

Note
The maximum size of an address label is IFNAMSIZ.
The address may not contain a prefix length if the peer address has been specified already.
1) Address Addition
* // 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);
*
2) Address Deletion
* // 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);
*

Function Documentation

struct nl_msg* rtnl_addr_build_add_request ( struct rtnl_addr *  addr,
int  flags 
)
Parameters
addrAddress object representing the new address.
flagsAdditional netlink message flags.

Builds a new netlink message requesting the addition of a new address. 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.

Minimal required attributes:

  • interface index (rtnl_addr_set_ifindex())
  • local address (rtnl_addr_set_local())

The scope will default to universe except for loopback addresses in which case a host scope is used if not specified otherwise.

Note
Free the memory after usage using nlmsg_free().
Returns
Newly allocated netlink message or NULL if an error occured.

Definition at line 737 of file addr.c.

References NLM_F_CREATE.

Referenced by rtnl_addr_add().

738 {
739  int required = ADDR_ATTR_IFINDEX | ADDR_ATTR_FAMILY |
740  ADDR_ATTR_PREFIXLEN | ADDR_ATTR_LOCAL;
741 
742  if ((addr->ce_mask & required) != required) {
743  nl_error(EINVAL, "Missing mandatory attributes, required are: "
744  "ifindex, family, prefixlen, local address.");
745  return NULL;
746  }
747 
748  return build_addr_msg(addr, RTM_NEWADDR, NLM_F_CREATE | flags);
749 }
#define NLM_F_CREATE
Create config object if it doesn't already exist.
int rtnl_addr_add ( struct nl_handle *  handle,
struct rtnl_addr *  addr,
int  flags 
)
Parameters
handleNetlink handle.
addrAddress object representing the new address.
flagsAdditional netlink message flags.

Builds a netlink message by calling rtnl_addr_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.

See Also
rtnl_addr_build_add_request()
Returns
0 on sucess or a negative error if an error occured.

Definition at line 765 of file addr.c.

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

766 {
767  struct nl_msg *msg;
768  int err;
769 
770  msg = rtnl_addr_build_add_request(addr, flags);
771  if (!msg)
772  return nl_get_errno();
773 
774  err = nl_send_auto_complete(handle, msg);
775  nlmsg_free(msg);
776  if (err < 0)
777  return err;
778 
779  return nl_wait_for_ack(handle);
780 }
struct nl_msg * rtnl_addr_build_add_request(struct rtnl_addr *addr, int flags)
Build netlink request message to request addition of new address.
Definition: addr.c:737
int nl_wait_for_ack(struct nl_handle *handle)
Wait for ACK.
Definition: nl.c:801
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 &amp; extend header values as needed.
Definition: nl.c:373
struct nl_msg* rtnl_addr_build_delete_request ( struct rtnl_addr *  addr,
int  flags 
)
Parameters
addrAddress object to be deleteted.
flagsAdditional netlink message flags.

Builds a new netlink message requesting a deletion of an address. 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.

Minimal required attributes:

  • interface index (rtnl_addr_set_ifindex())
  • address family (rtnl_addr_set_family())

Optional attributes:

  • local address (rtnl_addr_set_local())
  • label (rtnl_addr_set_label(), IPv4/DECnet only)
  • peer address (rtnl_addr_set_peer(), IPv4 only)
Note
Free the memory after usage using nlmsg_free().
Returns
Newly allocated netlink message or NULL if an error occured.

Definition at line 811 of file addr.c.

Referenced by rtnl_addr_delete().

812 {
813  int required = ADDR_ATTR_IFINDEX | ADDR_ATTR_FAMILY;
814 
815  if ((addr->ce_mask & required) != required) {
816  nl_error(EINVAL, "Missing mandatory attributes, required are: "
817  "ifindex, family");
818  return NULL;
819  }
820 
821  return build_addr_msg(addr, RTM_DELADDR, flags);
822 }
int rtnl_addr_delete ( struct nl_handle *  handle,
struct rtnl_addr *  addr,
int  flags 
)
Parameters
handleNetlink handle.
addrAddress object to be deleted.
flagsAdditional netlink message flags.

Builds a netlink message by calling rtnl_addr_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.

See Also
rtnl_addr_build_delete_request();
Returns
0 on sucess or a negative error if an error occured.

Definition at line 838 of file addr.c.

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

840 {
841  struct nl_msg *msg;
842  int err;
843 
844  msg = rtnl_addr_build_delete_request(addr, flags);
845  if (!msg)
846  return nl_get_errno();
847 
848  err = nl_send_auto_complete(handle, msg);
849  nlmsg_free(msg);
850  if (err < 0)
851  return err;
852 
853  return nl_wait_for_ack(handle);
854 }
struct nl_msg * rtnl_addr_build_delete_request(struct rtnl_addr *addr, int flags)
Build a netlink request message to request deletion of an address.
Definition: addr.c:811
int nl_wait_for_ack(struct nl_handle *handle)
Wait for ACK.
Definition: nl.c:801
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 &amp; extend header values as needed.
Definition: nl.c:373