netlink.h raw

   1  #include <stdint.h>
   2  
   3  /* linux/netlink.h */
   4  
   5  #define NETLINK_ROUTE 0
   6  
   7  struct nlmsghdr {
   8  	uint32_t	nlmsg_len;
   9  	uint16_t	nlmsg_type;
  10  	uint16_t	nlmsg_flags;
  11  	uint32_t	nlmsg_seq;
  12  	uint32_t	nlmsg_pid;
  13  };
  14  
  15  #define NLM_F_REQUEST	1
  16  #define NLM_F_MULTI	2
  17  #define NLM_F_ACK	4
  18  
  19  #define NLM_F_ROOT	0x100
  20  #define NLM_F_MATCH	0x200
  21  #define NLM_F_ATOMIC	0x400
  22  #define NLM_F_DUMP	(NLM_F_ROOT|NLM_F_MATCH)
  23  
  24  #define NLMSG_NOOP	0x1
  25  #define NLMSG_ERROR	0x2
  26  #define NLMSG_DONE	0x3
  27  #define NLMSG_OVERRUN	0x4
  28  
  29  /* linux/rtnetlink.h */
  30  
  31  #define RTM_NEWLINK	16
  32  #define RTM_GETLINK	18
  33  #define RTM_NEWADDR	20
  34  #define RTM_GETADDR	22
  35  
  36  struct rtattr {
  37  	unsigned short	rta_len;
  38  	unsigned short	rta_type;
  39  };
  40  
  41  struct rtgenmsg {
  42  	unsigned char	rtgen_family;
  43  };
  44  
  45  struct ifinfomsg {
  46  	unsigned char	ifi_family;
  47  	unsigned char	__ifi_pad;
  48  	unsigned short	ifi_type;
  49  	int		ifi_index;
  50  	unsigned	ifi_flags;
  51  	unsigned	ifi_change;
  52  };
  53  
  54  /* linux/if_link.h */
  55  
  56  #define IFLA_ADDRESS	1
  57  #define IFLA_BROADCAST	2
  58  #define IFLA_IFNAME	3
  59  #define IFLA_STATS	7
  60  
  61  /* linux/if_addr.h */
  62  
  63  struct ifaddrmsg {
  64  	uint8_t		ifa_family;
  65  	uint8_t		ifa_prefixlen;
  66  	uint8_t		ifa_flags;
  67  	uint8_t		ifa_scope;
  68  	uint32_t	ifa_index;
  69  };
  70  
  71  #define IFA_ADDRESS	1
  72  #define IFA_LOCAL	2
  73  #define IFA_LABEL	3
  74  #define IFA_BROADCAST	4
  75  
  76  /* musl */
  77  
  78  #define NETLINK_ALIGN(len)	(((len)+3) & ~3)
  79  #define NLMSG_DATA(nlh)		((void*)((char*)(nlh)+sizeof(struct nlmsghdr)))
  80  #define NLMSG_DATALEN(nlh)	((nlh)->nlmsg_len-sizeof(struct nlmsghdr))
  81  #define NLMSG_DATAEND(nlh)	((char*)(nlh)+(nlh)->nlmsg_len)
  82  #define NLMSG_NEXT(nlh)		(struct nlmsghdr*)((char*)(nlh)+NETLINK_ALIGN((nlh)->nlmsg_len))
  83  #define NLMSG_OK(nlh,end)	((char*)(end)-(char*)(nlh) >= sizeof(struct nlmsghdr))
  84  
  85  #define RTA_DATA(rta)		((void*)((char*)(rta)+sizeof(struct rtattr)))
  86  #define RTA_DATALEN(rta)	((rta)->rta_len-sizeof(struct rtattr))
  87  #define RTA_DATAEND(rta)	((char*)(rta)+(rta)->rta_len)
  88  #define RTA_NEXT(rta)		(struct rtattr*)((char*)(rta)+NETLINK_ALIGN((rta)->rta_len))
  89  #define RTA_OK(nlh,end)		((char*)(end)-(char*)(rta) >= sizeof(struct rtattr))
  90  
  91  #define NLMSG_RTA(nlh,len)	((void*)((char*)(nlh)+sizeof(struct nlmsghdr)+NETLINK_ALIGN(len)))
  92  #define NLMSG_RTAOK(rta,nlh)	RTA_OK(rta,NLMSG_DATAEND(nlh))
  93  
  94  hidden int __rtnetlink_enumerate(int link_af, int addr_af, int (*cb)(void *ctx, struct nlmsghdr *h), void *ctx);
  95