【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主要指它的第四版, ...
随机推荐
- IntelliJ IDEA 14.x 的 project 和 module 是啥关系?
使用基于IntelliJ的IDE,如phpstorm.android studio都会对project和module的关系比较糊涂,简单的概括如下: IntelliJ系中的 Project 相当于Ec ...
- sql server 老外博客
Aaron Bertrand Grant Fritchey Brent Ozar Thomas LaRock Pinal Dave Phil Factor SQL Skills w/ Paul Ran ...
- delphi 设置开机自动启动函数
有些程序要设置为开机启动,所以自己写了个函数方便以后使用,供大家参考 procedure TMainForm.SetAutoRun(ok: boolean); var Reg:TRegistry; ...
- What is a mocking framework? Why is it useful?
Today I want to talk about mocking frameworks and why they are useful. In order to do that I first n ...
- Signing Identities, Missing Private Key, Cannot sign App
这个问题发生在重新安装系统后,丢失了之前的private key等.所以解决方法就是提示的revoke and request. 到developer center中找到certificate中对应的 ...
- 制作ubuntu16.04的docker镜像
来自http://www.jianshu.com/p/029a1ed4fd64 背景 因为笔者是在vagrant转移到docker的玩家,所以对系统镜像情有独钟.如果你是windows.mac用户,那 ...
- Java 数字签名原理及产生
数字签名与数字证书 关于数字签名的介绍可以参考以上这篇. 这里稍微说一下不对称加密的方式: 用公钥加密的内容只能用私钥解密,用私钥加密的内容只能用公钥解密. 这样比对称加密更安全 Java 中数字签名 ...
- Linux使用nginx部署Laravel
问题描述 Laravel是PHP下当今最受欢迎的web应用开发框架,github上start数远超第二名Symfony,以前我用这个框架做项目的时候通常就是扔到apache里面,然后配置.htacce ...
- 2017.7.1 mysql安装与启动(已验证可以使用)
下载地址:http://learning.happymmall.com/ 之前一直用解压版安装,启动mysql服务的时候总是失败,这次用mysql installer安装一遍,终于成功启动. 1.下载 ...
- RAP + MOCK
前后端分离式开发的思考 目前大部分公司都实行了前后端分离开发.然而在项目开发过程当中,经常会遇到以下几个尴尬的场景: 1.前端开发依赖于后端接口数据,需要与后端接口联调才能获得数据展示,从而拖慢了开发 ...