当前位置: 首页 > article >正文

数据帧去掉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()和最后一行代码即可


http://www.kler.cn/a/16747.html

相关文章:

  • Elastic Observability 8.16:增强的 OpenTelemetry 支持、高级日志分析和简化的入门流程
  • 结构体是否包含特定类型的成员变量
  • C++模板特化实战:在使用开源库boost::geometry::index::rtree时,用特化来让其支持自己的数据类型
  • 【Pikachu】目录遍历实战
  • JQuery封装的ajax
  • 01-Ajax入门与axios使用、URL知识
  • go 语言环境安装(Windows 系统下安装)
  • ( 数组和矩阵) 566. 重塑矩阵 ——【Leetcode每日一题】
  • osg::Drawable类通过setDrawCallback函数设置回调函数的说明
  • 构建ChatGPT 镜像,并将其部署到 Docker 容器中。
  • 基于Matlab刻度盘识别角度计算
  • C++:计算机操作系统:多线程:高并发中的线程
  • ViveNAS - 一个基于LSM tree的文件存储实现 (一)
  • C++ srand()和rand()用法
  • hadoop伪分布式搭建教程
  • 【react从入门到精通】React JSX详解
  • pytorch学习率设置——optimizer.param_groups、对不同层设置学习率、动态调整学习率。
  • Java中几种常量池面试总结
  • OVS常用命令与使用总结
  • Python_PyStray结合Tkinter显示系统托盘图标
  • SpringMVC与SpringWebFlux
  • 【Spring Security】| 从0到1编写一个权限认证 | 学会了吗?
  • MEET开发者 | 选择和努力一样重要,专访杭州三汇测试工程师齐雪莲
  • c++标准模板(STL)(std::array)(三)
  • 高程实验8队列
  • ROS Noetic版本 rosdep找不到命令 不能使用的解决方法