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 + -
显示快捷键?