Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 29183
b: refs/heads/master
c: 09b8f7a
h: refs/heads/master
i:
  29181: f4bdcf5
  29179: 7c9b40b
  29175: f640d70
  29167: 54074ff
  29151: c94be8a
  29119: 7f7aca2
  29055: 2579713
  28927: ebe0d11
  28671: 73b9451
v: v3
  • Loading branch information
Herbert Xu authored and David S. Miller committed Jun 23, 2006
1 parent b167e1c commit abd2282
Show file tree
Hide file tree
Showing 3 changed files with 84 additions and 11 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 37c3185a02d4b85fbe134bf5204535405dd2c957
refs/heads/master: 09b8f7a93efd4b2c4ef391e2fbf076f28c6d36d6
54 changes: 46 additions & 8 deletions trunk/net/ipv4/xfrm4_output.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
*/

#include <linux/compiler.h>
#include <linux/if_ether.h>
#include <linux/kernel.h>
#include <linux/skbuff.h>
#include <linux/spinlock.h>
#include <linux/netfilter_ipv4.h>
Expand Down Expand Up @@ -97,16 +99,10 @@ static int xfrm4_output_one(struct sk_buff *skb)
goto out_exit;
}

static int xfrm4_output_finish(struct sk_buff *skb)
static int xfrm4_output_finish2(struct sk_buff *skb)
{
int err;

#ifdef CONFIG_NETFILTER
if (!skb->dst->xfrm) {
IPCB(skb)->flags |= IPSKB_REROUTED;
return dst_output(skb);
}
#endif
while (likely((err = xfrm4_output_one(skb)) == 0)) {
nf_reset(skb);

Expand All @@ -119,14 +115,56 @@ static int xfrm4_output_finish(struct sk_buff *skb)
return dst_output(skb);

err = nf_hook(PF_INET, NF_IP_POST_ROUTING, &skb, NULL,
skb->dst->dev, xfrm4_output_finish);
skb->dst->dev, xfrm4_output_finish2);
if (unlikely(err != 1))
break;
}

return err;
}

static int xfrm4_output_finish(struct sk_buff *skb)
{
struct sk_buff *segs;

#ifdef CONFIG_NETFILTER
if (!skb->dst->xfrm) {
IPCB(skb)->flags |= IPSKB_REROUTED;
return dst_output(skb);
}
#endif

if (!skb_shinfo(skb)->gso_size)
return xfrm4_output_finish2(skb);

skb->protocol = htons(ETH_P_IP);
segs = skb_gso_segment(skb, 0);
kfree_skb(skb);
if (unlikely(IS_ERR(segs)))
return PTR_ERR(segs);

do {
struct sk_buff *nskb = segs->next;
int err;

segs->next = NULL;
err = xfrm4_output_finish2(segs);

if (unlikely(err)) {
while ((segs = nskb)) {
nskb = segs->next;
segs->next = NULL;
kfree_skb(segs);
}
return err;
}

segs = nskb;
} while (segs);

return 0;
}

int xfrm4_output(struct sk_buff *skb)
{
return NF_HOOK_COND(PF_INET, NF_IP_POST_ROUTING, skb, NULL, skb->dst->dev,
Expand Down
39 changes: 37 additions & 2 deletions trunk/net/ipv6/xfrm6_output.c
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ static int xfrm6_output_one(struct sk_buff *skb)
goto out_exit;
}

static int xfrm6_output_finish(struct sk_buff *skb)
static int xfrm6_output_finish2(struct sk_buff *skb)
{
int err;

Expand All @@ -110,14 +110,49 @@ static int xfrm6_output_finish(struct sk_buff *skb)
return dst_output(skb);

err = nf_hook(PF_INET6, NF_IP6_POST_ROUTING, &skb, NULL,
skb->dst->dev, xfrm6_output_finish);
skb->dst->dev, xfrm6_output_finish2);
if (unlikely(err != 1))
break;
}

return err;
}

static int xfrm6_output_finish(struct sk_buff *skb)
{
struct sk_buff *segs;

if (!skb_shinfo(skb)->gso_size)
return xfrm6_output_finish2(skb);

skb->protocol = htons(ETH_P_IP);
segs = skb_gso_segment(skb, 0);
kfree_skb(skb);
if (unlikely(IS_ERR(segs)))
return PTR_ERR(segs);

do {
struct sk_buff *nskb = segs->next;
int err;

segs->next = NULL;
err = xfrm6_output_finish2(segs);

if (unlikely(err)) {
while ((segs = nskb)) {
nskb = segs->next;
segs->next = NULL;
kfree_skb(segs);
}
return err;
}

segs = nskb;
} while (segs);

return 0;
}

int xfrm6_output(struct sk_buff *skb)
{
return NF_HOOK(PF_INET6, NF_IP6_POST_ROUTING, skb, NULL, skb->dst->dev,
Expand Down

0 comments on commit abd2282

Please sign in to comment.