Skip to content

Commit 1b02f44

Browse files
pmachatakuba-moo
authored andcommitted
net: ipv6: ip6mr: Split ip6mr_forward2() in two
Some of the work of ip6mr_forward2() is specific to IPMR forwarding, and should not take place on the output path. In order to allow reuse of the common parts, extract out of the function a helper, ip6mr_prepare_forward(). Signed-off-by: Petr Machata <[email protected]> Link: https://patch.msgid.link/8932bd5c0fbe3f662b158803b8509604fa7bc113.1750113335.git.petrm@nvidia.com Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 094f39d commit 1b02f44

File tree

1 file changed

+16
-7
lines changed

1 file changed

+16
-7
lines changed

net/ipv6/ip6mr.c

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2035,19 +2035,18 @@ static inline int ip6mr_forward2_finish(struct net *net, struct sock *sk, struct
20352035
* Processing handlers for ip6mr_forward
20362036
*/
20372037

2038-
static void ip6mr_forward2(struct net *net, struct mr_table *mrt,
2039-
struct sk_buff *skb, int vifi)
2038+
static int ip6mr_prepare_xmit(struct net *net, struct mr_table *mrt,
2039+
struct sk_buff *skb, int vifi)
20402040
{
20412041
struct vif_device *vif = &mrt->vif_table[vifi];
2042-
struct net_device *indev = skb->dev;
20432042
struct net_device *vif_dev;
20442043
struct ipv6hdr *ipv6h;
20452044
struct dst_entry *dst;
20462045
struct flowi6 fl6;
20472046

20482047
vif_dev = vif_dev_read(vif);
20492048
if (!vif_dev)
2050-
goto out_free;
2049+
return -1;
20512050

20522051
#ifdef CONFIG_IPV6_PIMSM_V2
20532052
if (vif->flags & MIFF_REGISTER) {
@@ -2056,7 +2055,7 @@ static void ip6mr_forward2(struct net *net, struct mr_table *mrt,
20562055
DEV_STATS_ADD(vif_dev, tx_bytes, skb->len);
20572056
DEV_STATS_INC(vif_dev, tx_packets);
20582057
ip6mr_cache_report(mrt, skb, vifi, MRT6MSG_WHOLEPKT);
2059-
goto out_free;
2058+
return -1;
20602059
}
20612060
#endif
20622061

@@ -2070,7 +2069,7 @@ static void ip6mr_forward2(struct net *net, struct mr_table *mrt,
20702069
dst = ip6_route_output(net, NULL, &fl6);
20712070
if (dst->error) {
20722071
dst_release(dst);
2073-
goto out_free;
2072+
return -1;
20742073
}
20752074

20762075
skb_dst_drop(skb);
@@ -2094,10 +2093,20 @@ static void ip6mr_forward2(struct net *net, struct mr_table *mrt,
20942093
/* We are about to write */
20952094
/* XXX: extension headers? */
20962095
if (skb_cow(skb, sizeof(*ipv6h) + LL_RESERVED_SPACE(vif_dev)))
2097-
goto out_free;
2096+
return -1;
20982097

20992098
ipv6h = ipv6_hdr(skb);
21002099
ipv6h->hop_limit--;
2100+
return 0;
2101+
}
2102+
2103+
static void ip6mr_forward2(struct net *net, struct mr_table *mrt,
2104+
struct sk_buff *skb, int vifi)
2105+
{
2106+
struct net_device *indev = skb->dev;
2107+
2108+
if (ip6mr_prepare_xmit(net, mrt, skb, vifi))
2109+
goto out_free;
21012110

21022111
IP6CB(skb)->flags |= IP6SKB_FORWARDED;
21032112

0 commit comments

Comments
 (0)