问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何在Linux内核中为IPv6添加一种新的扩展头

发布网友 发布时间:2022-04-23 06:21

我来回答

1个回答

热心网友 时间:2023-09-19 22:26

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 = kmemp(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 = kmemp(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内核中为IPv6添加一种新的扩展头

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 NEXTH...

Linux SCADA

ForceSCADA是力控科技信创产品的重要组成部分,具备完全自主知识产权,支持部署在Linux桌面版、服务器版、嵌入式等系统架构下。使用ForceSCADA可以搭建创新性高、扩展性佳、融合度强的SCADA平台,进而构建高效、智能化的监控中心,先进、灵活的...

如何让 RMI 程序同时支持 IPv4 和 IPv6

IPv6 具有很好的可扩展性,这可通过在 IPv6 协议头之后添加新的扩展协议头实现。回页首Java 对 IPv6 的支持Java 从 1.4 开始,已经提供了对 IPv6 的支持。 Java APIs 遵循了如下 IPv6 标准:RFC2373: IPv6 Addressing ArchitectureRFC2553: Basic Socket Interface Extensions for IPv6RFC2732: Format for Liter...

4,ipv6的扩展头有哪些?分别适用于什么环境

目的地选项头:此扩展头包含只能由最终目的地节点所处理的选项。目前,只定义了填充选项,将该头填充为64位边界,以备将来所用。身份验证头(AH):此扩展头提供了一种机制,对IPv6头、扩展头和净荷的某些部分进行加密的较验和计算。封装安全性净荷(ESP)头:这是最后一个扩展头,不进行加密,它指明...

ipv6扩展报头的种类

在IPv6地址中,每个十六进制数中的前导零是可以省略不写的,也就是说,如果一个IPv6地址以零开头,那么这个零可以不写。IPv6是英文“InternetProtocolVersion6”(互联网协议第6版)的缩写,是互联网工程任务组(IETF)设计的用于替代IPv4的下一代IP协议,其地址数量号称可以为全世界的每一粒沙子编上...

谁知道IPV6协议啊??

IPv6是"Internet Protocol Version 6"的缩写,也被称作下一代互联网协议,它是由IETF设计的用来替代现行的IPv4协议的一种新的IP协议。至今互联网大多数应用的是IPv4协议,IPv4协议已经使用了20多年,在这20多年的应用中,IPv4获得了巨大的成功,同时随着应用范围的扩大,它也面临着越来越不容忽视的危机,例如地址匮乏等等...

Ipv6属性常规选项中的5个参数是?

使用扩展头时,将在IPv6报文下一报头字段表明首个扩展报头的类型,再根据该类型对扩展报头进行读取与处理。每个扩展报头同样包含下一报头字段,若接下来有其他扩展报头,即在该字段中继续标明接下来的扩展报头的类型,从而达到添加连续多个扩展报头的目的。在最后一个扩展报头的下一报头字段中,则标明该报文上层协议的类型,...

ISP ipv6 的路由器接口 前缀是多少?

IPv6,全称为"Internet Protocol Version 6",是一种新的IP协议,旨在替代现行的IPv4协议,以解决IPv4协议存在的问题和不足。IPv6具有简化报头、灵活扩展、层次化地址结构、即插即用连网方式、网络层认证与加密、满足服务质量及对移动通信更好支持等特点。IPv6报头由基本报头和扩展报头构成,基本报头固定...

支持ipv6是什么意思

1、对于IPV6的地址来说,它的长度是128位,这样一来相应的地址空间就由原来的数量增加了2^128-2^32个。2、这个ipv6还具备非常灵活的IP报文头部的格式。一般都是利用一系列固定格式扩展头部来替换IPV4里面的一些可变长度选项字段。对于IPV6里面选项部分相应的出现方式变化也是存在的,让路由器能够非常简单...

相对于ip v 4 ip v6的优势主要体现在哪些方面

4、IPv6加入了对自动配置(Auto Configuration)的支持。这是对DHCP协议的改进和扩展,使得网络(尤其是局域网)的管理更加方便和快捷。5、IPv6具有更高的安全性。在使用IPv6网络中用户可以对网络层的数据进行加密并对IP报文进行校验,在IPV6中的加密与鉴别选项提供了分组的保密性与完整性。极大的增强了...

IP是什么

二、IP地址 IP地址是IP网络中数据传输的依据,它标识了IP网络中的一个连接,一台主机可以有多个IP地址。IP分组中的IP地址在网络传输中是保持不变的。 (一).基本地址格式 现在的IP网络使用32位地址,以点分十进制表示,如172.16.0.0。地址格式为:IP地址=网络地址+主机地址 或 IP地址=主机地址+子网地址+主机地址。

如何编译linux内核 Linux内核PDF linux更新内核 linux内核的功能 linux最新内核 linux内核是什么 linux内核详解 linux 内核开发 linux内核能做什么
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
驻马店锦润文化传媒怎么样 驻马店有安达康净水器代理? 夫妻用品正品 夫妻情趣用品如何用才好 请问我把主机里面的零件全买回来后,找人装大概好多钱?还有就是电脑系统... 笔记本电脑马上到了 新买的电脑回来要做什么 我是小白 听说还的分盘... 小白一个 想换新电脑 去电脑城找人配了一台 大家帮看看行不行 主玩... 大一学生男,想买台笔记本电脑不会下载游戏平时就弄弄文档,看看电影,因为... c#编程:我只读取excel文件的第一行,但由于文件很大,读取很缓慢,有没有... 请问为什么我用C#使用NPOI读取excel数据第一遍没有问题,第二遍就报... 加拿大大鹅羽绒服品牌标志是什么? 新浪微博删完了但仍然显示还有一条,该怎么办? Linux下c语言开发怎么添加头文件目录和lib文件目录 袖子上有蓝色三角标志的羽绒服都有哪些品牌 新浪微博删除了已经发布的微博,明明已经删除完了,为什么微博那里却还显示余留一条微博。 linux 下,如何用脚本实现 在一个文件的首行添加一行数据? 大鹅羽绒服的标志是什么? 新浪微博把自己的发的内容都清空后为什么还是显示有数字 linux设备驱动程序该添加哪些头文件 这个羽绒服是什么牌子的?logo是一个大M 为什么博主已经删除微博,手机端还能看到 linux把一个文件里得内容添加到另一个文件得开头,类似于>>追加。但是从头部开始 羽绒服品牌,上臂有一个红色圆圈,里面图案类似于地图的LOGO,是什么牌子 新浪微博为什么我把自己发表文章删除了,怎么之前转发我微博的人在他们的微博里面还是能看见我发表的呢 这是个什么牌子!?见好多羽绒服上面是这标志??? 在新浪微博写了一篇长微博,删除后为何在资料中还会有“她的文章”里面还有我写的长微博? 羽绒服品牌标志大全有谁知道呀?国内国外的都给说说吧! 删完微博後为什麼显示还有3条? 微博上发的文章删除后为什么在百度热议上还能见到? 这个羽绒服是什么牌子的?注意看手臂上的标志 求解、 两只白色企鹅标志的羽绒服是什么牌子 linux中怎么添加自己的头文件 为什么我新浪微博把所有微博删了上面还显示有一篇? 白熊教练年龄 如何在linux下通过makefile把V8库和头文件加进去 用新浪自带写的长微博,删了微博文章还在 羽生结弦的教练为什么叫白熊? 为什么把新浪微博删完了还显示有微博? linux gcc eclipse c++怎么添加头文件 linux怎么重定向一个变量的值到一个文本的头部,sed只能导入一行,我需要的变量的值有很多行,怎么解决? 为什么我把微博删干净了却还显示有两条? 为什么新浪博客的文章删除了还有显示 新浪微薄,里面删掉的微博,等等在进去就又回来了... 在linux下没有的头文件怎么引入 为什么我把微博全部删了之后微博数量还是一直显示有14条的呢? 在Linux下如果要使用接口标志要加什么头文件吗?因为我在使用IFF_UP时会出错,说是未定义 Linux:跳转到文件尾部是shift+G,跳转到文件头部呢? 微信会员系统? 我想在自己的微信公众服务号中加入会员管理的自定义菜单,请问是不是必须要单独开发一套会员管理系统? 我现在申请了一个微信公众号,谁知道微信会员管理是怎么做的