Skip to content

Commit 7e9d191

Browse files
spikehNipaLocal
authored and
NipaLocal
committed
netdevsim: forward skbs from one connected port to another
Forward skbs sent from one netdevsim port to its connected netdevsim port using dev_forward_skb, in a spirit similar to veth. Signed-off-by: David Wei <[email protected]> Signed-off-by: NipaLocal <nipa@local>
1 parent 465fa80 commit 7e9d191

File tree

1 file changed

+18
-5
lines changed

1 file changed

+18
-5
lines changed

drivers/net/netdevsim/netdev.c

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,19 +29,33 @@
2929
static netdev_tx_t nsim_start_xmit(struct sk_buff *skb, struct net_device *dev)
3030
{
3131
struct netdevsim *ns = netdev_priv(dev);
32+
struct netdevsim *peer_ns;
33+
int ret = NETDEV_TX_OK;
3234

35+
rcu_read_lock();
3336
if (!nsim_ipsec_tx(ns, skb))
34-
goto out;
37+
goto err;
3538

3639
u64_stats_update_begin(&ns->syncp);
3740
ns->tx_packets++;
3841
ns->tx_bytes += skb->len;
3942
u64_stats_update_end(&ns->syncp);
4043

41-
out:
42-
dev_kfree_skb(skb);
44+
peer_ns = rcu_dereference(ns->peer);
45+
if (!peer_ns)
46+
goto err;
47+
48+
skb_tx_timestamp(skb);
49+
if (unlikely(dev_forward_skb(peer_ns->netdev, skb) == NET_RX_DROP))
50+
ret = NET_XMIT_DROP;
4351

44-
return NETDEV_TX_OK;
52+
rcu_read_unlock();
53+
return ret;
54+
55+
err:
56+
rcu_read_unlock();
57+
dev_kfree_skb(skb);
58+
return ret;
4559
}
4660

4761
static void nsim_set_rx_mode(struct net_device *dev)
@@ -302,7 +316,6 @@ static void nsim_setup(struct net_device *dev)
302316
eth_hw_addr_random(dev);
303317

304318
dev->tx_queue_len = 0;
305-
dev->flags |= IFF_NOARP;
306319
dev->flags &= ~IFF_MULTICAST;
307320
dev->priv_flags |= IFF_LIVE_ADDR_CHANGE |
308321
IFF_NO_QUEUE;

0 commit comments

Comments
 (0)