ipv4: add a sock pointer to dst->output() path.
In the dst->output() path for ipv4, the code assumes the skb it has to
transmit is attached to an inet socket, specifically via
ip_mc_output() : The sk_mc_loop() test triggers a WARN_ON() when the
provider of the packet is an AF_PACKET socket.
The dst->output() method gets an additional 'struct sock *sk'
parameter. This needs a cascade of changes so that this parameter can
be propagated from vxlan to final consumer.
Fixes: 8f646c922d
("vxlan: keep original skb ownership")
Reported-by: lucien xin <lucien.xin@gmail.com>
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
b0270e9101
commit
aad88724c9
@@ -752,7 +752,7 @@ static int dn_to_neigh_output(struct sk_buff *skb)
|
||||
return n->output(n, skb);
|
||||
}
|
||||
|
||||
static int dn_output(struct sk_buff *skb)
|
||||
static int dn_output(struct sock *sk, struct sk_buff *skb)
|
||||
{
|
||||
struct dst_entry *dst = skb_dst(skb);
|
||||
struct dn_route *rt = (struct dn_route *)dst;
|
||||
@@ -838,6 +838,18 @@ drop:
|
||||
* Used to catch bugs. This should never normally get
|
||||
* called.
|
||||
*/
|
||||
static int dn_rt_bug_sk(struct sock *sk, struct sk_buff *skb)
|
||||
{
|
||||
struct dn_skb_cb *cb = DN_SKB_CB(skb);
|
||||
|
||||
net_dbg_ratelimited("dn_rt_bug: skb from:%04x to:%04x\n",
|
||||
le16_to_cpu(cb->src), le16_to_cpu(cb->dst));
|
||||
|
||||
kfree_skb(skb);
|
||||
|
||||
return NET_RX_DROP;
|
||||
}
|
||||
|
||||
static int dn_rt_bug(struct sk_buff *skb)
|
||||
{
|
||||
struct dn_skb_cb *cb = DN_SKB_CB(skb);
|
||||
@@ -1463,7 +1475,7 @@ make_route:
|
||||
|
||||
rt->n = neigh;
|
||||
rt->dst.lastuse = jiffies;
|
||||
rt->dst.output = dn_rt_bug;
|
||||
rt->dst.output = dn_rt_bug_sk;
|
||||
switch (res.type) {
|
||||
case RTN_UNICAST:
|
||||
rt->dst.input = dn_forward;
|
||||
|
Reference in New Issue
Block a user