外观
网卡接收过滤操作指南
2026-05-14
功能概述
网卡接收过滤功能允许应用程序在不关闭 LwIP 协议栈的情况下,对指定规则的网络接收报文进行拦截、过滤和自定义处理,实现标准网络协议与私有协议共存。
API 说明
设置接收过滤判断函数
#define SET_RX_FILTER_JUDGE 0x12
rt_device_control("name", SET_RX_FILTER_JUDGE, rx_filter_judge);参数说明:
- name: 网卡名
- rx_filter_judge: 接收过滤条件判断函数,用于判断当前报文是否需要拦截
取消接收过滤判断
#define SET_RX_FILTER_JUDGE 0x12
rt_device_control("name", SET_RX_FILTER_JUDGE, NULL);参数说明:
- name: 网卡名
设置接收过滤处理函数
#define SET_RX_FILTER_HANDLER 0x13
rt_device_control("name", SET_RX_FILTER_HANDLER, rx_filter_handler);参数说明:
- name: 网卡名
- rx_filter_handler: 接收过滤数据处理函数,报文被拦截后进入该函数处理
取消接收过滤处理
#define SET_RX_FILTER_HANDLER 0x13
rt_device_control("name", SET_RX_FILTER_HANDLER, NULL);参数说明:
- name: 网卡名
示例
功能描述
本示例演示如何使用网卡接收过滤功能。
代码实现
#include <rtthread.h>
#include <rtdevice.h>
#include <lwip/pbuf.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#define DEV_NAME "e0"
#define SET_RX_FILTER_JUDGE 0x12
#define SET_RX_FILTER_HANDLER 0x13
/* 测试发送包 */
rt_uint8_t test_send_packet[] =
{
0x11, 0x22, 0x33, 0x44, 0x55, 0x66, // 目的MAC
0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF, // 源MAC
0x88, 0xB8, // 协议类型
0x11, 0x22, 0x33, 0x44, 0x55, 0x66 // 数据
};
/* 全局保存网卡设备 */
static rt_device_t g_net_dev = RT_NULL;
/* 接收过滤条件判断(匹配则拦截,不走LwIP) */
static rt_bool_t eth_rx_filter_condition(void *p)
{
struct pbuf *q = (struct pbuf *)p;
if ((q == RT_NULL) || (q->len < 1))
{
return RT_FALSE;
}
// 条件:第一个字节 == 0x11
if(((rt_uint8_t *)q->payload)[0] == 0x11)
{
return RT_TRUE;
}
return RT_FALSE;
}
/* 接收过滤数据处理:拦截后发送测试包 */
static void eth_rx_filter_handler(void *p)
{
if (g_net_dev != RT_NULL)
{
rt_device_write(g_net_dev, 0, test_send_packet, sizeof(test_send_packet));
rt_kprintf("[rx_filter_handler] send packet done\n");
}
}
/* 初始化自定义以太网协议过滤 */
void eth_rx_filter_init(void)
{
g_net_dev = rt_device_find(DEV_NAME);
if (g_net_dev == RT_NULL)
{
rt_kprintf("[rx_filter] device not found\n");
return;
}
rt_device_control(g_net_dev, SET_RX_FILTER_JUDGE, eth_rx_filter_condition);
rt_device_control(g_net_dev, SET_RX_FILTER_HANDLER, eth_rx_filter_handler);
rt_kprintf("[rx_filter] init ok\n");
}
MSH_CMD_EXPORT(eth_rx_filter_init, Ethernet rx filter init);