diff options
Diffstat (limited to 'net/xfrm/xfrm_output.c')
-rw-r--r-- | net/xfrm/xfrm_output.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/net/xfrm/xfrm_output.c b/net/xfrm/xfrm_output.c index dc50f1e71f76..c235597ba8dd 100644 --- a/net/xfrm/xfrm_output.c +++ b/net/xfrm/xfrm_output.c | |||
@@ -41,6 +41,7 @@ static int xfrm_output_one(struct sk_buff *skb, int err) | |||
41 | { | 41 | { |
42 | struct dst_entry *dst = skb->dst; | 42 | struct dst_entry *dst = skb->dst; |
43 | struct xfrm_state *x = dst->xfrm; | 43 | struct xfrm_state *x = dst->xfrm; |
44 | struct net *net = xs_net(x); | ||
44 | 45 | ||
45 | if (err <= 0) | 46 | if (err <= 0) |
46 | goto resume; | 47 | goto resume; |
@@ -48,33 +49,33 @@ static int xfrm_output_one(struct sk_buff *skb, int err) | |||
48 | do { | 49 | do { |
49 | err = xfrm_state_check_space(x, skb); | 50 | err = xfrm_state_check_space(x, skb); |
50 | if (err) { | 51 | if (err) { |
51 | XFRM_INC_STATS(LINUX_MIB_XFRMOUTERROR); | 52 | XFRM_INC_STATS(net, LINUX_MIB_XFRMOUTERROR); |
52 | goto error_nolock; | 53 | goto error_nolock; |
53 | } | 54 | } |
54 | 55 | ||
55 | err = x->outer_mode->output(x, skb); | 56 | err = x->outer_mode->output(x, skb); |
56 | if (err) { | 57 | if (err) { |
57 | XFRM_INC_STATS(LINUX_MIB_XFRMOUTSTATEMODEERROR); | 58 | XFRM_INC_STATS(net, LINUX_MIB_XFRMOUTSTATEMODEERROR); |
58 | goto error_nolock; | 59 | goto error_nolock; |
59 | } | 60 | } |
60 | 61 | ||
61 | spin_lock_bh(&x->lock); | 62 | spin_lock_bh(&x->lock); |
62 | err = xfrm_state_check_expire(x); | 63 | err = xfrm_state_check_expire(x); |
63 | if (err) { | 64 | if (err) { |
64 | XFRM_INC_STATS(LINUX_MIB_XFRMOUTSTATEEXPIRED); | 65 | XFRM_INC_STATS(net, LINUX_MIB_XFRMOUTSTATEEXPIRED); |
65 | goto error; | 66 | goto error; |
66 | } | 67 | } |
67 | 68 | ||
68 | if (x->type->flags & XFRM_TYPE_REPLAY_PROT) { | 69 | if (x->type->flags & XFRM_TYPE_REPLAY_PROT) { |
69 | XFRM_SKB_CB(skb)->seq.output = ++x->replay.oseq; | 70 | XFRM_SKB_CB(skb)->seq.output = ++x->replay.oseq; |
70 | if (unlikely(x->replay.oseq == 0)) { | 71 | if (unlikely(x->replay.oseq == 0)) { |
71 | XFRM_INC_STATS(LINUX_MIB_XFRMOUTSTATESEQERROR); | 72 | XFRM_INC_STATS(net, LINUX_MIB_XFRMOUTSTATESEQERROR); |
72 | x->replay.oseq--; | 73 | x->replay.oseq--; |
73 | xfrm_audit_state_replay_overflow(x, skb); | 74 | xfrm_audit_state_replay_overflow(x, skb); |
74 | err = -EOVERFLOW; | 75 | err = -EOVERFLOW; |
75 | goto error; | 76 | goto error; |
76 | } | 77 | } |
77 | if (xfrm_aevent_is_on()) | 78 | if (xfrm_aevent_is_on(net)) |
78 | xfrm_replay_notify(x, XFRM_REPLAY_UPDATE); | 79 | xfrm_replay_notify(x, XFRM_REPLAY_UPDATE); |
79 | } | 80 | } |
80 | 81 | ||
@@ -89,12 +90,12 @@ static int xfrm_output_one(struct sk_buff *skb, int err) | |||
89 | 90 | ||
90 | resume: | 91 | resume: |
91 | if (err) { | 92 | if (err) { |
92 | XFRM_INC_STATS(LINUX_MIB_XFRMOUTSTATEPROTOERROR); | 93 | XFRM_INC_STATS(net, LINUX_MIB_XFRMOUTSTATEPROTOERROR); |
93 | goto error_nolock; | 94 | goto error_nolock; |
94 | } | 95 | } |
95 | 96 | ||
96 | if (!(skb->dst = dst_pop(dst))) { | 97 | if (!(skb->dst = dst_pop(dst))) { |
97 | XFRM_INC_STATS(LINUX_MIB_XFRMOUTERROR); | 98 | XFRM_INC_STATS(net, LINUX_MIB_XFRMOUTERROR); |
98 | err = -EHOSTUNREACH; | 99 | err = -EHOSTUNREACH; |
99 | goto error_nolock; | 100 | goto error_nolock; |
100 | } | 101 | } |
@@ -178,6 +179,7 @@ static int xfrm_output_gso(struct sk_buff *skb) | |||
178 | 179 | ||
179 | int xfrm_output(struct sk_buff *skb) | 180 | int xfrm_output(struct sk_buff *skb) |
180 | { | 181 | { |
182 | struct net *net = dev_net(skb->dst->dev); | ||
181 | int err; | 183 | int err; |
182 | 184 | ||
183 | if (skb_is_gso(skb)) | 185 | if (skb_is_gso(skb)) |
@@ -186,7 +188,7 @@ int xfrm_output(struct sk_buff *skb) | |||
186 | if (skb->ip_summed == CHECKSUM_PARTIAL) { | 188 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
187 | err = skb_checksum_help(skb); | 189 | err = skb_checksum_help(skb); |
188 | if (err) { | 190 | if (err) { |
189 | XFRM_INC_STATS(LINUX_MIB_XFRMOUTERROR); | 191 | XFRM_INC_STATS(net, LINUX_MIB_XFRMOUTERROR); |
190 | kfree_skb(skb); | 192 | kfree_skb(skb); |
191 | return err; | 193 | return err; |
192 | } | 194 | } |