xfrm.h

来自「Linux Kernel 2.6.9 for OMAP1710」· C头文件 代码 · 共 913 行 · 第 1/2 页

H
913
字号
	default:		port = 0;	/*XXX*/	}	return port;}static inline int__xfrm4_selector_match(struct xfrm_selector *sel, struct flowi *fl){	return  addr_match(&fl->fl4_dst, &sel->daddr, sel->prefixlen_d) &&		addr_match(&fl->fl4_src, &sel->saddr, sel->prefixlen_s) &&		!((xfrm_flowi_dport(fl) ^ sel->dport) & sel->dport_mask) &&		!((xfrm_flowi_sport(fl) ^ sel->sport) & sel->sport_mask) &&		(fl->proto == sel->proto || !sel->proto) &&		(fl->oif == sel->ifindex || !sel->ifindex);}static inline int__xfrm6_selector_match(struct xfrm_selector *sel, struct flowi *fl){	return  addr_match(&fl->fl6_dst, &sel->daddr, sel->prefixlen_d) &&		addr_match(&fl->fl6_src, &sel->saddr, sel->prefixlen_s) &&		!((xfrm_flowi_dport(fl) ^ sel->dport) & sel->dport_mask) &&		!((xfrm_flowi_sport(fl) ^ sel->sport) & sel->sport_mask) &&		(fl->proto == sel->proto || !sel->proto) &&		(fl->oif == sel->ifindex || !sel->ifindex);}static inline intxfrm_selector_match(struct xfrm_selector *sel, struct flowi *fl,		    unsigned short family){	switch (family) {	case AF_INET:		return __xfrm4_selector_match(sel, fl);	case AF_INET6:		return __xfrm6_selector_match(sel, fl);	}	return 0;}/* A struct encoding bundle of transformations to apply to some set of flow. * * dst->child points to the next element of bundle. * dst->xfrm  points to an instanse of transformer. * * Due to unfortunate limitations of current routing cache, which we * have no time to fix, it mirrors struct rtable and bound to the same * routing key, including saddr,daddr. However, we can have many of * bundles differing by session id. All the bundles grow from a parent * policy rule. */struct xfrm_dst{	union {		struct xfrm_dst		*next;		struct dst_entry	dst;		struct rtable		rt;		struct rt6_info		rt6;	} u;};/* Decapsulation state, used by the input to store data during * decapsulation procedure, to be used later (during the policy * check */struct xfrm_decap_state {	char	decap_data[20];	__u16	decap_type;};   struct sec_decap_state {	struct xfrm_state	*xvec;	struct xfrm_decap_state decap;};struct sec_path{	atomic_t		refcnt;	int			len;	struct sec_decap_state	x[XFRM_MAX_DEPTH];};static inline struct sec_path *secpath_get(struct sec_path *sp){	if (sp)		atomic_inc(&sp->refcnt);	return sp;}extern void __secpath_destroy(struct sec_path *sp);static inline voidsecpath_put(struct sec_path *sp){	if (sp && atomic_dec_and_test(&sp->refcnt))		__secpath_destroy(sp);}extern struct sec_path *secpath_dup(struct sec_path *src);static inline voidsecpath_reset(struct sk_buff *skb){#ifdef CONFIG_XFRM	secpath_put(skb->sp);	skb->sp = NULL;#endif}static inline int__xfrm4_state_addr_cmp(struct xfrm_tmpl *tmpl, struct xfrm_state *x){	return	(tmpl->saddr.a4 &&		 tmpl->saddr.a4 != x->props.saddr.a4);}static inline int__xfrm6_state_addr_cmp(struct xfrm_tmpl *tmpl, struct xfrm_state *x){	return	(!ipv6_addr_any((struct in6_addr*)&tmpl->saddr) &&		 ipv6_addr_cmp((struct in6_addr *)&tmpl->saddr, (struct in6_addr*)&x->props.saddr));}static inline intxfrm_state_addr_cmp(struct xfrm_tmpl *tmpl, struct xfrm_state *x, unsigned short family){	switch (family) {	case AF_INET:		return __xfrm4_state_addr_cmp(tmpl, x);	case AF_INET6:		return __xfrm6_state_addr_cmp(tmpl, x);	}	return !0;}#ifdef CONFIG_XFRMextern int __xfrm_policy_check(struct sock *, int dir, struct sk_buff *skb, unsigned short family);static inline int xfrm_policy_check(struct sock *sk, int dir, struct sk_buff *skb, unsigned short family){	if (sk && sk->sk_policy[XFRM_POLICY_IN])		return __xfrm_policy_check(sk, dir, skb, family);			return	!xfrm_policy_list[dir] ||		(skb->dst->flags & DST_NOPOLICY) ||		__xfrm_policy_check(sk, dir, skb, family);}static inline int xfrm4_policy_check(struct sock *sk, int dir, struct sk_buff *skb){	return xfrm_policy_check(sk, dir, skb, AF_INET);}static inline int xfrm6_policy_check(struct sock *sk, int dir, struct sk_buff *skb){	return xfrm_policy_check(sk, dir, skb, AF_INET6);}extern int __xfrm_route_forward(struct sk_buff *skb, unsigned short family);static inline int xfrm_route_forward(struct sk_buff *skb, unsigned short family){	return	!xfrm_policy_list[XFRM_POLICY_OUT] ||		(skb->dst->flags & DST_NOXFRM) ||		__xfrm_route_forward(skb, family);}static inline int xfrm4_route_forward(struct sk_buff *skb){	return xfrm_route_forward(skb, AF_INET);}static inline int xfrm6_route_forward(struct sk_buff *skb){	return xfrm_route_forward(skb, AF_INET6);}extern int __xfrm_sk_clone_policy(struct sock *sk);static inline int xfrm_sk_clone_policy(struct sock *sk){	if (unlikely(sk->sk_policy[0] || sk->sk_policy[1]))		return __xfrm_sk_clone_policy(sk);	return 0;}extern void xfrm_policy_delete(struct xfrm_policy *pol, int dir);static inline void xfrm_sk_free_policy(struct sock *sk){	if (unlikely(sk->sk_policy[0] != NULL)) {		xfrm_policy_delete(sk->sk_policy[0], XFRM_POLICY_MAX);		sk->sk_policy[0] = NULL;	}	if (unlikely(sk->sk_policy[1] != NULL)) {		xfrm_policy_delete(sk->sk_policy[1], XFRM_POLICY_MAX+1);		sk->sk_policy[1] = NULL;	}}#elsestatic inline void xfrm_sk_free_policy(struct sock *sk) {}static inline int xfrm_sk_clone_policy(struct sock *sk) { return 0; }static inline int xfrm6_route_forward(struct sk_buff *skb) { return 1; }  static inline int xfrm4_route_forward(struct sk_buff *skb) { return 1; } static inline int xfrm6_policy_check(struct sock *sk, int dir, struct sk_buff *skb){ 	return 1; } static inline int xfrm4_policy_check(struct sock *sk, int dir, struct sk_buff *skb){	return 1;}static inline int xfrm_policy_check(struct sock *sk, int dir, struct sk_buff *skb, unsigned short family){	return 1;}#endifstatic __inline__xfrm_address_t *xfrm_flowi_daddr(struct flowi *fl, unsigned short family){	switch (family){	case AF_INET:		return (xfrm_address_t *)&fl->fl4_dst;	case AF_INET6:		return (xfrm_address_t *)&fl->fl6_dst;	}	return NULL;}static __inline__xfrm_address_t *xfrm_flowi_saddr(struct flowi *fl, unsigned short family){	switch (family){	case AF_INET:		return (xfrm_address_t *)&fl->fl4_src;	case AF_INET6:		return (xfrm_address_t *)&fl->fl6_src;	}	return NULL;}static __inline__ int__xfrm4_state_addr_check(struct xfrm_state *x,			 xfrm_address_t *daddr, xfrm_address_t *saddr){	if (daddr->a4 == x->id.daddr.a4 &&	    (saddr->a4 == x->props.saddr.a4 || !saddr->a4 || !x->props.saddr.a4))		return 1;	return 0;}static __inline__ int__xfrm6_state_addr_check(struct xfrm_state *x,			 xfrm_address_t *daddr, xfrm_address_t *saddr){	if (!ipv6_addr_cmp((struct in6_addr *)daddr, (struct in6_addr *)&x->id.daddr) &&	    (!ipv6_addr_cmp((struct in6_addr *)saddr, (struct in6_addr *)&x->props.saddr)|| 	     ipv6_addr_any((struct in6_addr *)saddr) || 	     ipv6_addr_any((struct in6_addr *)&x->props.saddr)))		return 1;	return 0;}static __inline__ intxfrm_state_addr_check(struct xfrm_state *x,		      xfrm_address_t *daddr, xfrm_address_t *saddr,		      unsigned short family){	switch (family) {	case AF_INET:		return __xfrm4_state_addr_check(x, daddr, saddr);	case AF_INET6:		return __xfrm6_state_addr_check(x, daddr, saddr);	}	return 0;}static inline int xfrm_state_kern(struct xfrm_state *x){	return atomic_read(&x->tunnel_users);}/* * xfrm algorithm information */struct xfrm_algo_auth_info {	u16 icv_truncbits;	u16 icv_fullbits;};struct xfrm_algo_encr_info {	u16 blockbits;	u16 defkeybits;};struct xfrm_algo_comp_info {	u16 threshold;};struct xfrm_algo_desc {	char *name;	u8 available:1;	union {		struct xfrm_algo_auth_info auth;		struct xfrm_algo_encr_info encr;		struct xfrm_algo_comp_info comp;	} uinfo;	struct sadb_alg desc;};/* XFRM tunnel handlers.  */struct xfrm_tunnel {	int (*handler)(struct sk_buff *skb);	void (*err_handler)(struct sk_buff *skb, void *info);};struct xfrm6_tunnel {	int (*handler)(struct sk_buff **pskb, unsigned int *nhoffp);	void (*err_handler)(struct sk_buff *skb, struct inet6_skb_parm *opt,			    int type, int code, int offset, __u32 info);};extern void xfrm_init(void);extern void xfrm4_init(void);extern void xfrm4_fini(void);extern void xfrm6_init(void);extern void xfrm6_fini(void);extern void xfrm_state_init(void);extern void xfrm4_state_init(void);extern void xfrm4_state_fini(void);extern void xfrm6_state_init(void);extern void xfrm6_state_fini(void);extern int xfrm_state_walk(u8 proto, int (*func)(struct xfrm_state *, int, void*), void *);extern struct xfrm_state *xfrm_state_alloc(void);extern struct xfrm_state *xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr, 					  struct flowi *fl, struct xfrm_tmpl *tmpl,					  struct xfrm_policy *pol, int *err,					  unsigned short family);extern int xfrm_state_check_expire(struct xfrm_state *x);extern void xfrm_state_insert(struct xfrm_state *x);extern int xfrm_state_add(struct xfrm_state *x);extern int xfrm_state_update(struct xfrm_state *x);extern int xfrm_state_check_space(struct xfrm_state *x, struct sk_buff *skb);extern struct xfrm_state *xfrm_state_lookup(xfrm_address_t *daddr, u32 spi, u8 proto, unsigned short family);extern struct xfrm_state *xfrm_find_acq_byseq(u32 seq);extern void xfrm_state_delete(struct xfrm_state *x);extern void xfrm_state_flush(u8 proto);extern int xfrm_replay_check(struct xfrm_state *x, u32 seq);extern void xfrm_replay_advance(struct xfrm_state *x, u32 seq);extern int xfrm_check_selectors(struct xfrm_state **x, int n, struct flowi *fl);extern int xfrm_state_check(struct xfrm_state *x, struct sk_buff *skb);extern int xfrm4_rcv(struct sk_buff *skb);extern int xfrm4_output(struct sk_buff **pskb);extern int xfrm4_tunnel_register(struct xfrm_tunnel *handler);extern int xfrm4_tunnel_deregister(struct xfrm_tunnel *handler);extern int xfrm6_rcv_spi(struct sk_buff **pskb, unsigned int *nhoffp, u32 spi);extern int xfrm6_rcv(struct sk_buff **pskb, unsigned int *nhoffp);extern int xfrm6_tunnel_register(struct xfrm6_tunnel *handler);extern int xfrm6_tunnel_deregister(struct xfrm6_tunnel *handler);extern u32 xfrm6_tunnel_alloc_spi(xfrm_address_t *saddr);extern void xfrm6_tunnel_free_spi(xfrm_address_t *saddr);extern u32 xfrm6_tunnel_spi_lookup(xfrm_address_t *saddr);extern int xfrm6_output(struct sk_buff **pskb);#ifdef CONFIG_XFRMextern int xfrm4_rcv_encap(struct sk_buff *skb, __u16 encap_type);extern int xfrm_user_policy(struct sock *sk, int optname, u8 __user *optval, int optlen);extern int xfrm_dst_lookup(struct xfrm_dst **dst, struct flowi *fl, unsigned short family);#elsestatic inline int xfrm_user_policy(struct sock *sk, int optname, u8 __user *optval, int optlen){ 	return -ENOPROTOOPT;} static inline int xfrm4_rcv_encap(struct sk_buff *skb, __u16 encap_type){ 	/* should not happen */ 	kfree_skb(skb);	return 0;}static inline int xfrm_dst_lookup(struct xfrm_dst **dst, struct flowi *fl, unsigned short family){	return -EINVAL;} #endifvoid xfrm_policy_init(void);struct xfrm_policy *xfrm_policy_alloc(int gfp);extern int xfrm_policy_walk(int (*func)(struct xfrm_policy *, int, int, void*), void *);int xfrm_policy_insert(int dir, struct xfrm_policy *policy, int excl);struct xfrm_policy *xfrm_policy_bysel(int dir, struct xfrm_selector *sel,				      int delete);struct xfrm_policy *xfrm_policy_byid(int dir, u32 id, int delete);void xfrm_policy_flush(void);u32 xfrm_get_acqseq(void);void xfrm_alloc_spi(struct xfrm_state *x, u32 minspi, u32 maxspi);struct xfrm_state * xfrm_find_acq(u8 mode, u32 reqid, u8 proto, 				  xfrm_address_t *daddr, xfrm_address_t *saddr, 				  int create, unsigned short family);extern void xfrm_policy_flush(void);extern void xfrm_policy_kill(struct xfrm_policy *);extern int xfrm_sk_policy_insert(struct sock *sk, int dir, struct xfrm_policy *pol);extern struct xfrm_policy *xfrm_sk_policy_lookup(struct sock *sk, int dir, struct flowi *fl);extern int xfrm_flush_bundles(void);extern wait_queue_head_t km_waitq;extern void km_state_expired(struct xfrm_state *x, int hard);extern int km_query(struct xfrm_state *x, struct xfrm_tmpl *, struct xfrm_policy *pol);extern int km_new_mapping(struct xfrm_state *x, xfrm_address_t *ipaddr, u16 sport);extern void km_policy_expired(struct xfrm_policy *pol, int dir, int hard);extern void xfrm_input_init(void);extern int xfrm_parse_spi(struct sk_buff *skb, u8 nexthdr, u32 *spi, u32 *seq);extern void xfrm_probe_algs(void);extern int xfrm_count_auth_supported(void);extern int xfrm_count_enc_supported(void);extern struct xfrm_algo_desc *xfrm_aalg_get_byidx(unsigned int idx);extern struct xfrm_algo_desc *xfrm_ealg_get_byidx(unsigned int idx);extern struct xfrm_algo_desc *xfrm_calg_get_byidx(unsigned int idx);extern struct xfrm_algo_desc *xfrm_aalg_get_byid(int alg_id);extern struct xfrm_algo_desc *xfrm_ealg_get_byid(int alg_id);extern struct xfrm_algo_desc *xfrm_calg_get_byid(int alg_id);extern struct xfrm_algo_desc *xfrm_aalg_get_byname(char *name);extern struct xfrm_algo_desc *xfrm_ealg_get_byname(char *name);extern struct xfrm_algo_desc *xfrm_calg_get_byname(char *name);struct crypto_tfm;typedef void (icv_update_fn_t)(struct crypto_tfm *, struct scatterlist *, unsigned int);extern void skb_icv_walk(const struct sk_buff *skb, struct crypto_tfm *tfm,			 int offset, int len, icv_update_fn_t icv_update);static inline int xfrm_addr_cmp(xfrm_address_t *a, xfrm_address_t *b,				int family){	switch (family) {	default:	case AF_INET:		return a->a4 - b->a4;	case AF_INET6:		return ipv6_addr_cmp((struct in6_addr *)a,				     (struct in6_addr *)b);	}}#endif	/* _NET_XFRM_H */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?