pktgen有很多函数可以作为很好的网络相关的工具函数,这里列出ipv6中1:0:0:0:0:0:0:1和1::1这两种地址形式相互转化的工具函数。

第一个函数,用于把一个1:0:0:0:0:0:0:1形式的地址转化为1::1

/*
* scan_ip6, fmt_ip taken from dietlibc-0.21
* Author Felix von Leitner <felix-dietlibc@fefe.de>
*
* Slightly modified for kernel.
* Should be candidate for net/ipv4/utils.c
* --ro
*/ static unsigned int scan_ip6(const char *s, char ip[])
{
unsigned int i;
unsigned int len = ;
unsigned long u;
char suffix[];
unsigned int prefixlen = ;
unsigned int suffixlen = ;
__be32 tmp;
char *pos; for (i = ; i < ; i++)
ip[i] = ; for (;;) {
if (*s == ':') {
len++;
if (s[] == ':') { /* Found "::", skip to part 2 */
s += ;
len++;
break;
}
s++;
} u = simple_strtoul(s, &pos, );
i = pos - s;
if (!i)
return ;
if (prefixlen == && s[i] == '.') { /* the last 4 bytes may be written as IPv4 address */ tmp = in_aton(s);
memcpy((struct in_addr *)(ip + ), &tmp, sizeof(tmp));
return i + len;
}
ip[prefixlen++] = (u >> );
ip[prefixlen++] = (u & );
s += i;
len += i;
if (prefixlen == )
return len;
} /* part 2, after "::" */
for (;;) {
if (*s == ':') {
if (suffixlen == )
break;
s++;
len++;
} else if (suffixlen != )
break; u = simple_strtol(s, &pos, );
i = pos - s;
if (!i) {
if (*s)
len--;
break;
}
if (suffixlen + prefixlen <= && s[i] == '.') {
tmp = in_aton(s);
memcpy((struct in_addr *)(suffix + suffixlen), &tmp,
sizeof(tmp));
suffixlen += ;
len += strlen(s);
break;
}
suffix[suffixlen++] = (u >> );
suffix[suffixlen++] = (u & );
s += i;
len += i;
if (prefixlen + suffixlen == )
break;
}
for (i = ; i < suffixlen; i++)
ip[ - suffixlen + i] = suffix[i];
return len;
}

第二个函数完成反向的转换,把1::1恢复成完成的地址:

static unsigned int fmt_ip6(char *s, const char ip[])
{
unsigned int len;
unsigned int i;
unsigned int temp;
unsigned int compressing;
int j; len = ;
compressing = ;
for (j = ; j < ; j += ) { #ifdef V4MAPPEDPREFIX
if (j == && !memcmp(ip, V4mappedprefix, )) {
inet_ntoa_r(*(struct in_addr *)(ip + ), s);
temp = strlen(s);
return len + temp;
}
#endif
temp = ((unsigned long)(unsigned char)ip[j] << ) +
(unsigned long)(unsigned char)ip[j + ];
if (temp == ) {
if (!compressing) {
compressing = ;
if (j == ) {
*s++ = ':';
++len;
}
}
} else {
if (compressing) {
compressing = ;
*s++ = ':';
++len;
}
i = fmt_xlong(s, temp);
len += i;
s += i;
if (j < ) {
*s++ = ':';
++len;
}
}
}
if (compressing) {
*s++ = ':';
++len;
}
*s = ;
return len;
}

下面附上ipv6的一些相关的基础知识,看懂这些也更有助于理解上面的两个函数,ps:这好像是我之前在一些网站上截的,我当时也记了源地址,但是源网站已经挂掉了:

IPv4地址是类似 A.B.C.D 的格式,它是32位,用.分成四段,用10进制表示;而IPv6地址类似X:X:X:X:X:X:X:X的格式,它是128位的,用:分 成8段,用16进制表示,每一段的值从8位扩充到16位。

RFC2373 中定义了完整的IPv6地址表示:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx

例如: 2001:0000: 1F 1F :0000:0000:0100: 11A 0:ADDF

为简化表示, rfc2373提出每段中前面的0可以省略,连续的0可省略为::,但只能出现一次。例如:

1080:0:0:0:8:800: 200C : 417A 可简写为 1080::8:800: 200C : 417A

FF01:0:0:0:0:0:0:101 可简写为 FF01::101

0:0:0:0:0:0:0:1 可简写为 ::1

0:0:0:0:0:0:0:0 可简写为 ::

这里给出一个表格,以比较IPv4和IPv6地址对应关系和区别。

IPv4

IPv6

组播地址(224.0.0.0/4)

IPv6组播地址(FF00::/8)

有广播地址

无广播,只有任播(anycast)

未指定地址为 0.0.0 .0

未指定地址为 ::

回路地址为 127.0.0.1

回路地址为 ::1

私有地址( 10.0.0 .0/8、172.16.0.0/12和192.168.0.0/16)

本地站点地址( FEC0::/48)

Microsoft自动专用IP寻址自动配置的地址(169.254.0.0/16)

本地链路地址( FE80::/64)

表达方式:点分十进制

表达方式:冒号十六进制式

子网掩码表示:以点阵十进制表示法或前缀长度表示法( CIDR)

子网掩码表示:仅使用前缀长度表示法( CIDR)

常见的IPv6地址及其前缀:

::/128  即0:0:0:0:0:0:0:0,只能作为尚未获得正式地址的主机的源地址,不能作为目的地址,不能分配给真实的网络接口。

::1/128 即0:0:0:0:0:0:0:1,回环地址,相当于IPv4中的localhost(127.0.0.1),ping locahost可得到此地址。

2001::/16  全球可聚合地址,由 IANA 按地域和ISP进行分配,是最常用的IPv6地址,属于单播地址。

2002::/16  6 to 4 地址,用于6to4自动构造隧道技术的地址,属于单播地址。

3ffe::/16   早期开始的IPv6 6bone试验网 地址,属于单播地址。

fe80::/10   本地链路地址,用于单一链路,适用于自动配置、邻机发现等,路由器不转发以fe80开头的地址。

ff00::/8  组播地址。

::A.B.C.D  兼容IPv4的IPv6地址,其中<A.B.C.D>代表IPv4地址。自动将IPv6包以隧道方式在IPv4网络中传送的IPv4/IPv6节点将使用这些地址。

::FFFF:A.B.C.D   是IPv4映射过来的IPv6地址,其中<A.B.C.D>代表IPv4地址,例如 ::ffff:202.120.2.30 ,它是在不支持IPv6的网上用于表示IPv4节点。

【Atheros】pktgen的ipv6地址处理函数参考及ipv6基本知识的更多相关文章

  1. ipv6地址累加函数

    #include <stdio.h> #include <arpa/inet.h> int main() { int i; int ret; struct in6_addr a ...

  2. awk函数实现将简化IPV6地址补全

    在用awk处理文本时,有些场景需要将简化的IPV6地址补充成完整的IPV6地址,下边函数可简单实现: IPV6地址补全函数 # ipv6地址补全函数 function compipv6(orig_ad ...

  3. 3. IP地址转换函数

    一.字符串表示的IP地址需要被转化为整数(二进制数)方能使用 IPv4地址:点分十进制字符串 IPv6地址:十六进制字符串 有时(如记录日志),我们则要把整数(二进制数)表示的IP地址转化为可读的字符 ...

  4. 配置IPv6地址跳变——网络测试仪实操

    第一部分:什么是IPv6地址跳变? IPv6地址跳变是指IPv6地址进行一系列有规则的变化,Renix支持对IPv6地址进行递增.递减.列表和随机变化. 如当用户想要仿真大量的源IPv6地址变化的数据 ...

  5. 第11章 拾遗4:IPv6(2)_给计算机配置IPv6地址

    4. 给计算机配置IPv6地址 4.1 无状态自动配置IPv6地址 (1)网络拓扑 ①无状态地址自动配置是指不需要DHCP服务器进行管理,由客户端向路由器发送前缀请求(RS)询问其所在网段.路由器收到 ...

  6. 浏览器访问IPv6地址

    http://[IPv6]:port/index.html http://[3ffe:3201:1200:1::91]:8080/index.html 目前现在的网络运营商基本都不支持基于IPv6地址 ...

  7. Linux中获取本机的最新IPv6地址_更新ddns的脚本

    Linux中获取本机的最新IPv6地址_更新ddns的脚本 转载注明来源: 本文链接 来自osnosn的博客,写于 2019-11-07. 运营商提供ipv6地址. 路由器后有台linux机器,通过e ...

  8. IPv6地址类型和操作

    IPv6地址的号段划分和前缀表示法: IPv6拥有128位巨大的地址空间,对于那么大的空间,也不是随意的划分,而是使用按照bit位进行号段划分 地址结构图 全局路由前缀 (48位) 子网ID (16位 ...

  9. 洛谷 P2815 IPv6地址压缩 题解

    P2815 IPv6地址压缩 题目背景 (友情提示:IPv6基础知识曾多次出现在NOIP初赛中)Internet Protocol,互联网协议,即为我们常说的IP.我们目前常说的IP主要指它的第四版, ...

随机推荐

  1. 基于avalon+jquery做的bootstrap分页控件

    刚开始学习avalon,项目需要就尝试写了个分页控件Pager.js:基于BootStrap样式这个大家都很熟悉 在这里推荐下国产前端神器avalon:确实好用,帮我解决了很多前端问题. 不多说了,代 ...

  2. sql-----STR 函数

    原文:sql-----STR 函数 sql-----STR 函数 STR 函数由数字数据转换来的字符数据. 语法 STR ( float_expression [ , length [ , decim ...

  3. HashMap在高并发下引起的死循环

    HashMap事实上并非线程安全的,在高并发的情况下,是非常可能发生死循环的,由此造成CPU 100%,这是非常可怕的.所以在多线程的情况下,用HashMap是非常不妥当的行为,应採用线程安全类Con ...

  4. iOS教程:如何使用Core Data – 预加载和引入数据

    这是接着上一次<iOS教程:Core Data数据持久性存储基础教程>的后续教程,程序也会使用上一次制作完成的. 再上一个教程中,我们只做了一个数据模型,之后我们使用这个数据模型中的数据创 ...

  5. 避免"松鼠症"

    转载: http://www.cnblogs.com/freeflying/p/7725385.html ted演讲: http://www.bilibili.com/video/av294900/

  6. CSS的7种常用的垂直居中的方法

    1.绝对定位上下百分之五十然后上外边距做外边距都是他的宽高的一半 #child{ width: 200px; height: 150px; position: absolute; left: 50%; ...

  7. 工具分享:GitHub的克隆工具Cl0neMast3r,轻松搞定各种测试

    GitHub,相信大家并不陌生,咱搞技术的应该都会用到它,GitHub主要是进行代码工具的存储.下载等工作.今天介绍一款让我们操作GitHub相关工作变的更简单的工具, GitHub的克隆工具. Cl ...

  8. 关于VS下的应用程序出现0xc000007b的问题以及OpenCV相关的0xc000007b问题

    本文参考过其他一些文章: http://www.cnblogs.com/csuftzzk/p/windows_launch_error_0xc000007b.html 这个问题在网上一查一大堆,主要的 ...

  9. Http协议三次握手过程

    Http协议三次握手过程   TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: ...

  10. MonoBehaviour.FixedUpdate 固定更新

    function FixedUpdate () : void Description描述 This function is called every fixed framerate frame, if ...