chalalong

优质答主

11-06

TA获得超过4442个赞

IPv6头部的设计是一个简洁的基本头部后面根据需要加上多种不同类型的扩展头部,这种设计可以将不常用的功能通过选择性的添加不同的扩展头部实现,从而在保证了基本头部的简洁和处理的快速性。以Linux2.6.28版本内核为例,IPv6扩展首部的定义在Linux-2.6.28/include/linux/in6.h和linux-2.6.28/include/net/ipv6.h两个目录下,我们以添加一种IPPROTO_MY类型的扩展头为例:

1、在头文件中添加新类型扩展头的定义,在linux-2.6.28/include/linux/in6.h中

/*

* NextHeader field of IPv6 header

*/

#define NEXTHDR_HOP 0 /* Hop-by-hop option header. */

#define NEXTHDR_TCP 6 /* TCP segment. */

#define NEXTHDR_UDP 17 /* UDP message. */

#define NEXTHDR_IPV6 41 /* IPv6 in IPv6 */

#define NEXTHDR_ROUTING 43 /* Routing header. */

#define NEXTHDR_FRAGMENT 44 /* Fragmentation/reassembly header. */

#define NEXTHDR_ESP 50 /* Encapsulating security payload. */

#define NEXTHDR_AUTH 51 /* Authentication header. */

#define NEXTHDR_ICMP 58 /* ICMP for IPv6. */

#define NEXTHDR_NONE 59 /* No next header */

#define NEXTHDR_DEST 60 /* Destination options header. */

#define NEXTHDR_MOBILITY 135 /* Mobility header. */

#define IPPROTO_MY 200 /*自己定义的头部类型 */

2、在linux-2.6.28/include/net/ipv6.h中定义结构体

/*

* IPV6 extension headers

*/

#define IPPROTO_HOPOPTS 0 /* IPv6 hop-by-hop options */

#define IPPROTO_ROUTING 43 /* IPv6 routing header */

#define IPPROTO_FRAGMENT 44 /* IPv6 fragmentation header */

#define IPPROTO_ICMPV6 58 /* ICMPv6 */

#define IPPROTO_NONE 59 /* IPv6 no next header */

#define IPPROTO_DSTOPTS 60 /* IPv6 destination options */

#define IPPROTO_MH 135 /* IPv6 mobility header */

自己定义新的扩展头类型如:

#define NEXTHDR_INDEX 200 /*IPv6 next header */

自己定义新的扩展头类型:

struct index_hdr{ /*index扩展头结构*/

__u8 nexthdr;

__u8 hdrlen;

__u16 reserved;

__u32 skb_index;

};

3、在需要添加头部和删除头部的源文件中添加添加和删除函数,届时直接调用这两个函数即可

static void ip6_index_add(struct sk_buff *skb,unsigned char *data,unsigned int len)

{

struct ipv6hdr *tmp_hdr;

struct ipv6hdr *old_hdr;

struct index_hdr *ih;

u8 prevhdr;

unsigned int hlen;

unsigned int ilen;

ilen=sizeof(struct index_hdr);

hlen=sizeof(struct ipv6hdr);

old_hdr=skb_network_header(skb);

prevhdr=old_hdr->nexthdr;

if(prevhdr!=200){

old_hdr->nexthdr=NEXTHDR_INDEX;

tmp_hdr = kmemdup(skb_network_header(skb), hlen, GFP_ATOMIC);

__skb_pull(skb, hlen); /*使data指针下移hlen长度,将ipv6头部去掉*/

ih = (struct index_hdr*)__skb_push(skb, ilen); /*上移data指针,将index头部添加进去*/

__skb_push(skb, hlen); /*继续上移data指针,将原来的ipv6头部加进去*/

skb_reset_network_header(skb);

memcpy(skb_network_header(skb), tmp_hdr, hlen);

/*为index扩展头赋值*/

ih->nexthdr = prevhdr;

ih->hdrlen = 8;

ih->reserved = 0;

ih->skb_index = htonl(skb->xfrm_index);

skb->truesize += ilen;

ipv6_hdr(skb)->payload_len += ilen;

data = skb->data;

len = skb->len;

kfree(tmp_hdr);

}

}

static void ip6_index_del(struct sk_buff *skb,unsigned char *data,unsigned int len)

{

struct ipv6hdr *tmp_hdr;

struct ipv6hdr *old_hdr;

struct index_hdr *ih;

u8 prevhdr;

unsigned int hlen;

unsigned int ilen;

ilen=sizeof(struct index_hdr);

hlen=sizeof(struct ipv6hdr);

if(ipv6_hdr(skb)->nexthdr == 200){

tmp_hdr = kmemdup(skb_network_header(skb), hlen, GFP_ATOMIC); /*保存ipv6头*/

__skb_pull(skb, hlen); /*下移data指针,去掉ipv6头*/

skb_reset_network_header(skb);

ih=(struct index_hdr *)skb_network_header(skb);

prevhdr = ih->nexthdr;

tmp_hdr->nexthdr = prevhdr;

__skb_pull(skb, ilen); /*下移data指针,去掉index扩展头*/

__skb_push(skb, hlen); /*上移data指针,将原来的ipv6头添加回去*/

skb_reset_network_header(skb);

memcpy(skb_network_header(skb), tmp_hdr, hlen);

skb_reset_network_header(skb);

skb->truesize -= ilen;

ipv6_hdr(skb)->payload_len -= ilen;

kfree(tmp_hdr);

}

}

linux skb 存放数据,请教关于在linux网络驱动层对skb网络数据..._网络编辑_帮考网...相关推荐

  1. VMware linux 虚拟机(ubuntu18.04) 安装TL-WDN5200H 2.0网卡驱动 完美使用(适用于vmware无法桥接网络使用此方法)

    VMware linux 虚拟机(ubuntu18.04) 安装TL-WDN5200H 2.0网卡驱动 完美使用(适用于vmware无法桥接网络使用此方法) # 以下操作均已root用户操作 # 安装 ...

  2. 【电商数仓】数仓搭建之明细数据(data warehouse detail -- DWD)层(用户行为数据之曝光、错误日志表、数据加载脚本,业务数据之评价、订单事实表)

    文章目录 一 曝光日志表 1 思路解析 2 建表语句 3 数据导入 4 查看数据 二 错误日志表 1 思路解析 2 建表语句 3 数据导入 4 查看数据 三 DWD层用户行为数据加载脚本 四 DWD层 ...

  3. linux客户端配置网络打印机,请教linux命令行配置和使用网络共享打印机的..._网络编辑_帮考网...

    怪萌萝莉 答疑小能手 01-04 TA获得超过2613个赞 首先,要启动CUPS打印服务,用下面这个命令: /etc/init.d/cups start 然后在CUPS服务器主机server中,我们要 ...

  4. linux新系统配置网络,怎样配置新安装的Ubuntu版Linux系统的..._网络编辑_帮考网

    由于Ubuntu的Linux内核对于WPA的加密方式支持不是很好,所有使用普通方式的命令行无法连接WPA2类型的路由器. 1.本机使用无线网,未插入网线 2.查看无线上网网卡 3.设置virtualb ...

  5. linux命令怎么退出编辑器,LINUX怎么样退出VI编辑器虚拟机不知道怎么..._网络编辑_帮考网...

    命令是wq 保存并退出. vi保存文件有不同的选项,对应于不同的命令,你可以从下面的命令中选择一个需要的输入: 1.wq 保存文件并退出vi 2.w 保存文件但不退出vi 3.w file 将修改另外 ...

  6. Linux SPI子系统(3):SPI控制器驱动层

    目录 1. 前言 2. SPI控制器驱动 2.1 dts 2.2 匹配注册 2.3 probe函数 2.4 数据收发函数:spi_st_transfer_one 2.5 中断处理程序:spi_st_i ...

  7. 应用统计学大数据方向报名自述_应用统计学与应用统计学大数据方向有什么区别?哪..._统计师_帮考网...

    一.课程设置不同 1.大数据专业将从大数据应用的三个主要层面(即数据管理.系统开发.海量数据分析与挖掘)系统地帮助企业掌握大数据应用中的各种典型问题的解决办法. 包括实现和分析协同过滤算法.运行和学习 ...

  8. 计算机gt是什么单位,数据存储计量单位除了BKMGT,还有什么?换算..._注册计量师_帮考网...

    计算机中存储数据的最小单位:位 bit (比特)(Binary Digits),存放一位二进制数,即 0 或 1,最小的存储单位. 存储容量的基本单位是:bit.B.KB.MB.GB.TB.PB.EB ...

  9. 为什么计算机网络使用数字信号,计算机网络数字数据在数字信道传输时为什么要进行..._网络编辑_帮考网...

    目前主要用于数字信号传输的信号方式基带传输. 基带传输是最基本的数据传输方式,即按数据波的原样,不包含任何调制,在数字通信的信道上直接传送数据.基带 传输不适于传输语言.图像等信息.目前大部分微机局域 ...

  10. linux kernel网络驱动

    Linux Device Driver书籍(17) http://linux.chinaunix.net/techdoc/develop/2008/09/28/1035250.shtml 第 17 章 ...

最新文章

  1. unity打包模型存在的一个问题
  2. 第二阶段—个人工作总结03
  3. 循序渐进——NAnt构建实例
  4. pixelbook安装linux系统,谷歌Pixelbook可以运行Fuchsia操作系统 正测试
  5. 代理模式和动态代理模式_代理模式介绍
  6. C# 实现软件自动更新升级程序
  7. 2017CCPC哈尔滨 D:X-Men
  8. conda 环境迁移
  9. 开发机器学习应用程序的步骤
  10. 美赛 5:评价类模型、插值与拟合模型(十大模型篇)
  11. 服务器端网站自适应,[移动SEO]PC端和移动端最佳适配方案
  12. abp(net core)+easyui+efcore实现仓储管理系统——入库管理之九(四十五)
  13. 手机号码短信验证注册
  14. delete hive_hive执行更新和删除操作
  15. 操作系统实验——进程控制
  16. 大家怎么看阿里云的“云渲染”服务?
  17. 前端存储之cookie、localStorage、sessionStorage、indexDB
  18. Nginx官方文档(十一)【HTTP之ngx_http_core_module】
  19. domino服务器打开邮件,Domino邮件服务器配置(接收、发送).doc
  20. openface源码理解(4)

热门文章

  1. python的print输出格式举例_python中print输出格式是什么
  2. TableOne数据分析工具
  3. 海天蚝油《挑战不可能》现实版听风者展现超强听力
  4. SuperMap iDesktop商场选址分析
  5. 逐步理解 Flask 的 Blueprint(蓝本)
  6. 建模是什么,建模定义,及学习方法
  7. 微信网页第三方登陆 获取用户信息 代码
  8. 推荐一个不错的在线文档分享网站-Scribd,陆续分享我的电子藏书
  9. “你的论文充斥着垃圾,写作一塌糊涂,我读着读着都想撕了它”
  10. Imagenet的中英对应分类