struct net_device
添加struct net_device
static struct platform_driver rtl8168_platform_driver = {
...
.probe = rtl8168_init_one,
};
rtl8168_init_one
rtl8168_init_board
struct net_device *dev = alloc_etherdev(sizeof (*tp))
alloc_etherdev_mq
alloc_etherdev_mqs
注册struct net_device
register_netdev(dev)
register_netdevice //由net/core/dev.c文件实现
struct net_device_ops
static const struct net_device_ops rtl8168_netdev_ops = {
.ndo_open = rtl8168_open,
.ndo_stop = rtl8168_close,
.ndo_get_stats = rtl8168_get_stats,
.ndo_start_xmit = rtl8168_start_xmit,
.ndo_tx_timeout = rtl8168_tx_timeout,
.ndo_change_mtu = rtl8168_change_mtu,
.ndo_set_mac_address = rtl8168_set_mac_address,
.ndo_do_ioctl = rtl8168_do_ioctl,
.ndo_set_rx_mode = rtl8168_set_rx_mode,
.ndo_fix_features = rtl8168_fix_features,
.ndo_set_features = rtl8168_set_features,
};
用户空间的ifconfig会导致rtl8168_open的调用
struct ethtool_ops
static const struct ethtool_ops rtl8168_ethtool_ops = {
.get_drvinfo = rtl8168_get_drvinfo,
.get_regs_len = rtl8168_get_regs_len,
.get_link = ethtool_op_get_link,
.get_settings = rtl8168_get_settings,
.set_settings = rtl8168_set_settings,
.get_msglevel = rtl8168_get_msglevel,
.set_msglevel = rtl8168_set_msglevel,
.get_regs = rtl8168_get_regs,
.get_wol = rtl8168_get_wol,
.set_wol = rtl8168_set_wol,
.get_strings = rtl8168_get_strings,
.get_sset_count = rtl8168_get_sset_count,
.get_ethtool_stats = rtl8168_get_ethtool_stats,
.get_ts_info = ethtool_op_get_ts_info,
};
ndo_start_xmit
rtl8168_start_xmit
rtl8168_rx_skb
rtl8168_open
request_irq(dev->irq, rtl8168_interrupt...)
rtl8168_rx_interrupt
rtl8168_rx_skb
netif_rx(skb)