网络开发LWIP总结
v> ethernetif_input()
v> ethernet_input()函数
v> ARP 数据 包就会给 ARP 去处理
v>如果是 IP 数据报就使用 ip4_input()函数传递到上层
v> 对于多播或者是广播数据包,ethernet_output()函数
v> 对于单播包的处理稍微麻烦一点,ARP 协议需要根据 IP 地址找到对应的 MAC 地 址,然后才能正确发送
v> PBUFF_ERF、PBUF_POOL、PBUF_RAM 类型的数据包是 不允许直接挂到 ARP 表项对应的缓存队列上的
发送测试1: etharp_output()
对于多播或者是广播数据包,直接将数据包丢给网卡(调用 ethernet_output()函数)
low_level_output
HAL_ETH_Transmit(&EthHandle, &TxConfig, ETH_DMA_TRANSMIT_TIMEOUT);
EthHandle.Instance = ETH;
EthHandle.Init.MACAddr = dm9162dev.mac; /* MAC地址 */ /* ST的 MAC 修改1 */
EthHandle.Init.RxDesc = DMARxDscrTab; /* 接收描述符 */
EthHandle.Init.TxDesc = DMATxDscrTab; /* 发送描述符 */
EthHandle.Init.RxBuffLen = ETH_RX_BUFFER_SIZE; /* 接收数组大小 */
EthHandle.Init.MediaInterface = HAL_ETH_RMII_MODE; /* RMII接口 */
memset(&TxConfig, 0, sizeof(ETH_TxPacketConfig));
TxConfig.Attributes = ETH_TX_PACKETS_FEATURES_CSUM | ETH_TX_PACKETS_FEATURES_CRCPAD;
TxConfig.ChecksumCtrl = ETH_CHECKSUM_IPHDR_PAYLOAD_INSERT_PHDR_CALC;
TxConfig.CRCPadCtrl = ETH_CRC_PAD_INSERT;
Txbuffer[i].buffer = q->payload;
Txbuffer[i].len = q->len;
framelen += q->len;
TxConfig.Length = framelen;(总包长度)
TxConfig.TxBuffer = Txbuffer;(发送指针)
ETH_Prepare_Tx_Descriptors(heth, pTxConfig, 0)(从pTxConfig转移到heth,具体转移内容不详)
INCR_TX_DESC_INDEX(heth->TxDescList.CurTxDesc, 1U);(地址加1)
WRITE_REG(heth->Instance->DMACTDTPR, (uint32_t)(heth->TxDescList.TxDesc[heth->TxDescList.CurTxDesc]));(由对应位置进行发送)