Commit a002c6fd authored by YOSHIFUJI Hideaki's avatar YOSHIFUJI Hideaki

[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: default avatarYOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
parent 3b6cdf94
...@@ -59,9 +59,6 @@ int xfrm6_input_addr(struct sk_buff *skb, xfrm_address_t *daddr, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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);
x = NULL;
continue;
}
}
if (unlikely(x->km.state != XFRM_STATE_VALID)) {
spin_unlock(&x->lock); spin_unlock(&x->lock);
xfrm_state_put(x); if (x->type->input(x, skb) > 0) {
x = NULL; /* found a valid state */
continue; break;
} }
if (xfrm_state_check_expire(x)) { } else
spin_unlock(&x->lock); spin_unlock(&x->lock);
xfrm_state_put(x);
x = NULL;
continue;
}
spin_unlock(&x->lock);
nh = x->type->input(x, skb);
if (nh <= 0) {
xfrm_state_put(x);
x = NULL;
continue;
}
/* Found a state */ xfrm_state_put(x);
break; x = NULL;
} }
if (!x) { if (!x) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment