diff options
author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-18 17:40:30 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-18 17:40:30 -0400 |
commit | a57793651ff1a09ef18bade998632435ca2dc13f (patch) | |
tree | fffc839d7b001f196421f09f0a06491588835fe1 /include | |
parent | 9cf52b2921fbe62566b6b2ee79f71203749c9e5e (diff) | |
parent | 52f095ee88d8851866bc7694ab991ca5abf21d5e (diff) |
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
* 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6: (51 commits)
[IPV6]: Fix again the fl6_sock_lookup() fixed locking
[NETFILTER]: nf_conntrack_tcp: fix connection reopening fix
[IPV6]: Fix race in ipv6_flowlabel_opt() when inserting two labels
[IPV6]: Lost locking in fl6_sock_lookup
[IPV6]: Lost locking when inserting a flowlabel in ipv6_fl_list
[NETFILTER]: xt_sctp: fix mistake to pass a pointer where array is required
[NET]: Fix OOPS due to missing check in dev_parse_header().
[TCP]: Remove lost_retrans zero seqno special cases
[NET]: fix carrier-on bug?
[NET]: Fix uninitialised variable in ip_frag_reasm()
[IPSEC]: Rename mode to outer_mode and add inner_mode
[IPSEC]: Disallow combinations of RO and AH/ESP/IPCOMP
[IPSEC]: Use the top IPv4 route's peer instead of the bottom
[IPSEC]: Store afinfo pointer in xfrm_mode
[IPSEC]: Add missing BEET checks
[IPSEC]: Move type and mode map into xfrm_state.c
[IPSEC]: Fix length check in xfrm_parse_spi
[IPSEC]: Move ip_summed zapping out of xfrm6_rcv_spi
[IPSEC]: Get nexthdr from caller in xfrm6_rcv_spi
[IPSEC]: Move tunnel parsing for IPv4 out of xfrm4_input
...
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/filter.h | 1 | ||||
-rw-r--r-- | include/linux/netdevice.h | 2 | ||||
-rw-r--r-- | include/linux/netfilter/xt_sctp.h | 13 | ||||
-rw-r--r-- | include/net/inet_frag.h | 7 | ||||
-rw-r--r-- | include/net/ipv6.h | 11 | ||||
-rw-r--r-- | include/net/sock.h | 22 | ||||
-rw-r--r-- | include/net/xfrm.h | 33 |
7 files changed, 55 insertions, 34 deletions
diff --git a/include/linux/filter.h b/include/linux/filter.h index 91b2e3b9251e..ddfa0372a3b7 100644 --- a/include/linux/filter.h +++ b/include/linux/filter.h | |||
@@ -146,6 +146,7 @@ struct sock; | |||
146 | 146 | ||
147 | extern unsigned int sk_run_filter(struct sk_buff *skb, struct sock_filter *filter, int flen); | 147 | extern unsigned int sk_run_filter(struct sk_buff *skb, struct sock_filter *filter, int flen); |
148 | extern int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk); | 148 | extern int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk); |
149 | extern int sk_detach_filter(struct sock *sk); | ||
149 | extern int sk_chk_filter(struct sock_filter *filter, int flen); | 150 | extern int sk_chk_filter(struct sock_filter *filter, int flen); |
150 | #endif /* __KERNEL__ */ | 151 | #endif /* __KERNEL__ */ |
151 | 152 | ||
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 39dd83b183a9..452c88d971ad 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
@@ -827,7 +827,7 @@ static inline int dev_parse_header(const struct sk_buff *skb, | |||
827 | { | 827 | { |
828 | const struct net_device *dev = skb->dev; | 828 | const struct net_device *dev = skb->dev; |
829 | 829 | ||
830 | if (!dev->header_ops->parse) | 830 | if (!dev->header_ops || !dev->header_ops->parse) |
831 | return 0; | 831 | return 0; |
832 | return dev->header_ops->parse(skb, haddr); | 832 | return dev->header_ops->parse(skb, haddr); |
833 | } | 833 | } |
diff --git a/include/linux/netfilter/xt_sctp.h b/include/linux/netfilter/xt_sctp.h index b157897e7792..dd5a4fd4cfd3 100644 --- a/include/linux/netfilter/xt_sctp.h +++ b/include/linux/netfilter/xt_sctp.h | |||
@@ -7,9 +7,6 @@ | |||
7 | 7 | ||
8 | #define XT_SCTP_VALID_FLAGS 0x07 | 8 | #define XT_SCTP_VALID_FLAGS 0x07 |
9 | 9 | ||
10 | #define ELEMCOUNT(x) (sizeof(x)/sizeof(x[0])) | ||
11 | |||
12 | |||
13 | struct xt_sctp_flag_info { | 10 | struct xt_sctp_flag_info { |
14 | u_int8_t chunktype; | 11 | u_int8_t chunktype; |
15 | u_int8_t flag; | 12 | u_int8_t flag; |
@@ -59,21 +56,21 @@ struct xt_sctp_info { | |||
59 | #define SCTP_CHUNKMAP_RESET(chunkmap) \ | 56 | #define SCTP_CHUNKMAP_RESET(chunkmap) \ |
60 | do { \ | 57 | do { \ |
61 | int i; \ | 58 | int i; \ |
62 | for (i = 0; i < ELEMCOUNT(chunkmap); i++) \ | 59 | for (i = 0; i < ARRAY_SIZE(chunkmap); i++) \ |
63 | chunkmap[i] = 0; \ | 60 | chunkmap[i] = 0; \ |
64 | } while (0) | 61 | } while (0) |
65 | 62 | ||
66 | #define SCTP_CHUNKMAP_SET_ALL(chunkmap) \ | 63 | #define SCTP_CHUNKMAP_SET_ALL(chunkmap) \ |
67 | do { \ | 64 | do { \ |
68 | int i; \ | 65 | int i; \ |
69 | for (i = 0; i < ELEMCOUNT(chunkmap); i++) \ | 66 | for (i = 0; i < ARRAY_SIZE(chunkmap); i++) \ |
70 | chunkmap[i] = ~0; \ | 67 | chunkmap[i] = ~0; \ |
71 | } while (0) | 68 | } while (0) |
72 | 69 | ||
73 | #define SCTP_CHUNKMAP_COPY(destmap, srcmap) \ | 70 | #define SCTP_CHUNKMAP_COPY(destmap, srcmap) \ |
74 | do { \ | 71 | do { \ |
75 | int i; \ | 72 | int i; \ |
76 | for (i = 0; i < ELEMCOUNT(chunkmap); i++) \ | 73 | for (i = 0; i < ARRAY_SIZE(srcmap); i++) \ |
77 | destmap[i] = srcmap[i]; \ | 74 | destmap[i] = srcmap[i]; \ |
78 | } while (0) | 75 | } while (0) |
79 | 76 | ||
@@ -81,7 +78,7 @@ struct xt_sctp_info { | |||
81 | ({ \ | 78 | ({ \ |
82 | int i; \ | 79 | int i; \ |
83 | int flag = 1; \ | 80 | int flag = 1; \ |
84 | for (i = 0; i < ELEMCOUNT(chunkmap); i++) { \ | 81 | for (i = 0; i < ARRAY_SIZE(chunkmap); i++) { \ |
85 | if (chunkmap[i]) { \ | 82 | if (chunkmap[i]) { \ |
86 | flag = 0; \ | 83 | flag = 0; \ |
87 | break; \ | 84 | break; \ |
@@ -94,7 +91,7 @@ struct xt_sctp_info { | |||
94 | ({ \ | 91 | ({ \ |
95 | int i; \ | 92 | int i; \ |
96 | int flag = 1; \ | 93 | int flag = 1; \ |
97 | for (i = 0; i < ELEMCOUNT(chunkmap); i++) { \ | 94 | for (i = 0; i < ARRAY_SIZE(chunkmap); i++) { \ |
98 | if (chunkmap[i] != ~0) { \ | 95 | if (chunkmap[i] != ~0) { \ |
99 | flag = 0; \ | 96 | flag = 0; \ |
100 | break; \ | 97 | break; \ |
diff --git a/include/net/inet_frag.h b/include/net/inet_frag.h index 911c2cd02941..954def408975 100644 --- a/include/net/inet_frag.h +++ b/include/net/inet_frag.h | |||
@@ -39,8 +39,13 @@ struct inet_frags { | |||
39 | struct inet_frags_ctl *ctl; | 39 | struct inet_frags_ctl *ctl; |
40 | 40 | ||
41 | unsigned int (*hashfn)(struct inet_frag_queue *); | 41 | unsigned int (*hashfn)(struct inet_frag_queue *); |
42 | void (*constructor)(struct inet_frag_queue *q, | ||
43 | void *arg); | ||
42 | void (*destructor)(struct inet_frag_queue *); | 44 | void (*destructor)(struct inet_frag_queue *); |
43 | void (*skb_free)(struct sk_buff *); | 45 | void (*skb_free)(struct sk_buff *); |
46 | int (*match)(struct inet_frag_queue *q, | ||
47 | void *arg); | ||
48 | void (*frag_expire)(unsigned long data); | ||
44 | }; | 49 | }; |
45 | 50 | ||
46 | void inet_frags_init(struct inet_frags *); | 51 | void inet_frags_init(struct inet_frags *); |
@@ -50,6 +55,8 @@ void inet_frag_kill(struct inet_frag_queue *q, struct inet_frags *f); | |||
50 | void inet_frag_destroy(struct inet_frag_queue *q, | 55 | void inet_frag_destroy(struct inet_frag_queue *q, |
51 | struct inet_frags *f, int *work); | 56 | struct inet_frags *f, int *work); |
52 | int inet_frag_evictor(struct inet_frags *f); | 57 | int inet_frag_evictor(struct inet_frags *f); |
58 | struct inet_frag_queue *inet_frag_find(struct inet_frags *f, void *key, | ||
59 | unsigned int hash); | ||
53 | 60 | ||
54 | static inline void inet_frag_put(struct inet_frag_queue *q, struct inet_frags *f) | 61 | static inline void inet_frag_put(struct inet_frag_queue *q, struct inet_frags *f) |
55 | { | 62 | { |
diff --git a/include/net/ipv6.h b/include/net/ipv6.h index cc796cbc1b26..ae328b680ff2 100644 --- a/include/net/ipv6.h +++ b/include/net/ipv6.h | |||
@@ -377,6 +377,17 @@ static inline int ipv6_prefix_equal(const struct in6_addr *a1, | |||
377 | prefixlen); | 377 | prefixlen); |
378 | } | 378 | } |
379 | 379 | ||
380 | struct inet_frag_queue; | ||
381 | |||
382 | struct ip6_create_arg { | ||
383 | __be32 id; | ||
384 | struct in6_addr *src; | ||
385 | struct in6_addr *dst; | ||
386 | }; | ||
387 | |||
388 | void ip6_frag_init(struct inet_frag_queue *q, void *a); | ||
389 | int ip6_frag_match(struct inet_frag_queue *q, void *a); | ||
390 | |||
380 | static inline int ipv6_addr_any(const struct in6_addr *a) | 391 | static inline int ipv6_addr_any(const struct in6_addr *a) |
381 | { | 392 | { |
382 | return ((a->s6_addr32[0] | a->s6_addr32[1] | | 393 | return ((a->s6_addr32[0] | a->s6_addr32[1] | |
diff --git a/include/net/sock.h b/include/net/sock.h index 453c79d0915b..43fc3fa50d62 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
@@ -905,16 +905,6 @@ static inline int sk_filter(struct sock *sk, struct sk_buff *skb) | |||
905 | } | 905 | } |
906 | 906 | ||
907 | /** | 907 | /** |
908 | * sk_filter_rcu_free: Free a socket filter | ||
909 | * @rcu: rcu_head that contains the sk_filter to free | ||
910 | */ | ||
911 | static inline void sk_filter_rcu_free(struct rcu_head *rcu) | ||
912 | { | ||
913 | struct sk_filter *fp = container_of(rcu, struct sk_filter, rcu); | ||
914 | kfree(fp); | ||
915 | } | ||
916 | |||
917 | /** | ||
918 | * sk_filter_release: Release a socket filter | 908 | * sk_filter_release: Release a socket filter |
919 | * @sk: socket | 909 | * @sk: socket |
920 | * @fp: filter to remove | 910 | * @fp: filter to remove |
@@ -922,14 +912,18 @@ static inline void sk_filter_rcu_free(struct rcu_head *rcu) | |||
922 | * Remove a filter from a socket and release its resources. | 912 | * Remove a filter from a socket and release its resources. |
923 | */ | 913 | */ |
924 | 914 | ||
925 | static inline void sk_filter_release(struct sock *sk, struct sk_filter *fp) | 915 | static inline void sk_filter_release(struct sk_filter *fp) |
916 | { | ||
917 | if (atomic_dec_and_test(&fp->refcnt)) | ||
918 | kfree(fp); | ||
919 | } | ||
920 | |||
921 | static inline void sk_filter_uncharge(struct sock *sk, struct sk_filter *fp) | ||
926 | { | 922 | { |
927 | unsigned int size = sk_filter_len(fp); | 923 | unsigned int size = sk_filter_len(fp); |
928 | 924 | ||
929 | atomic_sub(size, &sk->sk_omem_alloc); | 925 | atomic_sub(size, &sk->sk_omem_alloc); |
930 | 926 | sk_filter_release(fp); | |
931 | if (atomic_dec_and_test(&fp->refcnt)) | ||
932 | call_rcu_bh(&fp->rcu, sk_filter_rcu_free); | ||
933 | } | 927 | } |
934 | 928 | ||
935 | static inline void sk_filter_charge(struct sock *sk, struct sk_filter *fp) | 929 | static inline void sk_filter_charge(struct sock *sk, struct sk_filter *fp) |
diff --git a/include/net/xfrm.h b/include/net/xfrm.h index 0e844845f3f4..688f6f5d3285 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h | |||
@@ -186,7 +186,8 @@ struct xfrm_state | |||
186 | /* Reference to data common to all the instances of this | 186 | /* Reference to data common to all the instances of this |
187 | * transformer. */ | 187 | * transformer. */ |
188 | struct xfrm_type *type; | 188 | struct xfrm_type *type; |
189 | struct xfrm_mode *mode; | 189 | struct xfrm_mode *inner_mode; |
190 | struct xfrm_mode *outer_mode; | ||
190 | 191 | ||
191 | /* Security context */ | 192 | /* Security context */ |
192 | struct xfrm_sec_ctx *security; | 193 | struct xfrm_sec_ctx *security; |
@@ -228,8 +229,6 @@ struct xfrm_type; | |||
228 | struct xfrm_dst; | 229 | struct xfrm_dst; |
229 | struct xfrm_policy_afinfo { | 230 | struct xfrm_policy_afinfo { |
230 | unsigned short family; | 231 | unsigned short family; |
231 | struct xfrm_type *type_map[IPPROTO_MAX]; | ||
232 | struct xfrm_mode *mode_map[XFRM_MODE_MAX]; | ||
233 | struct dst_ops *dst_ops; | 232 | struct dst_ops *dst_ops; |
234 | void (*garbage_collect)(void); | 233 | void (*garbage_collect)(void); |
235 | int (*dst_lookup)(struct xfrm_dst **dst, struct flowi *fl); | 234 | int (*dst_lookup)(struct xfrm_dst **dst, struct flowi *fl); |
@@ -255,7 +254,10 @@ extern void km_state_expired(struct xfrm_state *x, int hard, u32 pid); | |||
255 | extern int __xfrm_state_delete(struct xfrm_state *x); | 254 | extern int __xfrm_state_delete(struct xfrm_state *x); |
256 | 255 | ||
257 | struct xfrm_state_afinfo { | 256 | struct xfrm_state_afinfo { |
258 | unsigned short family; | 257 | unsigned int family; |
258 | struct module *owner; | ||
259 | struct xfrm_type *type_map[IPPROTO_MAX]; | ||
260 | struct xfrm_mode *mode_map[XFRM_MODE_MAX]; | ||
259 | int (*init_flags)(struct xfrm_state *x); | 261 | int (*init_flags)(struct xfrm_state *x); |
260 | void (*init_tempsel)(struct xfrm_state *x, struct flowi *fl, | 262 | void (*init_tempsel)(struct xfrm_state *x, struct flowi *fl, |
261 | struct xfrm_tmpl *tmpl, | 263 | struct xfrm_tmpl *tmpl, |
@@ -267,8 +269,6 @@ struct xfrm_state_afinfo { | |||
267 | 269 | ||
268 | extern int xfrm_state_register_afinfo(struct xfrm_state_afinfo *afinfo); | 270 | extern int xfrm_state_register_afinfo(struct xfrm_state_afinfo *afinfo); |
269 | extern int xfrm_state_unregister_afinfo(struct xfrm_state_afinfo *afinfo); | 271 | extern int xfrm_state_unregister_afinfo(struct xfrm_state_afinfo *afinfo); |
270 | extern struct xfrm_state_afinfo *xfrm_state_get_afinfo(unsigned short family); | ||
271 | extern void xfrm_state_put_afinfo(struct xfrm_state_afinfo *afinfo); | ||
272 | 272 | ||
273 | extern void xfrm_state_delete_tunnel(struct xfrm_state *x); | 273 | extern void xfrm_state_delete_tunnel(struct xfrm_state *x); |
274 | 274 | ||
@@ -295,8 +295,6 @@ struct xfrm_type | |||
295 | 295 | ||
296 | extern int xfrm_register_type(struct xfrm_type *type, unsigned short family); | 296 | extern int xfrm_register_type(struct xfrm_type *type, unsigned short family); |
297 | extern int xfrm_unregister_type(struct xfrm_type *type, unsigned short family); | 297 | extern int xfrm_unregister_type(struct xfrm_type *type, unsigned short family); |
298 | extern struct xfrm_type *xfrm_get_type(u8 proto, unsigned short family); | ||
299 | extern void xfrm_put_type(struct xfrm_type *type); | ||
300 | 298 | ||
301 | struct xfrm_mode { | 299 | struct xfrm_mode { |
302 | int (*input)(struct xfrm_state *x, struct sk_buff *skb); | 300 | int (*input)(struct xfrm_state *x, struct sk_buff *skb); |
@@ -314,14 +312,19 @@ struct xfrm_mode { | |||
314 | */ | 312 | */ |
315 | int (*output)(struct xfrm_state *x,struct sk_buff *skb); | 313 | int (*output)(struct xfrm_state *x,struct sk_buff *skb); |
316 | 314 | ||
315 | struct xfrm_state_afinfo *afinfo; | ||
317 | struct module *owner; | 316 | struct module *owner; |
318 | unsigned int encap; | 317 | unsigned int encap; |
318 | int flags; | ||
319 | }; | ||
320 | |||
321 | /* Flags for xfrm_mode. */ | ||
322 | enum { | ||
323 | XFRM_MODE_FLAG_TUNNEL = 1, | ||
319 | }; | 324 | }; |
320 | 325 | ||
321 | extern int xfrm_register_mode(struct xfrm_mode *mode, int family); | 326 | extern int xfrm_register_mode(struct xfrm_mode *mode, int family); |
322 | extern int xfrm_unregister_mode(struct xfrm_mode *mode, int family); | 327 | extern int xfrm_unregister_mode(struct xfrm_mode *mode, int family); |
323 | extern struct xfrm_mode *xfrm_get_mode(unsigned int encap, int family); | ||
324 | extern void xfrm_put_mode(struct xfrm_mode *mode); | ||
325 | 328 | ||
326 | struct xfrm_tmpl | 329 | struct xfrm_tmpl |
327 | { | 330 | { |
@@ -1046,11 +1049,19 @@ extern void xfrm_replay_notify(struct xfrm_state *x, int event); | |||
1046 | extern int xfrm_state_mtu(struct xfrm_state *x, int mtu); | 1049 | extern int xfrm_state_mtu(struct xfrm_state *x, int mtu); |
1047 | extern int xfrm_init_state(struct xfrm_state *x); | 1050 | extern int xfrm_init_state(struct xfrm_state *x); |
1048 | extern int xfrm_output(struct sk_buff *skb); | 1051 | extern int xfrm_output(struct sk_buff *skb); |
1052 | extern int xfrm4_rcv_encap(struct sk_buff *skb, int nexthdr, __be32 spi, | ||
1053 | int encap_type); | ||
1049 | extern int xfrm4_rcv(struct sk_buff *skb); | 1054 | extern int xfrm4_rcv(struct sk_buff *skb); |
1055 | |||
1056 | static inline int xfrm4_rcv_spi(struct sk_buff *skb, int nexthdr, __be32 spi) | ||
1057 | { | ||
1058 | return xfrm4_rcv_encap(skb, nexthdr, spi, 0); | ||
1059 | } | ||
1060 | |||
1050 | extern int xfrm4_output(struct sk_buff *skb); | 1061 | extern int xfrm4_output(struct sk_buff *skb); |
1051 | extern int xfrm4_tunnel_register(struct xfrm_tunnel *handler, unsigned short family); | 1062 | extern int xfrm4_tunnel_register(struct xfrm_tunnel *handler, unsigned short family); |
1052 | extern int xfrm4_tunnel_deregister(struct xfrm_tunnel *handler, unsigned short family); | 1063 | extern int xfrm4_tunnel_deregister(struct xfrm_tunnel *handler, unsigned short family); |
1053 | extern int xfrm6_rcv_spi(struct sk_buff *skb, __be32 spi); | 1064 | extern int xfrm6_rcv_spi(struct sk_buff *skb, int nexthdr, __be32 spi); |
1054 | extern int xfrm6_rcv(struct sk_buff *skb); | 1065 | extern int xfrm6_rcv(struct sk_buff *skb); |
1055 | extern int xfrm6_input_addr(struct sk_buff *skb, xfrm_address_t *daddr, | 1066 | extern int xfrm6_input_addr(struct sk_buff *skb, xfrm_address_t *daddr, |
1056 | xfrm_address_t *saddr, u8 proto); | 1067 | xfrm_address_t *saddr, u8 proto); |