@@ -2035,19 +2035,18 @@ static inline int ip6mr_forward2_finish(struct net *net, struct sock *sk, struct
2035
2035
* Processing handlers for ip6mr_forward
2036
2036
*/
2037
2037
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 )
2040
2040
{
2041
2041
struct vif_device * vif = & mrt -> vif_table [vifi ];
2042
- struct net_device * indev = skb -> dev ;
2043
2042
struct net_device * vif_dev ;
2044
2043
struct ipv6hdr * ipv6h ;
2045
2044
struct dst_entry * dst ;
2046
2045
struct flowi6 fl6 ;
2047
2046
2048
2047
vif_dev = vif_dev_read (vif );
2049
2048
if (!vif_dev )
2050
- goto out_free ;
2049
+ return -1 ;
2051
2050
2052
2051
#ifdef CONFIG_IPV6_PIMSM_V2
2053
2052
if (vif -> flags & MIFF_REGISTER ) {
@@ -2056,7 +2055,7 @@ static void ip6mr_forward2(struct net *net, struct mr_table *mrt,
2056
2055
DEV_STATS_ADD (vif_dev , tx_bytes , skb -> len );
2057
2056
DEV_STATS_INC (vif_dev , tx_packets );
2058
2057
ip6mr_cache_report (mrt , skb , vifi , MRT6MSG_WHOLEPKT );
2059
- goto out_free ;
2058
+ return -1 ;
2060
2059
}
2061
2060
#endif
2062
2061
@@ -2070,7 +2069,7 @@ static void ip6mr_forward2(struct net *net, struct mr_table *mrt,
2070
2069
dst = ip6_route_output (net , NULL , & fl6 );
2071
2070
if (dst -> error ) {
2072
2071
dst_release (dst );
2073
- goto out_free ;
2072
+ return -1 ;
2074
2073
}
2075
2074
2076
2075
skb_dst_drop (skb );
@@ -2094,10 +2093,20 @@ static void ip6mr_forward2(struct net *net, struct mr_table *mrt,
2094
2093
/* We are about to write */
2095
2094
/* XXX: extension headers? */
2096
2095
if (skb_cow (skb , sizeof (* ipv6h ) + LL_RESERVED_SPACE (vif_dev )))
2097
- goto out_free ;
2096
+ return -1 ;
2098
2097
2099
2098
ipv6h = ipv6_hdr (skb );
2100
2099
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 ;
2101
2110
2102
2111
IP6CB (skb )-> flags |= IP6SKB_FORWARDED ;
2103
2112
0 commit comments