eth结构体
❶ linux系统中,有关网络服务接口,是什么定义的
(1)网络接口的命名
这里并不存在一定的命名规范,但网络接口名字的定义一般都是要有意义的。例如:
eth0: ethernet的简写,一般用于以太网接口。
wifi0:wifi是无线局域网,因此wifi0一般指无线网络接口。
ath0: Atheros的简写,一般指Atheros芯片所包含的无线网络接口。
lo: local的简写,一般指本地环回接口。
(2)网络接口如何工作
网络接口是用来发送和接受数据包的基本设备。
系统中的所有网络接口组成一个链状结构,应用层程序使用时按名称调用。
每个网络接口在linux系统中对应于一个struct net_device结构体,包含name,mac,mask,mtu…信息。
每个硬件网卡(一个MAC)对应一个网络接口,其工作完全由相应的驱动程序控制。
(3)虚拟网络接口
虚拟网络接口的应用范围非常广泛。最着名的当属“lo”了,基本上每个linux系统都有这个接口。
虚拟网络接口并不真实地从外界接收和发送数据包,而是在系统内部接收和发送数据包,因此虚拟网络接口不需要驱动程序。
虚拟网络接口和真实存在的网络接口在使用上是一致的。
(4)网络接口的创建
硬件网卡的网络接口由驱动程序创建。而虚拟的网络接口由系统创建或通过应用层程序创建。
驱动中创建网络接口的函数是:register_netdev(struct net_device *)或者register_netdevice(struct net_device *)。
这两个函数的区别是:register_netdev(…)会自动生成以”eth”作为打头名称的接口,而register_netdevice(…)需要提前指定接口名称.事实上,register_netdev(…)也是通过调用register_netdevice(…)实现的。
2、LINUX中的lo(回环接口)
1) 什么是LO接口?
在LINUX系统中,除了网络接口eth0,还可以有别的接口,比如lo(本地环路接口)。
2) LO接口的作用是什么?
假如包是由一个本地进程为另一个本地进程产生的, 它们将通过外出链的’lo’接口,然后返回进入链的’lo’接口.具体参考包过滤器的相关内容。
PART2 实验:
本地一个进程发起连接,到一个本地的daemon监听的内网IP地址(eth1: 10.1.1.1)的端口(8085),此时在eth1上是抓不到包的,在 lo 上抓到,说明使用的是本地回环接口lo,而网络层的IP地址则是内网IP地址.
原
❷ RTL8111H-PCIE网卡ARM驱动构建
最近在探索 Linux 内核中网口部分的代码,特别关注的是 PCIe-Switch/Eth 控制器,它利用 MSI-X 中断和 DMA 完成数据包的接收与发送。本次驱动的构建采用 RealTek 的 RTL8111H-PCIE Ethernet Controller,该控制器内部集成了一对 MAC 和 PHY,实现单个 10/100/1000 网络接口。
本次驱动的构建平台是使用 RK3568 实现,数据收发通过 DMA-PCIE 进行。为了全面理解 PCIe 网卡驱动的注册和数据包处理流程,我们参照芯片手册构建了一套 RTL8111H 的驱动代码。
编写 PCIe 驱动的首要步骤是识别总线下设备的唯一性标识信息,即 PCIe 配置空间中的设备 DeviceID 和厂商 VendorID。通过使用 lspci 工具箱读取 PCIe 网卡前 256 字节的配置字,确定关键信息。工具箱获取的信息如下:Class 为 604 的设备是 RK3568 内置的 PCIe-RC 节点,VendorID:0x1D87、DeviceID:0x3566;Class 为 200 的设备是外置 PCIe 网卡配置空间的信息,VendorID:0x10EC、DeviceID:0x8168。
接下来,构建标准 PCIe 设备驱动框架,该框架包含基本的注册和初始化步骤。PCIE 设备的注册使用 mole_pci_driver 结构体,其入参为 pci_driver 结构体。在内核初始化过程中,相应的驱动被注册到内核中。
在完成基础驱动框架后,接下来需要参照芯片手册构建网卡驱动的特定部分。
在完成基础驱动框架和参照芯片手册构建特定部分之后,我们的 RTL8111 的驱动已经具备了初步可用的能力,在 PCI 驱动、ifconfig 等操作下,可以正常识别出该驱动并将其暴露在 sysfs 中。
PCI 驱动注册后,在最后一个驱动列表中即可看到注册的驱动。ifconfig 操作下可以看到获取的 MAC 地址与通过 MMIO 读取获取到的 MAC 地址一致。
此外,驱动还需要实现中断处理和网络通信包的上送,包括实现 MSIX 中断注册和测试。内核网口测试中,注册 net_device 结构体实现内核网口控制,引入 NAPI 机制提高网络通信效率。测试显示,当打开内核收包功能并触发大量数据报文传输时,会触发内核的 NAPI 机制进行数据包收取。测试包括 ARP 收包、端口计数功能等。
最后,代码开源部分已准备就绪,等待部署到 gitee 平台。
❸ (struct uip_eth_hdr *)是什么意思
uip_eth_hdr 这个应该是结构体的名字 就是把某个值 转换成 结构体指针的类型
❹ Miner 流程
以太坊的矿工出块的流程,不同版本有过变更,下面基于1.7.3版本和1.8.4版本来分享
channel: 用于1发1收
发送 :sampleChan<-
接收 : <-sampleChan
Feed:用于1发多收,参考chainHeadCh
接收者注册 :Subscribe(sampleChan)
发送 :send, 发送的地方不太好找,需要通过send和event/channel类型查找,例如miner中主要涉及到的就是 PostChainEvents
接收 :<-sampleChan
数据结构:
可以理解为操作间(eth)中有了矿(tx),那么矿主(miner)安排工人(worker)挖矿(seal)。结构体定义如下:
Type Miner struct { -- - 理解为矿主
mux *event.TypeMux
worker *worker ---- 理解为干活的工人
coinbase common.Address
eth Backend - --- 理解为操作间
engine consensus.Engine ---- 理解为挖矿的工具
exitCh chan struct {}
canStart int32 //canstart indicates whether we can start the mining operation
shouldStart int32 //shouldstart indicates whether we should start after sync
}
流程图如下:
1. 节点启动: backend.new->miner.new->worker.new: 调用commitNewWork,里面使用push把work传递给cpuAgent, 之后在geth命令行敲miner.start()后->miner.start->worker.start->cpuAgent.start,调用Seal,计算nonce值,再发送 recv 消息,通知 worker . wait ,在收到之后将块打包插入到区块链,之后调用PostChainEvents,发送消息chainHeadCh, Worker.update 在收到消息后,重新调用 commitNewWor k,形成一个循环。
2. 创世块: 调用geth的init命令触发调用initGenesis->SetupGenesisBlock, 里面具体强调一下time是使用的genesisBlock.json中的值,一般都是0.
3. 正常情况: worker . wait ,在收到之后将块打包插入到区块链,之后调用PostChainEvents,发送消息chainHeadCh, Worker.update 在收到消息后,重新调用 commitNewWor k,形成一个循环。
Miner .new: 在backend new的时候调用,即在节点启动的时候调用。
Miner . update :在节点启动的时候调用,用于监控是否有块同步,如果有则停止挖矿,如果没有启动挖矿,这个在POW这种竞争性出块的环境中需要。
Worker .new: 在miner.new的时候调用,记载节点启动的时候调用
Worker.update: 节点启动的时候调用,如果是非全节点的话用于监控接受交易transaction,关键函数 commitTransactions ,还用于调度在收到 chainHeadCh 的消息后,触发 commitNewWork
其中 commitNewWork : 用于将pending的tx输入到系统,计算trie等等操作,生成block,并将work push到cpuAgent处理,注意没有盖章
Worker. wait (对应于 1.8.4 的 resultLoop ) :节点启动的时候调用,循环监听 recv 消息,将携带的block插入区块链中、发送广播消息( NewMinedBlockEvent )、发送消息 PostChainEvents (发送 ChainHeadEvent ,即 chainHeadCh ),其中的关键函数是 WriteBlockAndState 。
cpuAgent .update() : 在cpuAgent.start()->worker.start->miner.start->geth的命令行调用之后启动循环,用于接收 commitNewWork 分配下来的work,关键函数 mine ,里面调用 Seal ,主要是完成POW寻找nonce值的操作,发送 recv 消息通知worker,也可以叫做盖章。
类图如下:
具体结构不再赘述
流程:
Miner.update:用于监控是否有块同步,如果有则停止挖矿,这个在POW这种竞争性出块的环境中需要
mainLoop:收到newWorkCh消息后处理,调用commitNewWork中的commit发送taskCh消息
newWorkLoop:收到startCh消息和chainHeadCh消息后发送newWorkCh消息
resultLoop:循环监听resultCh(seal发送)消息,将携带的block插入区块链中,并发送广播消息,关键函数WriteBlockAndState,并发送chainHeadCh消息
taskLoop:以前agent做的事情,收到taskCh消息后,调用seal,里面发送resultCh消息