⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtnetlink.h

📁 Axis 221 camera embedded programing interface
💻 H
📖 第 1 页 / 共 2 页
字号:
	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 + -