diff options
author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-10-04 11:26:19 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-10-04 11:26:19 -0400 |
commit | d002ec481c24f325ed6cfcb7810d317c015dd1b5 (patch) | |
tree | 71fbdce6aab6ffb5f8590e7ddde7c095a7fa31ab /net/xfrm | |
parent | 5a96c5d0c58ead9a0ece03ffe1c116dea6dafe9c (diff) | |
parent | 0a69452cb45add0841c2bc1e75c25f6bd4f1d8d9 (diff) |
Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6:
[XFRM]: BEET mode
[TCP]: Kill warning in tcp_clean_rtx_queue().
[NET_SCHED]: Remove old estimator implementation
[ATM]: [zatm] always *pcr in alloc_shaper()
[ATM]: [ambassador] Change the return type to reflect reality
[ATM]: kmalloc to kzalloc patches for drivers/atm
[TIPC]: fix printk warning
[XFRM]: Clearing xfrm_policy_count[] to zero during flush is incorrect.
[XFRM] STATE: Use destination address for src hash.
[NEIGH]: always use hash_mask under tbl lock
[UDP]: Fix MSG_PROBE crash
[UDP6]: Fix flowi clobbering
[NET_SCHED]: Revert "HTB: fix incorrect use of RB_EMPTY_NODE"
[NETFILTER]: ebt_mark: add or/and/xor action support to mark target
[NETFILTER]: ipt_REJECT: remove largely duplicate route_reverse function
[NETFILTER]: Honour source routing for LVS-NAT
[NETFILTER]: add type parameter to ip_route_me_harder
[NETFILTER]: Kconfig: fix xt_physdev dependencies
Diffstat (limited to 'net/xfrm')
-rw-r--r-- | net/xfrm/xfrm_hash.h | 7 | ||||
-rw-r--r-- | net/xfrm/xfrm_policy.c | 7 | ||||
-rw-r--r-- | net/xfrm/xfrm_state.c | 16 | ||||
-rw-r--r-- | net/xfrm/xfrm_user.c | 1 |
4 files changed, 19 insertions, 12 deletions
diff --git a/net/xfrm/xfrm_hash.h b/net/xfrm/xfrm_hash.h index 6ac4e4f033..d401dc8f05 100644 --- a/net/xfrm/xfrm_hash.h +++ b/net/xfrm/xfrm_hash.h | |||
@@ -41,17 +41,18 @@ static inline unsigned int __xfrm_dst_hash(xfrm_address_t *daddr, xfrm_address_t | |||
41 | return (h ^ (h >> 16)) & hmask; | 41 | return (h ^ (h >> 16)) & hmask; |
42 | } | 42 | } |
43 | 43 | ||
44 | static inline unsigned __xfrm_src_hash(xfrm_address_t *saddr, | 44 | static inline unsigned __xfrm_src_hash(xfrm_address_t *daddr, |
45 | xfrm_address_t *saddr, | ||
45 | unsigned short family, | 46 | unsigned short family, |
46 | unsigned int hmask) | 47 | unsigned int hmask) |
47 | { | 48 | { |
48 | unsigned int h = family; | 49 | unsigned int h = family; |
49 | switch (family) { | 50 | switch (family) { |
50 | case AF_INET: | 51 | case AF_INET: |
51 | h ^= __xfrm4_addr_hash(saddr); | 52 | h ^= __xfrm4_daddr_saddr_hash(daddr, saddr); |
52 | break; | 53 | break; |
53 | case AF_INET6: | 54 | case AF_INET6: |
54 | h ^= __xfrm6_addr_hash(saddr); | 55 | h ^= __xfrm6_daddr_saddr_hash(daddr, saddr); |
55 | break; | 56 | break; |
56 | }; | 57 | }; |
57 | return (h ^ (h >> 16)) & hmask; | 58 | return (h ^ (h >> 16)) & hmask; |
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index b6e2e79d72..2a7861661f 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c | |||
@@ -778,8 +778,9 @@ void xfrm_policy_flush(u8 type) | |||
778 | for (dir = 0; dir < XFRM_POLICY_MAX; dir++) { | 778 | for (dir = 0; dir < XFRM_POLICY_MAX; dir++) { |
779 | struct xfrm_policy *pol; | 779 | struct xfrm_policy *pol; |
780 | struct hlist_node *entry; | 780 | struct hlist_node *entry; |
781 | int i; | 781 | int i, killed; |
782 | 782 | ||
783 | killed = 0; | ||
783 | again1: | 784 | again1: |
784 | hlist_for_each_entry(pol, entry, | 785 | hlist_for_each_entry(pol, entry, |
785 | &xfrm_policy_inexact[dir], bydst) { | 786 | &xfrm_policy_inexact[dir], bydst) { |
@@ -790,6 +791,7 @@ void xfrm_policy_flush(u8 type) | |||
790 | write_unlock_bh(&xfrm_policy_lock); | 791 | write_unlock_bh(&xfrm_policy_lock); |
791 | 792 | ||
792 | xfrm_policy_kill(pol); | 793 | xfrm_policy_kill(pol); |
794 | killed++; | ||
793 | 795 | ||
794 | write_lock_bh(&xfrm_policy_lock); | 796 | write_lock_bh(&xfrm_policy_lock); |
795 | goto again1; | 797 | goto again1; |
@@ -807,13 +809,14 @@ void xfrm_policy_flush(u8 type) | |||
807 | write_unlock_bh(&xfrm_policy_lock); | 809 | write_unlock_bh(&xfrm_policy_lock); |
808 | 810 | ||
809 | xfrm_policy_kill(pol); | 811 | xfrm_policy_kill(pol); |
812 | killed++; | ||
810 | 813 | ||
811 | write_lock_bh(&xfrm_policy_lock); | 814 | write_lock_bh(&xfrm_policy_lock); |
812 | goto again2; | 815 | goto again2; |
813 | } | 816 | } |
814 | } | 817 | } |
815 | 818 | ||
816 | xfrm_policy_count[dir] = 0; | 819 | xfrm_policy_count[dir] -= killed; |
817 | } | 820 | } |
818 | atomic_inc(&flow_cache_genid); | 821 | atomic_inc(&flow_cache_genid); |
819 | write_unlock_bh(&xfrm_policy_lock); | 822 | write_unlock_bh(&xfrm_policy_lock); |
diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index f927b7330f..39b8bf3a9d 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c | |||
@@ -63,10 +63,11 @@ static inline unsigned int xfrm_dst_hash(xfrm_address_t *daddr, | |||
63 | return __xfrm_dst_hash(daddr, saddr, reqid, family, xfrm_state_hmask); | 63 | return __xfrm_dst_hash(daddr, saddr, reqid, family, xfrm_state_hmask); |
64 | } | 64 | } |
65 | 65 | ||
66 | static inline unsigned int xfrm_src_hash(xfrm_address_t *addr, | 66 | static inline unsigned int xfrm_src_hash(xfrm_address_t *daddr, |
67 | xfrm_address_t *saddr, | ||
67 | unsigned short family) | 68 | unsigned short family) |
68 | { | 69 | { |
69 | return __xfrm_src_hash(addr, family, xfrm_state_hmask); | 70 | return __xfrm_src_hash(daddr, saddr, family, xfrm_state_hmask); |
70 | } | 71 | } |
71 | 72 | ||
72 | static inline unsigned int | 73 | static inline unsigned int |
@@ -92,7 +93,8 @@ static void xfrm_hash_transfer(struct hlist_head *list, | |||
92 | nhashmask); | 93 | nhashmask); |
93 | hlist_add_head(&x->bydst, ndsttable+h); | 94 | hlist_add_head(&x->bydst, ndsttable+h); |
94 | 95 | ||
95 | h = __xfrm_src_hash(&x->props.saddr, x->props.family, | 96 | h = __xfrm_src_hash(&x->id.daddr, &x->props.saddr, |
97 | x->props.family, | ||
96 | nhashmask); | 98 | nhashmask); |
97 | hlist_add_head(&x->bysrc, nsrctable+h); | 99 | hlist_add_head(&x->bysrc, nsrctable+h); |
98 | 100 | ||
@@ -458,7 +460,7 @@ static struct xfrm_state *__xfrm_state_lookup(xfrm_address_t *daddr, __be32 spi, | |||
458 | 460 | ||
459 | static struct xfrm_state *__xfrm_state_lookup_byaddr(xfrm_address_t *daddr, xfrm_address_t *saddr, u8 proto, unsigned short family) | 461 | static struct xfrm_state *__xfrm_state_lookup_byaddr(xfrm_address_t *daddr, xfrm_address_t *saddr, u8 proto, unsigned short family) |
460 | { | 462 | { |
461 | unsigned int h = xfrm_src_hash(saddr, family); | 463 | unsigned int h = xfrm_src_hash(daddr, saddr, family); |
462 | struct xfrm_state *x; | 464 | struct xfrm_state *x; |
463 | struct hlist_node *entry; | 465 | struct hlist_node *entry; |
464 | 466 | ||
@@ -587,7 +589,7 @@ xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr, | |||
587 | if (km_query(x, tmpl, pol) == 0) { | 589 | if (km_query(x, tmpl, pol) == 0) { |
588 | x->km.state = XFRM_STATE_ACQ; | 590 | x->km.state = XFRM_STATE_ACQ; |
589 | hlist_add_head(&x->bydst, xfrm_state_bydst+h); | 591 | hlist_add_head(&x->bydst, xfrm_state_bydst+h); |
590 | h = xfrm_src_hash(saddr, family); | 592 | h = xfrm_src_hash(daddr, saddr, family); |
591 | hlist_add_head(&x->bysrc, xfrm_state_bysrc+h); | 593 | hlist_add_head(&x->bysrc, xfrm_state_bysrc+h); |
592 | if (x->id.spi) { | 594 | if (x->id.spi) { |
593 | h = xfrm_spi_hash(&x->id.daddr, x->id.spi, x->id.proto, family); | 595 | h = xfrm_spi_hash(&x->id.daddr, x->id.spi, x->id.proto, family); |
@@ -622,7 +624,7 @@ static void __xfrm_state_insert(struct xfrm_state *x) | |||
622 | x->props.reqid, x->props.family); | 624 | x->props.reqid, x->props.family); |
623 | hlist_add_head(&x->bydst, xfrm_state_bydst+h); | 625 | hlist_add_head(&x->bydst, xfrm_state_bydst+h); |
624 | 626 | ||
625 | h = xfrm_src_hash(&x->props.saddr, x->props.family); | 627 | h = xfrm_src_hash(&x->id.daddr, &x->props.saddr, x->props.family); |
626 | hlist_add_head(&x->bysrc, xfrm_state_bysrc+h); | 628 | hlist_add_head(&x->bysrc, xfrm_state_bysrc+h); |
627 | 629 | ||
628 | if (x->id.spi) { | 630 | if (x->id.spi) { |
@@ -748,7 +750,7 @@ static struct xfrm_state *__find_acq_core(unsigned short family, u8 mode, u32 re | |||
748 | x->timer.expires = jiffies + XFRM_ACQ_EXPIRES*HZ; | 750 | x->timer.expires = jiffies + XFRM_ACQ_EXPIRES*HZ; |
749 | add_timer(&x->timer); | 751 | add_timer(&x->timer); |
750 | hlist_add_head(&x->bydst, xfrm_state_bydst+h); | 752 | hlist_add_head(&x->bydst, xfrm_state_bydst+h); |
751 | h = xfrm_src_hash(saddr, family); | 753 | h = xfrm_src_hash(daddr, saddr, family); |
752 | hlist_add_head(&x->bysrc, xfrm_state_bysrc+h); | 754 | hlist_add_head(&x->bysrc, xfrm_state_bysrc+h); |
753 | wake_up(&km_waitq); | 755 | wake_up(&km_waitq); |
754 | } | 756 | } |
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index c59a78d292..d54b3a70d5 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c | |||
@@ -211,6 +211,7 @@ static int verify_newsa_info(struct xfrm_usersa_info *p, | |||
211 | case XFRM_MODE_TRANSPORT: | 211 | case XFRM_MODE_TRANSPORT: |
212 | case XFRM_MODE_TUNNEL: | 212 | case XFRM_MODE_TUNNEL: |
213 | case XFRM_MODE_ROUTEOPTIMIZATION: | 213 | case XFRM_MODE_ROUTEOPTIMIZATION: |
214 | case XFRM_MODE_BEET: | ||
214 | break; | 215 | break; |
215 | 216 | ||
216 | default: | 217 | default: |