数据帧去掉VlanTag的代码(802.1Q)
可以使用如下C语言代码来判断数据包类型是否为0x8100(即802.1Q协议),如果是则去掉其中的4个字节的TAG:
#include <stdlib.h>
#include <string.h>
#include <netinet/if_ether.h>
#define VLAN_TAG_LEN 4 // 固定的802.1Q Tag长度
void strip_vlan(unsigned char *buffer, size_t buflen) {
struct ether_header *eth = (struct ether_header *) buffer;
if (ntohs(eth->ether_type) == ETHERTYPE_VLAN) {
memmove(buffer + sizeof(struct ether_header),
buffer + sizeof(struct ether_header) + VLAN_TAG_LEN,
buflen - sizeof(struct ether_header) - VLAN_TAG_LEN);
eth->ether_type = ntohs(*((unsigned short *)(buffer + sizeof(struct ether_header) - 2)));
}
}
这个函数接受指向数据包缓冲区的指针和缓冲区长度作为输入,在原地修改缓冲区内容。具体实现方式如下:
- 首先将以太网头的指针转换为ether_header类型;
- 然后检查eth->ether_type字段是否等于ETHERTYPE_VLAN(即0x8100),如果是则表示该数据包有802.1Q TAG;
- 如果存在802.1Q TAG,则将缓冲区中以太网头之后的所有字节向前移动TAG长度(4个字节),相当于去除了TAG;
- 最后将以太网头中的类型字段更新为去掉TAG后的新类型。
需要注意的是,此函数假设输入的数据包已经包含Ethernet头部。如果要处理没有Ethernet头部的裸数据包,请在调用该函数之前添加按需添加Ethernet头部。另外,如果您只需要判断并不需要去除TAG,请直接删除strip_vlan()函数中的memmove()和最后一行代码即可