Skip to content

Commit

Permalink
[IPSEC]: Move IP protocol setting from transforms into xfrm4_input.c
Browse files Browse the repository at this point in the history
This patch makes the IPv4 x->type->input functions return the next protocol
instead of setting it directly.  This is identical to how we do things in
IPv6 and will help us merge common code on the input path.

Signed-off-by: Herbert Xu <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
herbertx authored and David S. Miller committed Oct 10, 2007
1 parent ceb1eec commit 631a669
Show file tree
Hide file tree
Showing 5 changed files with 15 additions and 9 deletions.
5 changes: 3 additions & 2 deletions net/ipv4/ah4.c
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,7 @@ static int ah_input(struct xfrm_state *x, struct sk_buff *skb)
{
int ah_hlen;
int ihl;
int nexthdr;
int err = -EINVAL;
struct iphdr *iph;
struct ip_auth_hdr *ah;
Expand All @@ -136,6 +137,7 @@ static int ah_input(struct xfrm_state *x, struct sk_buff *skb)

ah = (struct ip_auth_hdr *)skb->data;
ahp = x->data;
nexthdr = ah->nexthdr;
ah_hlen = (ah->hdrlen + 2) << 2;

if (ah_hlen != XFRM_ALIGN8(sizeof(*ah) + ahp->icv_full_len) &&
Expand Down Expand Up @@ -182,13 +184,12 @@ static int ah_input(struct xfrm_state *x, struct sk_buff *skb)
goto out;
}
}
((struct iphdr*)work_buf)->protocol = ah->nexthdr;
skb->network_header += ah_hlen;
memcpy(skb_network_header(skb), work_buf, ihl);
skb->transport_header = skb->network_header;
__skb_pull(skb, ah_hlen + ihl);

return 0;
return nexthdr;

out:
return err;
Expand Down
3 changes: 1 addition & 2 deletions net/ipv4/esp4.c
Original file line number Diff line number Diff line change
Expand Up @@ -257,12 +257,11 @@ static int esp_input(struct xfrm_state *x, struct sk_buff *skb)
skb->ip_summed = CHECKSUM_UNNECESSARY;
}

iph->protocol = nexthdr[1];
pskb_trim(skb, skb->len - alen - padlen - 2);
__skb_pull(skb, sizeof(*esph) + esp->conf.ivlen);
skb_set_transport_header(skb, -ihl);

return 0;
return nexthdr[1];

out:
return -EINVAL;
Expand Down
7 changes: 4 additions & 3 deletions net/ipv4/ipcomp.c
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,6 @@ static int ipcomp_decompress(struct xfrm_state *x, struct sk_buff *skb)
static int ipcomp_input(struct xfrm_state *x, struct sk_buff *skb)
{
int err = -ENOMEM;
struct iphdr *iph;
struct ip_comp_hdr *ipch;

if (skb_linearize_cow(skb))
Expand All @@ -84,12 +83,14 @@ static int ipcomp_input(struct xfrm_state *x, struct sk_buff *skb)
skb->ip_summed = CHECKSUM_NONE;

/* Remove ipcomp header and decompress original payload */
iph = ip_hdr(skb);
ipch = (void *)skb->data;
iph->protocol = ipch->nexthdr;
skb->transport_header = skb->network_header + sizeof(*ipch);
__skb_pull(skb, sizeof(*ipch));
err = ipcomp_decompress(x, skb);
if (err)
goto out;

err = ipch->nexthdr;

out:
return err;
Expand Down
7 changes: 6 additions & 1 deletion net/ipv4/xfrm4_input.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,12 +54,14 @@ static int xfrm4_rcv_encap(struct sk_buff *skb, __u16 encap_type)
int xfrm_nr = 0;
int decaps = 0;
int err = xfrm4_parse_spi(skb, ip_hdr(skb)->protocol, &spi, &seq);
unsigned int nhoff = offsetof(struct iphdr, protocol);

if (err != 0)
goto drop;

do {
const struct iphdr *iph = ip_hdr(skb);
int nexthdr;

if (xfrm_nr == XFRM_MAX_DEPTH)
goto drop;
Expand All @@ -82,9 +84,12 @@ static int xfrm4_rcv_encap(struct sk_buff *skb, __u16 encap_type)
if (xfrm_state_check_expire(x))
goto drop_unlock;

if (x->type->input(x, skb))
nexthdr = x->type->input(x, skb);
if (nexthdr <= 0)
goto drop_unlock;

skb_network_header(skb)[nhoff] = nexthdr;

/* only the first xfrm gets the encap type */
encap_type = 0;

Expand Down
2 changes: 1 addition & 1 deletion net/ipv4/xfrm4_tunnel.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ static int ipip_output(struct xfrm_state *x, struct sk_buff *skb)

static int ipip_xfrm_rcv(struct xfrm_state *x, struct sk_buff *skb)
{
return 0;
return IPPROTO_IP;
}

static int ipip_init_state(struct xfrm_state *x)
Expand Down

0 comments on commit 631a669

Please sign in to comment.