📄 rtnetlink.h
字号:
union { struct { __u16 sport; __u16 dport; } ports; struct { __u8 type; __u8 code; __u16 ident; } icmpt; __u32 spi; } u;};/**** * General form of address family dependent message. ****/struct rtgenmsg{ unsigned char rtgen_family;};/***************************************************************** * Link layer specific messages. ****//* struct ifinfomsg * passes link level specific information, not dependent * on network protocol. */struct ifinfomsg{ unsigned char ifi_family; unsigned char __ifi_pad; unsigned short ifi_type; /* ARPHRD_* */ int ifi_index; /* Link index */ unsigned ifi_flags; /* IFF_* flags */ unsigned ifi_change; /* IFF_* change mask */};/******************************************************************** * prefix information ****/struct prefixmsg{ unsigned char prefix_family; unsigned char prefix_pad1; unsigned short prefix_pad2; int prefix_ifindex; unsigned char prefix_type; unsigned char prefix_len; unsigned char prefix_flags; unsigned char prefix_pad3;};enum { PREFIX_UNSPEC, PREFIX_ADDRESS, PREFIX_CACHEINFO, __PREFIX_MAX};#define PREFIX_MAX (__PREFIX_MAX - 1)struct prefix_cacheinfo{ __u32 preferred_time; __u32 valid_time;};/***************************************************************** * Traffic control messages. ****/struct tcmsg{ unsigned char tcm_family; unsigned char tcm__pad1; unsigned short tcm__pad2; int tcm_ifindex; __u32 tcm_handle; __u32 tcm_parent; __u32 tcm_info;};enum{ TCA_UNSPEC, TCA_KIND, TCA_OPTIONS, TCA_STATS, TCA_XSTATS, TCA_RATE, TCA_FCNT, TCA_STATS2, __TCA_MAX};#define TCA_MAX (__TCA_MAX - 1)#define TCA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct tcmsg))))#define TCA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct tcmsg))#ifndef __KERNEL__/* RTnetlink multicast groups - backwards compatibility for userspace */#define RTMGRP_LINK 1#define RTMGRP_NOTIFY 2#define RTMGRP_NEIGH 4#define RTMGRP_TC 8#define RTMGRP_IPV4_IFADDR 0x10#define RTMGRP_IPV4_MROUTE 0x20#define RTMGRP_IPV4_ROUTE 0x40#define RTMGRP_IPV4_RULE 0x80#define RTMGRP_IPV6_IFADDR 0x100#define RTMGRP_IPV6_MROUTE 0x200#define RTMGRP_IPV6_ROUTE 0x400#define RTMGRP_IPV6_IFINFO 0x800#define RTMGRP_DECnet_IFADDR 0x1000#define RTMGRP_DECnet_ROUTE 0x4000#define RTMGRP_IPV6_PREFIX 0x20000#endif/* RTnetlink multicast groups */enum rtnetlink_groups { RTNLGRP_NONE,#define RTNLGRP_NONE RTNLGRP_NONE RTNLGRP_LINK,#define RTNLGRP_LINK RTNLGRP_LINK RTNLGRP_NOTIFY,#define RTNLGRP_NOTIFY RTNLGRP_NOTIFY RTNLGRP_NEIGH,#define RTNLGRP_NEIGH RTNLGRP_NEIGH RTNLGRP_TC,#define RTNLGRP_TC RTNLGRP_TC RTNLGRP_IPV4_IFADDR,#define RTNLGRP_IPV4_IFADDR RTNLGRP_IPV4_IFADDR RTNLGRP_IPV4_MROUTE,#define RTNLGRP_IPV4_MROUTE RTNLGRP_IPV4_MROUTE RTNLGRP_IPV4_ROUTE,#define RTNLGRP_IPV4_ROUTE RTNLGRP_IPV4_ROUTE RTNLGRP_IPV4_RULE,#define RTNLGRP_IPV4_RULE RTNLGRP_IPV4_RULE RTNLGRP_IPV6_IFADDR,#define RTNLGRP_IPV6_IFADDR RTNLGRP_IPV6_IFADDR RTNLGRP_IPV6_MROUTE,#define RTNLGRP_IPV6_MROUTE RTNLGRP_IPV6_MROUTE RTNLGRP_IPV6_ROUTE,#define RTNLGRP_IPV6_ROUTE RTNLGRP_IPV6_ROUTE RTNLGRP_IPV6_IFINFO,#define RTNLGRP_IPV6_IFINFO RTNLGRP_IPV6_IFINFO RTNLGRP_DECnet_IFADDR,#define RTNLGRP_DECnet_IFADDR RTNLGRP_DECnet_IFADDR RTNLGRP_NOP2, RTNLGRP_DECnet_ROUTE,#define RTNLGRP_DECnet_ROUTE RTNLGRP_DECnet_ROUTE RTNLGRP_DECnet_RULE,#define RTNLGRP_DECnet_RULE RTNLGRP_DECnet_RULE RTNLGRP_NOP4, RTNLGRP_IPV6_PREFIX,#define RTNLGRP_IPV6_PREFIX RTNLGRP_IPV6_PREFIX RTNLGRP_IPV6_RULE,#define RTNLGRP_IPV6_RULE RTNLGRP_IPV6_RULE __RTNLGRP_MAX};#define RTNLGRP_MAX (__RTNLGRP_MAX - 1)/* TC action piece */struct tcamsg{ unsigned char tca_family; unsigned char tca__pad1; unsigned short tca__pad2;};#define TA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct tcamsg))))#define TA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct tcamsg))#define TCA_ACT_TAB 1 /* attr type must be >=1 */ #define TCAA_MAX 1/* End of information exported to user level */#ifdef __KERNEL__#include <linux/mutex.h>extern size_t rtattr_strlcpy(char *dest, const struct rtattr *rta, size_t size);static __inline__ int rtattr_strcmp(const struct rtattr *rta, const char *str){ int len = strlen(str) + 1; return len > rta->rta_len || memcmp(RTA_DATA(rta), str, len);}extern int rtattr_parse(struct rtattr *tb[], int maxattr, struct rtattr *rta, int len);#define rtattr_parse_nested(tb, max, rta) \ rtattr_parse((tb), (max), RTA_DATA((rta)), RTA_PAYLOAD((rta)))struct rtnetlink_link{ int (*doit)(struct sk_buff *, struct nlmsghdr*, void *attr); int (*dumpit)(struct sk_buff *, struct netlink_callback *cb);};extern struct rtnetlink_link * rtnetlink_links[NPROTO];extern int rtnetlink_send(struct sk_buff *skb, u32 pid, u32 group, int echo);extern int rtnl_unicast(struct sk_buff *skb, u32 pid);extern int rtnl_notify(struct sk_buff *skb, u32 pid, u32 group, struct nlmsghdr *nlh, gfp_t flags);extern void rtnl_set_sk_err(u32 group, int error);extern int rtnetlink_put_metrics(struct sk_buff *skb, u32 *metrics);extern int rtnl_put_cacheinfo(struct sk_buff *skb, struct dst_entry *dst, u32 id, u32 ts, u32 tsage, long expires, u32 error);extern void __rta_fill(struct sk_buff *skb, int attrtype, int attrlen, const void *data);#define RTA_PUT(skb, attrtype, attrlen, data) \({ if (unlikely(skb_tailroom(skb) < (int)RTA_SPACE(attrlen))) \ goto rtattr_failure; \ __rta_fill(skb, attrtype, attrlen, data); }) #define RTA_APPEND(skb, attrlen, data) \({ if (unlikely(skb_tailroom(skb) < (int)(attrlen))) \ goto rtattr_failure; \ memcpy(skb_put(skb, attrlen), data, attrlen); })#define RTA_PUT_NOHDR(skb, attrlen, data) \({ RTA_APPEND(skb, RTA_ALIGN(attrlen), data); \ memset(skb->tail - (RTA_ALIGN(attrlen) - attrlen), 0, \ RTA_ALIGN(attrlen) - attrlen); })#define RTA_PUT_U8(skb, attrtype, value) \({ u8 _tmp = (value); \ RTA_PUT(skb, attrtype, sizeof(u8), &_tmp); })#define RTA_PUT_U16(skb, attrtype, value) \({ u16 _tmp = (value); \ RTA_PUT(skb, attrtype, sizeof(u16), &_tmp); })#define RTA_PUT_U32(skb, attrtype, value) \({ u32 _tmp = (value); \ RTA_PUT(skb, attrtype, sizeof(u32), &_tmp); })#define RTA_PUT_U64(skb, attrtype, value) \({ u64 _tmp = (value); \ RTA_PUT(skb, attrtype, sizeof(u64), &_tmp); })#define RTA_PUT_SECS(skb, attrtype, value) \ RTA_PUT_U64(skb, attrtype, (value) / HZ)#define RTA_PUT_MSECS(skb, attrtype, value) \ RTA_PUT_U64(skb, attrtype, jiffies_to_msecs(value))#define RTA_PUT_STRING(skb, attrtype, value) \ RTA_PUT(skb, attrtype, strlen(value) + 1, value)#define RTA_PUT_FLAG(skb, attrtype) \ RTA_PUT(skb, attrtype, 0, NULL);#define RTA_NEST(skb, type) \({ struct rtattr *__start = (struct rtattr *) (skb)->tail; \ RTA_PUT(skb, type, 0, NULL); \ __start; })#define RTA_NEST_END(skb, start) \({ (start)->rta_len = ((skb)->tail - (unsigned char *) (start)); \ (skb)->len; })#define RTA_NEST_CANCEL(skb, start) \({ if (start) \ skb_trim(skb, (unsigned char *) (start) - (skb)->data); \ -1; })#define RTA_GET_U8(rta) \({ if (!rta || RTA_PAYLOAD(rta) < sizeof(u8)) \ goto rtattr_failure; \ *(u8 *) RTA_DATA(rta); })#define RTA_GET_U16(rta) \({ if (!rta || RTA_PAYLOAD(rta) < sizeof(u16)) \ goto rtattr_failure; \ *(u16 *) RTA_DATA(rta); })#define RTA_GET_U32(rta) \({ if (!rta || RTA_PAYLOAD(rta) < sizeof(u32)) \ goto rtattr_failure; \ *(u32 *) RTA_DATA(rta); })#define RTA_GET_U64(rta) \({ u64 _tmp; \ if (!rta || RTA_PAYLOAD(rta) < sizeof(u64)) \ goto rtattr_failure; \ memcpy(&_tmp, RTA_DATA(rta), sizeof(_tmp)); \ _tmp; })#define RTA_GET_FLAG(rta) (!!(rta))#define RTA_GET_SECS(rta) ((unsigned long) RTA_GET_U64(rta) * HZ)#define RTA_GET_MSECS(rta) (msecs_to_jiffies((unsigned long) RTA_GET_U64(rta))) static inline struct rtattr *__rta_reserve(struct sk_buff *skb, int attrtype, int attrlen){ struct rtattr *rta; int size = RTA_LENGTH(attrlen); rta = (struct rtattr*)skb_put(skb, RTA_ALIGN(size)); rta->rta_type = attrtype; rta->rta_len = size; memset(RTA_DATA(rta) + attrlen, 0, RTA_ALIGN(size) - size); return rta;}#define __RTA_PUT(skb, attrtype, attrlen) \({ if (unlikely(skb_tailroom(skb) < (int)RTA_SPACE(attrlen))) \ goto rtattr_failure; \ __rta_reserve(skb, attrtype, attrlen); })extern void rtmsg_ifinfo(int type, struct net_device *dev, unsigned change);/* RTNL is used as a global lock for all changes to network configuration */extern void rtnl_lock(void);extern void rtnl_unlock(void);extern int rtnl_trylock(void);extern void rtnetlink_init(void);extern void __rtnl_unlock(void);#define ASSERT_RTNL() do { \ if (unlikely(rtnl_trylock())) { \ rtnl_unlock(); \ printk(KERN_ERR "RTNL: assertion failed at %s (%d)\n", \ __FILE__, __LINE__); \ dump_stack(); \ } \} while(0)#define BUG_TRAP(x) do { \ if (unlikely(!(x))) { \ printk(KERN_ERR "KERNEL: assertion (%s) failed at %s (%d)\n", \ #x, __FILE__ , __LINE__); \ } \} while(0)static inline u32 rtm_get_table(struct rtattr **rta, u8 table){ return RTA_GET_U32(rta[RTA_TABLE-1]);rtattr_failure: return table;}#endif /* __KERNEL__ */#endif /* __LINUX_RTNETLINK_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -