Blame view
drivers/net/nlmon.c
2.9 KB
09c434b8a treewide: Add SPD... |
1 |
// SPDX-License-Identifier: GPL-2.0-only |
e4fc408e0 packet: nlmon: vi... |
2 3 4 5 6 7 |
#include <linux/module.h> #include <linux/kernel.h> #include <linux/netdevice.h> #include <linux/netlink.h> #include <net/net_namespace.h> #include <linux/if_arp.h> |
7e6d4da83 nlmon: use standa... |
8 |
#include <net/rtnetlink.h> |
e4fc408e0 packet: nlmon: vi... |
9 |
|
e4fc408e0 packet: nlmon: vi... |
10 11 |
static netdev_tx_t nlmon_xmit(struct sk_buff *skb, struct net_device *dev) { |
3ed912264 net: nlmon: use s... |
12 |
dev_lstats_add(dev, skb->len); |
e4fc408e0 packet: nlmon: vi... |
13 14 15 16 17 |
dev_kfree_skb(skb); return NETDEV_TX_OK; } |
e4fc408e0 packet: nlmon: vi... |
18 19 |
static int nlmon_dev_init(struct net_device *dev) { |
1c213bd24 net: introduce ne... |
20 |
dev->lstats = netdev_alloc_pcpu_stats(struct pcpu_lstats); |
e4fc408e0 packet: nlmon: vi... |
21 22 23 24 25 26 27 |
return dev->lstats == NULL ? -ENOMEM : 0; } static void nlmon_dev_uninit(struct net_device *dev) { free_percpu(dev->lstats); } |
7e6d4da83 nlmon: use standa... |
28 29 30 |
struct nlmon { struct netlink_tap nt; }; |
e4fc408e0 packet: nlmon: vi... |
31 32 33 |
static int nlmon_open(struct net_device *dev) { |
7e6d4da83 nlmon: use standa... |
34 35 36 37 38 |
struct nlmon *nlmon = netdev_priv(dev); nlmon->nt.dev = dev; nlmon->nt.module = THIS_MODULE; return netlink_add_tap(&nlmon->nt); |
e4fc408e0 packet: nlmon: vi... |
39 40 41 42 |
} static int nlmon_close(struct net_device *dev) { |
7e6d4da83 nlmon: use standa... |
43 44 45 |
struct nlmon *nlmon = netdev_priv(dev); return netlink_remove_tap(&nlmon->nt); |
e4fc408e0 packet: nlmon: vi... |
46 |
} |
bc1f44709 net: make ndo_get... |
47 |
static void |
e4fc408e0 packet: nlmon: vi... |
48 49 |
nlmon_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats) { |
3ed912264 net: nlmon: use s... |
50 |
u64 packets, bytes; |
e4fc408e0 packet: nlmon: vi... |
51 |
|
3ed912264 net: nlmon: use s... |
52 |
dev_lstats_read(dev, &packets, &bytes); |
e4fc408e0 packet: nlmon: vi... |
53 54 55 56 57 58 |
stats->rx_packets = packets; stats->tx_packets = 0; stats->rx_bytes = bytes; stats->tx_bytes = 0; |
e4fc408e0 packet: nlmon: vi... |
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
} static u32 always_on(struct net_device *dev) { return 1; } static const struct ethtool_ops nlmon_ethtool_ops = { .get_link = always_on, }; static const struct net_device_ops nlmon_ops = { .ndo_init = nlmon_dev_init, .ndo_uninit = nlmon_dev_uninit, .ndo_open = nlmon_open, .ndo_stop = nlmon_close, .ndo_start_xmit = nlmon_xmit, .ndo_get_stats64 = nlmon_get_stats64, |
e4fc408e0 packet: nlmon: vi... |
77 |
}; |
e4fc408e0 packet: nlmon: vi... |
78 79 80 |
static void nlmon_setup(struct net_device *dev) { dev->type = ARPHRD_NETLINK; |
85773a61a net: nlmon: conve... |
81 |
dev->priv_flags |= IFF_NO_QUEUE; |
e4fc408e0 packet: nlmon: vi... |
82 83 84 |
dev->netdev_ops = &nlmon_ops; dev->ethtool_ops = &nlmon_ethtool_ops; |
cf124db56 net: Fix inconsis... |
85 |
dev->needs_free_netdev = true; |
e4fc408e0 packet: nlmon: vi... |
86 |
|
b7d47ca2f net: nlmon: flag ... |
87 88 |
dev->features = NETIF_F_SG | NETIF_F_FRAGLIST | NETIF_F_HIGHDMA | NETIF_F_LLTX; |
e4fc408e0 packet: nlmon: vi... |
89 90 91 92 93 94 95 |
dev->flags = IFF_NOARP; /* That's rather a softlimit here, which, of course, * can be altered. Not a real MTU, but what is to be * expected in most cases. */ dev->mtu = NLMSG_GOODSIZE; |
e82621e32 nlmon: use core M... |
96 |
dev->min_mtu = sizeof(struct nlmsghdr); |
e4fc408e0 packet: nlmon: vi... |
97 |
} |
a8b8a889e net: add netlink_... |
98 99 |
static int nlmon_validate(struct nlattr *tb[], struct nlattr *data[], struct netlink_ext_ack *extack) |
e4fc408e0 packet: nlmon: vi... |
100 |
{ |
7e6d4da83 nlmon: use standa... |
101 102 103 104 |
if (tb[IFLA_ADDRESS]) return -EINVAL; return 0; } |
e4fc408e0 packet: nlmon: vi... |
105 |
|
7e6d4da83 nlmon: use standa... |
106 107 108 109 110 111 |
static struct rtnl_link_ops nlmon_link_ops __read_mostly = { .kind = "nlmon", .priv_size = sizeof(struct nlmon), .setup = nlmon_setup, .validate = nlmon_validate, }; |
e4fc408e0 packet: nlmon: vi... |
112 |
|
7e6d4da83 nlmon: use standa... |
113 114 115 |
static __init int nlmon_register(void) { return rtnl_link_register(&nlmon_link_ops); |
e4fc408e0 packet: nlmon: vi... |
116 117 118 119 |
} static __exit void nlmon_unregister(void) { |
7e6d4da83 nlmon: use standa... |
120 |
rtnl_link_unregister(&nlmon_link_ops); |
e4fc408e0 packet: nlmon: vi... |
121 122 123 124 125 126 127 128 129 |
} module_init(nlmon_register); module_exit(nlmon_unregister); MODULE_LICENSE("GPL v2"); MODULE_AUTHOR("Daniel Borkmann <dborkman@redhat.com>"); MODULE_AUTHOR("Mathieu Geli <geli@enseirb.fr>"); MODULE_DESCRIPTION("Netlink monitoring device"); |
7e6d4da83 nlmon: use standa... |
130 |
MODULE_ALIAS_RTNL_LINK("nlmon"); |