mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
[XFRM] IPV6: Optimize xfrm6_input_addr().
| % size old/net/ipv6/xfrm6_input.o new/net/ipv6/xfrm6_input.o | text data bss dec hex filename | 1026 0 0 1026 402 old/net/ipv6/xfrm6_input.o | 947 0 0 947 3b3 new/net/ipv6/xfrm6_input.o Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
This commit is contained in:
parent
3b6cdf94cd
commit
a002c6fd71
@ -59,9 +59,6 @@ int xfrm6_input_addr(struct sk_buff *skb, xfrm_address_t *daddr,
|
|||||||
xfrm_address_t *saddr, u8 proto)
|
xfrm_address_t *saddr, u8 proto)
|
||||||
{
|
{
|
||||||
struct xfrm_state *x = NULL;
|
struct xfrm_state *x = NULL;
|
||||||
int wildcard = 0;
|
|
||||||
xfrm_address_t *xany;
|
|
||||||
int nh = 0;
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
/* Allocate new secpath or COW existing one. */
|
/* Allocate new secpath or COW existing one. */
|
||||||
@ -83,10 +80,9 @@ int xfrm6_input_addr(struct sk_buff *skb, xfrm_address_t *daddr,
|
|||||||
goto drop;
|
goto drop;
|
||||||
}
|
}
|
||||||
|
|
||||||
xany = (xfrm_address_t *)&in6addr_any;
|
|
||||||
|
|
||||||
for (i = 0; i < 3; i++) {
|
for (i = 0; i < 3; i++) {
|
||||||
xfrm_address_t *dst, *src;
|
xfrm_address_t *dst, *src;
|
||||||
|
|
||||||
switch (i) {
|
switch (i) {
|
||||||
case 0:
|
case 0:
|
||||||
dst = daddr;
|
dst = daddr;
|
||||||
@ -94,16 +90,13 @@ int xfrm6_input_addr(struct sk_buff *skb, xfrm_address_t *daddr,
|
|||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
/* lookup state with wild-card source address */
|
/* lookup state with wild-card source address */
|
||||||
wildcard = 1;
|
|
||||||
dst = daddr;
|
dst = daddr;
|
||||||
src = xany;
|
src = (xfrm_address_t *)&in6addr_any;
|
||||||
break;
|
break;
|
||||||
case 2:
|
|
||||||
default:
|
default:
|
||||||
/* lookup state with wild-card addresses */
|
/* lookup state with wild-card addresses */
|
||||||
wildcard = 1; /* XXX */
|
dst = (xfrm_address_t *)&in6addr_any;
|
||||||
dst = xany;
|
src = (xfrm_address_t *)&in6addr_any;
|
||||||
src = xany;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -113,39 +106,19 @@ int xfrm6_input_addr(struct sk_buff *skb, xfrm_address_t *daddr,
|
|||||||
|
|
||||||
spin_lock(&x->lock);
|
spin_lock(&x->lock);
|
||||||
|
|
||||||
if (wildcard) {
|
if ((!i || (x->props.flags & XFRM_STATE_WILDRECV)) &&
|
||||||
if ((x->props.flags & XFRM_STATE_WILDRECV) == 0) {
|
likely(x->km.state == XFRM_STATE_VALID) &&
|
||||||
spin_unlock(&x->lock);
|
!xfrm_state_check_expire(x)) {
|
||||||
xfrm_state_put(x);
|
spin_unlock(&x->lock);
|
||||||
x = NULL;
|
if (x->type->input(x, skb) > 0) {
|
||||||
continue;
|
/* found a valid state */
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
} else
|
||||||
|
|
||||||
if (unlikely(x->km.state != XFRM_STATE_VALID)) {
|
|
||||||
spin_unlock(&x->lock);
|
spin_unlock(&x->lock);
|
||||||
xfrm_state_put(x);
|
|
||||||
x = NULL;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (xfrm_state_check_expire(x)) {
|
|
||||||
spin_unlock(&x->lock);
|
|
||||||
xfrm_state_put(x);
|
|
||||||
x = NULL;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
spin_unlock(&x->lock);
|
xfrm_state_put(x);
|
||||||
|
x = NULL;
|
||||||
nh = x->type->input(x, skb);
|
|
||||||
if (nh <= 0) {
|
|
||||||
xfrm_state_put(x);
|
|
||||||
x = NULL;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Found a state */
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!x) {
|
if (!x) {
|
||||||
|
Loading…
Reference in New Issue
Block a user