【Atheros】pktgen的ipv6地址处理函数参考及ipv6基本知识
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基本知识的更多相关文章
- ipv6地址累加函数
#include <stdio.h> #include <arpa/inet.h> int main() { int i; int ret; struct in6_addr a ...
- awk函数实现将简化IPV6地址补全
在用awk处理文本时,有些场景需要将简化的IPV6地址补充成完整的IPV6地址,下边函数可简单实现: IPV6地址补全函数 # ipv6地址补全函数 function compipv6(orig_ad ...
- 3. IP地址转换函数
一.字符串表示的IP地址需要被转化为整数(二进制数)方能使用 IPv4地址:点分十进制字符串 IPv6地址:十六进制字符串 有时(如记录日志),我们则要把整数(二进制数)表示的IP地址转化为可读的字符 ...
- 配置IPv6地址跳变——网络测试仪实操
第一部分:什么是IPv6地址跳变? IPv6地址跳变是指IPv6地址进行一系列有规则的变化,Renix支持对IPv6地址进行递增.递减.列表和随机变化. 如当用户想要仿真大量的源IPv6地址变化的数据 ...
- 第11章 拾遗4:IPv6(2)_给计算机配置IPv6地址
4. 给计算机配置IPv6地址 4.1 无状态自动配置IPv6地址 (1)网络拓扑 ①无状态地址自动配置是指不需要DHCP服务器进行管理,由客户端向路由器发送前缀请求(RS)询问其所在网段.路由器收到 ...
- 浏览器访问IPv6地址
http://[IPv6]:port/index.html http://[3ffe:3201:1200:1::91]:8080/index.html 目前现在的网络运营商基本都不支持基于IPv6地址 ...
- Linux中获取本机的最新IPv6地址_更新ddns的脚本
Linux中获取本机的最新IPv6地址_更新ddns的脚本 转载注明来源: 本文链接 来自osnosn的博客,写于 2019-11-07. 运营商提供ipv6地址. 路由器后有台linux机器,通过e ...
- IPv6地址类型和操作
IPv6地址的号段划分和前缀表示法: IPv6拥有128位巨大的地址空间,对于那么大的空间,也不是随意的划分,而是使用按照bit位进行号段划分 地址结构图 全局路由前缀 (48位) 子网ID (16位 ...
- 洛谷 P2815 IPv6地址压缩 题解
P2815 IPv6地址压缩 题目背景 (友情提示:IPv6基础知识曾多次出现在NOIP初赛中)Internet Protocol,互联网协议,即为我们常说的IP.我们目前常说的IP主要指它的第四版, ...
随机推荐
- jmeter 部署问题。
-D systemproperty 1.双网卡机器设置 执行 jmeter-server -Djava.rmi.server.hostname=189.61.143.199 2.在Beanshel ...
- setSystemUiVisibility() 与 getSystemUiVisibility() 显示隐藏状态栏
Android 4.4 Camera 源码里面有一个操作界面的方法: /** * If {@param visible} is false, this hides the action bar a ...
- 深入理解brew link命令
来源:https://newsn.net/say/brew-link-php71.html brew是mac机上面程序猿非常常用的软件包安装方式,其中有两组命令是需要大家知晓的.分别是: 第一组:br ...
- IntelliJ全家桶修改terminal字体的方法
IntelliJ IDEA 设置Terminal 窗口字体大小 我在Setting中查看了所有和Terminal字样有关的设置,都没有找到设置字体大小的方法,原来Terminal也只需要设置Conso ...
- Unable to list target platforms. Please make sure the android sdk path is correct. See the Console for more details.
在android上发布遇到 androidSDK无法找到的问题 http://www.jianshu.com/p/fe4c334ee9fe
- yolo.v2 darknet19结构
Darknet19( (conv1s): Sequential( (0): Sequential( (0): Conv2d_BatchNorm( (conv): Conv2d(3, 32, kerne ...
- StreamingContext、DStream、Receiver深度剖析
本课分成四部分讲解,第一部分对StreamingContext功能及源码剖析:第二部分对DStream功能及源码剖析:第三部分对Receiver功能及源码剖析:最后一部分将StreamingConte ...
- Execution failed for task ':app:transformClassesAndResourcesWithProguardForRelease'.
1.Execution failed for task ':app:transformClassesAndResourcesWithProguardForRelease'. 原因解析: gradle ...
- Hbase 目录树
转自 http://www.cnblogs.com/nexiyi/p/hbase_on_hdfs_directory.html 总所周知,HBase 是天生就是架设在 HDFS 上,在这个分布式文件系 ...
- TCP/IP协议分析(推荐)
一;前言 学习过TCP/IP协议的人多有一种感觉,这东西太抽象了,没有什么数据实例,看完不久就忘了.本文将介绍一种直观的学习方法,利用协议分析工具学习TCP/IP,在学习的过程中能直观的看到数据的具体 ...