Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
6fb9114e
cloud-kernel
项目概览
openanolis
/
cloud-kernel
1 年多 前同步成功
通知
160
Star
36
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
2
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
cloud-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
2
合并请求
2
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
6fb9114e
编写于
4月 12, 2008
作者:
D
David S. Miller
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'net-2.6.26-misc-20080412b' of
git://git.linux-ipv6.org/gitroot/yoshfuji/linux-2.6-dev
上级
03e1ad7b
05f175cd
变更
20
隐藏空白更改
内联
并排
Showing
20 changed file
with
264 addition
and
238 deletion
+264
-238
include/linux/in6.h
include/linux/in6.h
+8
-0
include/net/addrconf.h
include/net/addrconf.h
+22
-65
include/net/ip6_route.h
include/net/ip6_route.h
+3
-3
include/net/ipv6.h
include/net/ipv6.h
+12
-14
include/net/mip6.h
include/net/mip6.h
+0
-3
include/net/ndisc.h
include/net/ndisc.h
+7
-7
net/ipv6/addrconf.c
net/ipv6/addrconf.c
+55
-27
net/ipv6/fib6_rules.c
net/ipv6/fib6_rules.c
+1
-1
net/ipv6/ip6_input.c
net/ipv6/ip6_input.c
+12
-14
net/ipv6/ip6_output.c
net/ipv6/ip6_output.c
+1
-1
net/ipv6/ip6mr.c
net/ipv6/ip6mr.c
+14
-23
net/ipv6/ipv6_sockglue.c
net/ipv6/ipv6_sockglue.c
+69
-12
net/ipv6/mcast.c
net/ipv6/mcast.c
+27
-33
net/ipv6/mip6.c
net/ipv6/mip6.c
+2
-2
net/ipv6/ndisc.c
net/ipv6/ndisc.c
+13
-14
net/ipv6/raw.c
net/ipv6/raw.c
+8
-12
net/ipv6/route.c
net/ipv6/route.c
+3
-3
net/ipv6/sit.c
net/ipv6/sit.c
+1
-1
net/ipv6/tcp_ipv6.c
net/ipv6/tcp_ipv6.c
+2
-2
net/ipv6/udp.c
net/ipv6/udp.c
+4
-1
未找到文件。
include/linux/in6.h
浏览文件 @
6fb9114e
...
...
@@ -48,6 +48,14 @@ extern const struct in6_addr in6addr_any;
#define IN6ADDR_ANY_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } }
extern
const
struct
in6_addr
in6addr_loopback
;
#define IN6ADDR_LOOPBACK_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } } }
#ifdef __KERNEL__
extern
const
struct
in6_addr
in6addr_linklocal_allnodes
;
#define IN6ADDR_LINKLOCAL_ALLNODES_INIT \
{ { { 0xff,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } } }
extern
const
struct
in6_addr
in6addr_linklocal_allrouters
;
#define IN6ADDR_LINKLOCAL_ALLROUTERS_INIT \
{ { { 0xff,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2 } } }
#endif
struct
sockaddr_in6
{
unsigned
short
int
sin6_family
;
/* AF_INET6 */
...
...
include/net/addrconf.h
浏览文件 @
6fb9114e
...
...
@@ -76,12 +76,12 @@ extern int ipv6_chk_prefix(struct in6_addr *addr,
struct
net_device
*
dev
);
extern
struct
inet6_ifaddr
*
ipv6_get_ifaddr
(
struct
net
*
net
,
struct
in6_addr
*
addr
,
const
struct
in6_addr
*
addr
,
struct
net_device
*
dev
,
int
strict
);
extern
int
ipv6_dev_get_saddr
(
struct
net_device
*
dev
,
struct
in6_addr
*
daddr
,
const
struct
in6_addr
*
daddr
,
unsigned
int
srcprefs
,
struct
in6_addr
*
saddr
);
extern
int
ipv6_get_lladdr
(
struct
net_device
*
dev
,
...
...
@@ -105,25 +105,27 @@ extern u32 ipv6_addr_label(const struct in6_addr *addr,
/*
* multicast prototypes (mcast.c)
*/
extern
int
ipv6_sock_mc_join
(
struct
sock
*
sk
,
int
ifindex
,
struct
in6_addr
*
addr
);
extern
int
ipv6_sock_mc_drop
(
struct
sock
*
sk
,
int
ifindex
,
struct
in6_addr
*
addr
);
extern
int
ipv6_sock_mc_join
(
struct
sock
*
sk
,
int
ifindex
,
const
struct
in6_addr
*
addr
);
extern
int
ipv6_sock_mc_drop
(
struct
sock
*
sk
,
int
ifindex
,
const
struct
in6_addr
*
addr
);
extern
void
ipv6_sock_mc_close
(
struct
sock
*
sk
);
extern
int
inet6_mc_check
(
struct
sock
*
sk
,
struct
in6_addr
*
mc_addr
,
struct
in6_addr
*
src_addr
);
extern
int
inet6_mc_check
(
struct
sock
*
sk
,
const
struct
in6_addr
*
mc_addr
,
const
struct
in6_addr
*
src_addr
);
extern
int
ipv6_dev_mc_inc
(
struct
net_device
*
dev
,
struct
in6_addr
*
addr
);
extern
int
__ipv6_dev_mc_dec
(
struct
inet6_dev
*
idev
,
struct
in6_addr
*
addr
);
extern
int
ipv6_dev_mc_dec
(
struct
net_device
*
dev
,
struct
in6_addr
*
addr
);
extern
int
ipv6_dev_mc_inc
(
struct
net_device
*
dev
,
const
struct
in6_addr
*
addr
);
extern
int
__ipv6_dev_mc_dec
(
struct
inet6_dev
*
idev
,
const
struct
in6_addr
*
addr
);
extern
int
ipv6_dev_mc_dec
(
struct
net_device
*
dev
,
const
struct
in6_addr
*
addr
);
extern
void
ipv6_mc_up
(
struct
inet6_dev
*
idev
);
extern
void
ipv6_mc_down
(
struct
inet6_dev
*
idev
);
extern
void
ipv6_mc_init_dev
(
struct
inet6_dev
*
idev
);
extern
void
ipv6_mc_destroy_dev
(
struct
inet6_dev
*
idev
);
extern
void
addrconf_dad_failure
(
struct
inet6_ifaddr
*
ifp
);
extern
int
ipv6_chk_mcast_addr
(
struct
net_device
*
dev
,
struct
in6_addr
*
group
,
struct
in6_addr
*
src_addr
);
extern
int
ipv6_chk_mcast_addr
(
struct
net_device
*
dev
,
const
struct
in6_addr
*
group
,
const
struct
in6_addr
*
src_addr
);
extern
int
ipv6_is_mld
(
struct
sk_buff
*
skb
,
int
nexthdr
);
extern
void
addrconf_prefix_rcv
(
struct
net_device
*
dev
,
u8
*
opt
,
int
len
);
...
...
@@ -189,25 +191,6 @@ static inline void in6_ifa_put(struct inet6_ifaddr *ifp)
#define in6_ifa_hold(ifp) atomic_inc(&(ifp)->refcnt)
/*
* Hash function taken from net_alias.c
*/
static
__inline__
u8
ipv6_addr_hash
(
const
struct
in6_addr
*
addr
)
{
__u32
word
;
/*
* We perform the hash function over the last 64 bits of the address
* This will include the IEEE address token on links that support it.
*/
word
=
(
__force
u32
)(
addr
->
s6_addr32
[
2
]
^
addr
->
s6_addr32
[
3
]);
word
^=
(
word
>>
16
);
word
^=
(
word
>>
8
);
return
((
word
^
(
word
>>
4
))
&
0x0f
);
}
/*
* compute link-local solicited-node multicast address
...
...
@@ -222,17 +205,6 @@ static inline void addrconf_addr_solict_mult(const struct in6_addr *addr,
htonl
(
0xFF000000
)
|
addr
->
s6_addr32
[
3
]);
}
static
inline
void
ipv6_addr_all_nodes
(
struct
in6_addr
*
addr
)
{
ipv6_addr_set
(
addr
,
htonl
(
0xFF020000
),
0
,
0
,
htonl
(
0x1
));
}
static
inline
void
ipv6_addr_all_routers
(
struct
in6_addr
*
addr
)
{
ipv6_addr_set
(
addr
,
htonl
(
0xFF020000
),
0
,
0
,
htonl
(
0x2
));
}
static
inline
int
ipv6_addr_is_multicast
(
const
struct
in6_addr
*
addr
)
{
return
(
addr
->
s6_addr32
[
0
]
&
htonl
(
0xFF000000
))
==
htonl
(
0xFF000000
);
...
...
@@ -240,34 +212,19 @@ static inline int ipv6_addr_is_multicast(const struct in6_addr *addr)
static
inline
int
ipv6_addr_is_ll_all_nodes
(
const
struct
in6_addr
*
addr
)
{
return
(
addr
->
s6_addr32
[
0
]
==
htonl
(
0xff020000
)
&&
addr
->
s6_addr32
[
1
]
==
0
&&
addr
->
s6_addr32
[
2
]
==
0
&&
addr
->
s6_addr32
[
3
]
==
htonl
(
0x00000001
));
return
(((
addr
->
s6_addr32
[
0
]
^
htonl
(
0xff020000
))
|
addr
->
s6_addr32
[
1
]
|
addr
->
s6_addr32
[
2
]
|
(
addr
->
s6_addr32
[
3
]
^
htonl
(
0x00000001
)))
==
0
);
}
static
inline
int
ipv6_addr_is_ll_all_routers
(
const
struct
in6_addr
*
addr
)
{
return
(
addr
->
s6_addr32
[
0
]
==
htonl
(
0xff020000
)
&&
addr
->
s6_addr32
[
1
]
==
0
&&
addr
->
s6_addr32
[
2
]
==
0
&&
addr
->
s6_addr32
[
3
]
==
htonl
(
0x00000002
));
return
(((
addr
->
s6_addr32
[
0
]
^
htonl
(
0xff020000
))
|
addr
->
s6_addr32
[
1
]
|
addr
->
s6_addr32
[
2
]
|
(
addr
->
s6_addr32
[
3
]
^
htonl
(
0x00000002
)))
==
0
);
}
static
inline
int
ipv6_isatap_eui64
(
u8
*
eui
,
__be32
addr
)
{
eui
[
0
]
=
(
ipv4_is_zeronet
(
addr
)
||
ipv4_is_private_10
(
addr
)
||
ipv4_is_loopback
(
addr
)
||
ipv4_is_linklocal_169
(
addr
)
||
ipv4_is_private_172
(
addr
)
||
ipv4_is_test_192
(
addr
)
||
ipv4_is_anycast_6to4
(
addr
)
||
ipv4_is_private_192
(
addr
)
||
ipv4_is_test_198
(
addr
)
||
ipv4_is_multicast
(
addr
)
||
ipv4_is_lbcast
(
addr
))
?
0x00
:
0x02
;
eui
[
1
]
=
0
;
eui
[
2
]
=
0x5E
;
eui
[
3
]
=
0xFE
;
memcpy
(
eui
+
4
,
&
addr
,
4
);
return
0
;
}
extern
int
__ipv6_isatap_ifid
(
u8
*
eui
,
__be32
addr
);
static
inline
int
ipv6_addr_is_isatap
(
const
struct
in6_addr
*
addr
)
{
...
...
include/net/ip6_route.h
浏览文件 @
6fb9114e
...
...
@@ -61,13 +61,13 @@ extern int ip6_ins_rt(struct rt6_info *);
extern
int
ip6_del_rt
(
struct
rt6_info
*
);
extern
struct
rt6_info
*
rt6_lookup
(
struct
net
*
net
,
struct
in6_addr
*
daddr
,
struct
in6_addr
*
saddr
,
const
struct
in6_addr
*
daddr
,
const
struct
in6_addr
*
saddr
,
int
oif
,
int
flags
);
extern
struct
dst_entry
*
icmp6_dst_alloc
(
struct
net_device
*
dev
,
struct
neighbour
*
neigh
,
struct
in6_addr
*
addr
);
const
struct
in6_addr
*
addr
);
extern
int
icmp6_dst_gc
(
int
*
more
);
extern
void
fib6_force_start_gc
(
struct
net
*
net
);
...
...
include/net/ipv6.h
浏览文件 @
6fb9114e
...
...
@@ -280,12 +280,10 @@ static inline int
ipv6_masked_addr_cmp
(
const
struct
in6_addr
*
a1
,
const
struct
in6_addr
*
m
,
const
struct
in6_addr
*
a2
)
{
unsigned
int
i
;
for
(
i
=
0
;
i
<
4
;
i
++
)
if
((
a1
->
s6_addr32
[
i
]
^
a2
->
s6_addr32
[
i
])
&
m
->
s6_addr32
[
i
])
return
1
;
return
0
;
return
(
!!
(((
a1
->
s6_addr32
[
0
]
^
a2
->
s6_addr32
[
0
])
&
m
->
s6_addr32
[
0
])
|
((
a1
->
s6_addr32
[
1
]
^
a2
->
s6_addr32
[
1
])
&
m
->
s6_addr32
[
1
])
|
((
a1
->
s6_addr32
[
2
]
^
a2
->
s6_addr32
[
2
])
&
m
->
s6_addr32
[
2
])
|
((
a1
->
s6_addr32
[
3
]
^
a2
->
s6_addr32
[
3
])
&
m
->
s6_addr32
[
3
])));
}
static
inline
void
ipv6_addr_copy
(
struct
in6_addr
*
a1
,
const
struct
in6_addr
*
a2
)
...
...
@@ -320,10 +318,10 @@ static inline void ipv6_addr_set(struct in6_addr *addr,
static
inline
int
ipv6_addr_equal
(
const
struct
in6_addr
*
a1
,
const
struct
in6_addr
*
a2
)
{
return
(
a1
->
s6_addr32
[
0
]
==
a2
->
s6_addr32
[
0
]
&&
a1
->
s6_addr32
[
1
]
==
a2
->
s6_addr32
[
1
]
&&
a1
->
s6_addr32
[
2
]
==
a2
->
s6_addr32
[
2
]
&&
a1
->
s6_addr32
[
3
]
==
a2
->
s6_addr32
[
3
]
);
return
(
((
a1
->
s6_addr32
[
0
]
^
a2
->
s6_addr32
[
0
])
|
(
a1
->
s6_addr32
[
1
]
^
a2
->
s6_addr32
[
1
])
|
(
a1
->
s6_addr32
[
2
]
^
a2
->
s6_addr32
[
2
])
|
(
a1
->
s6_addr32
[
3
]
^
a2
->
s6_addr32
[
3
]))
==
0
);
}
static
inline
int
__ipv6_prefix_equal
(
const
__be32
*
a1
,
const
__be32
*
a2
,
...
...
@@ -371,8 +369,8 @@ static inline int ipv6_addr_any(const struct in6_addr *a)
static
inline
int
ipv6_addr_v4mapped
(
const
struct
in6_addr
*
a
)
{
return
((
a
->
s6_addr32
[
0
]
|
a
->
s6_addr32
[
1
]
)
==
0
&&
a
->
s6_addr32
[
2
]
==
htonl
(
0x0000ffff
)
);
return
((
a
->
s6_addr32
[
0
]
|
a
->
s6_addr32
[
1
]
|
(
a
->
s6_addr32
[
2
]
^
htonl
(
0x0000ffff
)))
==
0
);
}
/*
...
...
@@ -453,8 +451,8 @@ extern int ip6_xmit(struct sock *sk,
extern
int
ip6_nd_hdr
(
struct
sock
*
sk
,
struct
sk_buff
*
skb
,
struct
net_device
*
dev
,
struct
in6_addr
*
saddr
,
struct
in6_addr
*
daddr
,
const
struct
in6_addr
*
saddr
,
const
struct
in6_addr
*
daddr
,
int
proto
,
int
len
);
extern
int
ip6_find_1stfragopt
(
struct
sk_buff
*
skb
,
u8
**
nexthdr
);
...
...
include/net/mip6.h
浏览文件 @
6fb9114e
...
...
@@ -28,9 +28,6 @@
#include <linux/skbuff.h>
#include <net/sock.h>
#define MIP6_OPT_PAD_1 0
#define MIP6_OPT_PAD_N 1
/*
* Mobility Header
*/
...
...
include/net/ndisc.h
浏览文件 @
6fb9114e
...
...
@@ -94,17 +94,17 @@ extern int ndisc_rcv(struct sk_buff *skb);
extern
void
ndisc_send_ns
(
struct
net_device
*
dev
,
struct
neighbour
*
neigh
,
struct
in6_addr
*
solicit
,
struct
in6_addr
*
daddr
,
struct
in6_addr
*
saddr
);
const
struct
in6_addr
*
solicit
,
const
struct
in6_addr
*
daddr
,
const
struct
in6_addr
*
saddr
);
extern
void
ndisc_send_rs
(
struct
net_device
*
dev
,
struct
in6_addr
*
saddr
,
struct
in6_addr
*
daddr
);
const
struct
in6_addr
*
saddr
,
const
struct
in6_addr
*
daddr
);
extern
void
ndisc_send_redirect
(
struct
sk_buff
*
skb
,
struct
neighbour
*
neigh
,
struct
in6_addr
*
target
);
const
struct
in6_addr
*
target
);
extern
int
ndisc_mc_map
(
struct
in6_addr
*
addr
,
char
*
buf
,
struct
net_device
*
dev
,
int
dir
);
...
...
@@ -134,7 +134,7 @@ extern int ndisc_ifinfo_sysctl_change(struct ctl_table *ctl,
extern
void
inet6_ifinfo_notify
(
int
event
,
struct
inet6_dev
*
idev
);
static
inline
struct
neighbour
*
ndisc_get_neigh
(
struct
net_device
*
dev
,
struct
in6_addr
*
addr
)
static
inline
struct
neighbour
*
ndisc_get_neigh
(
struct
net_device
*
dev
,
const
struct
in6_addr
*
addr
)
{
if
(
dev
)
...
...
net/ipv6/addrconf.c
浏览文件 @
6fb9114e
...
...
@@ -222,6 +222,8 @@ static struct ipv6_devconf ipv6_devconf_dflt __read_mostly = {
/* IPv6 Wildcard Address and Loopback Address defined by RFC2553 */
const
struct
in6_addr
in6addr_any
=
IN6ADDR_ANY_INIT
;
const
struct
in6_addr
in6addr_loopback
=
IN6ADDR_LOOPBACK_INIT
;
const
struct
in6_addr
in6addr_linklocal_allnodes
=
IN6ADDR_LINKLOCAL_ALLNODES_INIT
;
const
struct
in6_addr
in6addr_linklocal_allrouters
=
IN6ADDR_LINKLOCAL_ALLROUTERS_INIT
;
/* Check if a valid qdisc is available */
static
inline
int
addrconf_qdisc_ok
(
struct
net_device
*
dev
)
...
...
@@ -321,7 +323,6 @@ EXPORT_SYMBOL(in6_dev_finish_destroy);
static
struct
inet6_dev
*
ipv6_add_dev
(
struct
net_device
*
dev
)
{
struct
inet6_dev
*
ndev
;
struct
in6_addr
maddr
;
ASSERT_RTNL
();
...
...
@@ -406,8 +407,7 @@ static struct inet6_dev * ipv6_add_dev(struct net_device *dev)
rcu_assign_pointer
(
dev
->
ip6_ptr
,
ndev
);
/* Join all-node multicast group */
ipv6_addr_all_nodes
(
&
maddr
);
ipv6_dev_mc_inc
(
dev
,
&
maddr
);
ipv6_dev_mc_inc
(
dev
,
&
in6addr_linklocal_allnodes
);
return
ndev
;
}
...
...
@@ -433,18 +433,15 @@ static void dev_forward_change(struct inet6_dev *idev)
{
struct
net_device
*
dev
;
struct
inet6_ifaddr
*
ifa
;
struct
in6_addr
addr
;
if
(
!
idev
)
return
;
dev
=
idev
->
dev
;
if
(
dev
&&
(
dev
->
flags
&
IFF_MULTICAST
))
{
ipv6_addr_all_routers
(
&
addr
);
if
(
idev
->
cnf
.
forwarding
)
ipv6_dev_mc_inc
(
dev
,
&
addr
);
ipv6_dev_mc_inc
(
dev
,
&
in6addr_linklocal_allrouters
);
else
ipv6_dev_mc_dec
(
dev
,
&
addr
);
ipv6_dev_mc_dec
(
dev
,
&
in6addr_linklocal_allrouters
);
}
for
(
ifa
=
idev
->
addr_list
;
ifa
;
ifa
=
ifa
->
if_next
)
{
if
(
ifa
->
flags
&
IFA_F_TENTATIVE
)
...
...
@@ -541,6 +538,25 @@ ipv6_link_dev_addr(struct inet6_dev *idev, struct inet6_ifaddr *ifp)
*
ifap
=
ifp
;
}
/*
* Hash function taken from net_alias.c
*/
static
u8
ipv6_addr_hash
(
const
struct
in6_addr
*
addr
)
{
__u32
word
;
/*
* We perform the hash function over the last 64 bits of the address
* This will include the IEEE address token on links that support it.
*/
word
=
(
__force
u32
)(
addr
->
s6_addr32
[
2
]
^
addr
->
s6_addr32
[
3
]);
word
^=
(
word
>>
16
);
word
^=
(
word
>>
8
);
return
((
word
^
(
word
>>
4
))
&
0x0f
);
}
/* On success it returns ifp with increased reference count */
static
struct
inet6_ifaddr
*
...
...
@@ -921,7 +937,7 @@ struct ipv6_saddr_score {
};
struct
ipv6_saddr_dst
{
struct
in6_addr
*
addr
;
const
struct
in6_addr
*
addr
;
int
ifindex
;
int
scope
;
int
label
;
...
...
@@ -1055,7 +1071,7 @@ static int ipv6_get_saddr_eval(struct ipv6_saddr_score *score,
}
int
ipv6_dev_get_saddr
(
struct
net_device
*
dst_dev
,
struct
in6_addr
*
daddr
,
unsigned
int
prefs
,
const
struct
in6_addr
*
daddr
,
unsigned
int
prefs
,
struct
in6_addr
*
saddr
)
{
struct
ipv6_saddr_score
scores
[
2
],
...
...
@@ -1290,7 +1306,7 @@ int ipv6_chk_prefix(struct in6_addr *addr, struct net_device *dev)
EXPORT_SYMBOL
(
ipv6_chk_prefix
);
struct
inet6_ifaddr
*
ipv6_get_ifaddr
(
struct
net
*
net
,
struct
in6_addr
*
addr
,
struct
inet6_ifaddr
*
ipv6_get_ifaddr
(
struct
net
*
net
,
const
struct
in6_addr
*
addr
,
struct
net_device
*
dev
,
int
strict
)
{
struct
inet6_ifaddr
*
ifp
;
...
...
@@ -1475,6 +1491,29 @@ static int addrconf_ifid_infiniband(u8 *eui, struct net_device *dev)
return
0
;
}
int
__ipv6_isatap_ifid
(
u8
*
eui
,
__be32
addr
)
{
eui
[
0
]
=
(
ipv4_is_zeronet
(
addr
)
||
ipv4_is_private_10
(
addr
)
||
ipv4_is_loopback
(
addr
)
||
ipv4_is_linklocal_169
(
addr
)
||
ipv4_is_private_172
(
addr
)
||
ipv4_is_test_192
(
addr
)
||
ipv4_is_anycast_6to4
(
addr
)
||
ipv4_is_private_192
(
addr
)
||
ipv4_is_test_198
(
addr
)
||
ipv4_is_multicast
(
addr
)
||
ipv4_is_lbcast
(
addr
))
?
0x00
:
0x02
;
eui
[
1
]
=
0
;
eui
[
2
]
=
0x5E
;
eui
[
3
]
=
0xFE
;
memcpy
(
eui
+
4
,
&
addr
,
4
);
return
0
;
}
EXPORT_SYMBOL
(
__ipv6_isatap_ifid
);
static
int
addrconf_ifid_sit
(
u8
*
eui
,
struct
net_device
*
dev
)
{
if
(
dev
->
priv_flags
&
IFF_ISATAP
)
return
__ipv6_isatap_ifid
(
eui
,
*
(
__be32
*
)
dev
->
dev_addr
);
return
-
1
;
}
static
int
ipv6_generate_eui64
(
u8
*
eui
,
struct
net_device
*
dev
)
{
switch
(
dev
->
type
)
{
...
...
@@ -1487,8 +1526,7 @@ static int ipv6_generate_eui64(u8 *eui, struct net_device *dev)
case
ARPHRD_INFINIBAND
:
return
addrconf_ifid_infiniband
(
eui
,
dev
);
case
ARPHRD_SIT
:
if
(
dev
->
priv_flags
&
IFF_ISATAP
)
return
ipv6_isatap_eui64
(
eui
,
*
(
__be32
*
)
dev
->
dev_addr
);
return
addrconf_ifid_sit
(
eui
,
dev
);
}
return
-
1
;
}
...
...
@@ -2613,8 +2651,6 @@ static void addrconf_rs_timer(unsigned long data)
spin_lock
(
&
ifp
->
lock
);
if
(
ifp
->
probes
++
<
ifp
->
idev
->
cnf
.
rtr_solicits
)
{
struct
in6_addr
all_routers
;
/* The wait after the last probe can be shorter */
addrconf_mod_timer
(
ifp
,
AC_RS
,
(
ifp
->
probes
==
ifp
->
idev
->
cnf
.
rtr_solicits
)
?
...
...
@@ -2622,9 +2658,7 @@ static void addrconf_rs_timer(unsigned long data)
ifp
->
idev
->
cnf
.
rtr_solicit_interval
);
spin_unlock
(
&
ifp
->
lock
);
ipv6_addr_all_routers
(
&
all_routers
);
ndisc_send_rs
(
ifp
->
idev
->
dev
,
&
ifp
->
addr
,
&
all_routers
);
ndisc_send_rs
(
ifp
->
idev
->
dev
,
&
ifp
->
addr
,
&
in6addr_linklocal_allrouters
);
}
else
{
spin_unlock
(
&
ifp
->
lock
);
/*
...
...
@@ -2711,7 +2745,6 @@ static void addrconf_dad_timer(unsigned long data)
{
struct
inet6_ifaddr
*
ifp
=
(
struct
inet6_ifaddr
*
)
data
;
struct
inet6_dev
*
idev
=
ifp
->
idev
;
struct
in6_addr
unspec
;
struct
in6_addr
mcaddr
;
read_lock_bh
(
&
idev
->
lock
);
...
...
@@ -2740,9 +2773,8 @@ static void addrconf_dad_timer(unsigned long data)
read_unlock_bh
(
&
idev
->
lock
);
/* send a neighbour solicitation for our addr */
memset
(
&
unspec
,
0
,
sizeof
(
unspec
));
addrconf_addr_solict_mult
(
&
ifp
->
addr
,
&
mcaddr
);
ndisc_send_ns
(
ifp
->
idev
->
dev
,
NULL
,
&
ifp
->
addr
,
&
mcaddr
,
&
unspec
);
ndisc_send_ns
(
ifp
->
idev
->
dev
,
NULL
,
&
ifp
->
addr
,
&
mcaddr
,
&
in6addr_any
);
out:
in6_ifa_put
(
ifp
);
}
...
...
@@ -2765,16 +2797,12 @@ static void addrconf_dad_completed(struct inet6_ifaddr *ifp)
ifp
->
idev
->
cnf
.
rtr_solicits
>
0
&&
(
dev
->
flags
&
IFF_LOOPBACK
)
==
0
&&
(
ipv6_addr_type
(
&
ifp
->
addr
)
&
IPV6_ADDR_LINKLOCAL
))
{
struct
in6_addr
all_routers
;
ipv6_addr_all_routers
(
&
all_routers
);
/*
* If a host as already performed a random delay
* [...] as part of DAD [...] there is no need
* to delay again before sending the first RS
*/
ndisc_send_rs
(
ifp
->
idev
->
dev
,
&
ifp
->
addr
,
&
all_
routers
);
ndisc_send_rs
(
ifp
->
idev
->
dev
,
&
ifp
->
addr
,
&
in6addr_linklocal_all
routers
);
spin_lock_bh
(
&
ifp
->
lock
);
ifp
->
probes
=
1
;
...
...
@@ -2951,7 +2979,7 @@ int ipv6_chk_home_addr(struct net *net, struct in6_addr *addr)
for
(
ifp
=
inet6_addr_lst
[
hash
];
ifp
;
ifp
=
ifp
->
lst_next
)
{
if
(
!
net_eq
(
dev_net
(
ifp
->
idev
->
dev
),
net
))
continue
;
if
(
ipv6_addr_
cmp
(
&
ifp
->
addr
,
addr
)
==
0
&&
if
(
ipv6_addr_
equal
(
&
ifp
->
addr
,
addr
)
&&
(
ifp
->
flags
&
IFA_F_HOMEADDRESS
))
{
ret
=
1
;
break
;
...
...
net/ipv6/fib6_rules.c
浏览文件 @
6fb9114e
...
...
@@ -316,5 +316,5 @@ int __init fib6_rules_init(void)
void
fib6_rules_cleanup
(
void
)
{
return
unregister_pernet_subsys
(
&
fib6_rules_net_ops
);
unregister_pernet_subsys
(
&
fib6_rules_net_ops
);
}
net/ipv6/ip6_input.c
浏览文件 @
6fb9114e
...
...
@@ -262,21 +262,23 @@ int ip6_mc_input(struct sk_buff *skb)
* is for MLD (0x0000).
*/
if
((
ptr
[
2
]
|
ptr
[
3
])
==
0
)
{
deliver
=
0
;
if
(
!
ipv6_ext_hdr
(
nexthdr
))
{
/* BUG */
goto
discard
;
goto
out
;
}
offset
=
ipv6_skip_exthdr
(
skb
,
sizeof
(
*
hdr
),
&
nexthdr
);
if
(
offset
<
0
)
goto
discard
;
goto
out
;
if
(
nexthdr
!=
IPPROTO_ICMPV6
)
goto
discard
;
goto
out
;
if
(
!
pskb_may_pull
(
skb
,
(
skb_network_header
(
skb
)
+
offset
+
1
-
skb
->
data
)))
goto
discard
;
goto
out
;
icmp6
=
(
struct
icmp6hdr
*
)(
skb_network_header
(
skb
)
+
offset
);
...
...
@@ -285,12 +287,9 @@ int ip6_mc_input(struct sk_buff *skb)
case
ICMPV6_MGM_REPORT
:
case
ICMPV6_MGM_REDUCTION
:
case
ICMPV6_MLD2_REPORT
:
deliver
=
1
;
break
;
default:
/* Bogus */
goto
discard
;
}
deliver
=
1
;
goto
out
;
}
/* unknown RA - process it normally */
...
...
@@ -308,15 +307,14 @@ int ip6_mc_input(struct sk_buff *skb)
ip6_mr_input
(
skb2
);
}
}
#endif
out:
if
(
likely
(
deliver
))
{
#endif
if
(
likely
(
deliver
))
ip6_input
(
skb
);
return
0
;
else
{
/* discard */
kfree_skb
(
skb
);
}
discard:
/* discard */
kfree_skb
(
skb
);
return
0
;
}
net/ipv6/ip6_output.c
浏览文件 @
6fb9114e
...
...
@@ -286,7 +286,7 @@ EXPORT_SYMBOL(ip6_xmit);
*/
int
ip6_nd_hdr
(
struct
sock
*
sk
,
struct
sk_buff
*
skb
,
struct
net_device
*
dev
,
struct
in6_addr
*
saddr
,
struct
in6_addr
*
daddr
,
const
struct
in6_addr
*
saddr
,
const
struct
in6_addr
*
daddr
,
int
proto
,
int
len
)
{
struct
ipv6_pinfo
*
np
=
inet6_sk
(
sk
);
...
...
net/ipv6/ip6mr.c
浏览文件 @
6fb9114e
...
...
@@ -27,27 +27,18 @@
#include <linux/fcntl.h>
#include <linux/stat.h>
#include <linux/socket.h>
#include <linux/in.h>
#include <linux/inet.h>
#include <linux/netdevice.h>
#include <linux/inetdevice.h>
#include <linux/igmp.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/mroute.h>
#include <linux/init.h>
#include <net/ip.h>
#include <net/protocol.h>
#include <linux/skbuff.h>
#include <net/sock.h>
#include <net/icmp.h>
#include <net/udp.h>
#include <net/raw.h>
#include <net/route.h>
#include <linux/notifier.h>
#include <linux/if_arp.h>
#include <linux/netfilter_ipv4.h>
#include <net/ipip.h>
#include <net/checksum.h>
#include <net/netlink.h>
...
...
@@ -83,7 +74,7 @@ static int mroute_do_pim;
#define mroute_do_pim 0
#endif
static
struct
mfc6_cache
*
mfc6_cache_array
[
MFC_LINES
];
/* Forwarding cache */
static
struct
mfc6_cache
*
mfc6_cache_array
[
MFC
6
_LINES
];
/* Forwarding cache */
static
struct
mfc6_cache
*
mfc_unres_queue
;
/* Queue of unresolved entries */
static
atomic_t
cache_resolve_queue_len
;
/* Size of unresolved */
...
...
@@ -102,7 +93,7 @@ static DEFINE_SPINLOCK(mfc_unres_lock);
static
struct
kmem_cache
*
mrt_cachep
__read_mostly
;
static
int
ip6_mr_forward
(
struct
sk_buff
*
skb
,
struct
mfc6_cache
*
cache
);
static
int
ip6mr_cache_report
(
struct
sk_buff
*
pkt
,
vifi_t
v
ifi
,
int
assert
);
static
int
ip6mr_cache_report
(
struct
sk_buff
*
pkt
,
mifi_t
m
ifi
,
int
assert
);
static
int
ip6mr_fill_mroute
(
struct
sk_buff
*
skb
,
struct
mfc6_cache
*
c
,
struct
rtmsg
*
rtm
);
#ifdef CONFIG_IPV6_PIMSM_V2
...
...
@@ -597,9 +588,9 @@ static void ip6mr_update_thresholds(struct mfc6_cache *cache, unsigned char *ttl
{
int
vifi
;
cache
->
mfc_un
.
res
.
minvif
=
MAX
V
IFS
;
cache
->
mfc_un
.
res
.
minvif
=
MAX
M
IFS
;
cache
->
mfc_un
.
res
.
maxvif
=
0
;
memset
(
cache
->
mfc_un
.
res
.
ttls
,
255
,
MAX
V
IFS
);
memset
(
cache
->
mfc_un
.
res
.
ttls
,
255
,
MAX
M
IFS
);
for
(
vifi
=
0
;
vifi
<
maxvif
;
vifi
++
)
{
if
(
MIF_EXISTS
(
vifi
)
&&
ttls
[
vifi
]
&&
ttls
[
vifi
]
<
255
)
{
...
...
@@ -700,7 +691,7 @@ static struct mfc6_cache *ip6mr_cache_alloc(void)
if
(
c
==
NULL
)
return
NULL
;
memset
(
c
,
0
,
sizeof
(
*
c
));
c
->
mfc_un
.
res
.
minvif
=
MAX
V
IFS
;
c
->
mfc_un
.
res
.
minvif
=
MAX
M
IFS
;
return
c
;
}
...
...
@@ -753,7 +744,7 @@ static void ip6mr_cache_resolve(struct mfc6_cache *uc, struct mfc6_cache *c)
* Called under mrt_lock.
*/
static
int
ip6mr_cache_report
(
struct
sk_buff
*
pkt
,
vifi_t
v
ifi
,
int
assert
)
static
int
ip6mr_cache_report
(
struct
sk_buff
*
pkt
,
mifi_t
m
ifi
,
int
assert
)
{
struct
sk_buff
*
skb
;
struct
mrt6msg
*
msg
;
...
...
@@ -815,7 +806,7 @@ static int ip6mr_cache_report(struct sk_buff *pkt, vifi_t vifi, int assert)
msg
->
im6_mbz
=
0
;
msg
->
im6_msgtype
=
assert
;
msg
->
im6_mif
=
v
ifi
;
msg
->
im6_mif
=
m
ifi
;
msg
->
im6_pad
=
0
;
ipv6_addr_copy
(
&
msg
->
im6_src
,
&
ipv6_hdr
(
pkt
)
->
saddr
);
ipv6_addr_copy
(
&
msg
->
im6_dst
,
&
ipv6_hdr
(
pkt
)
->
daddr
);
...
...
@@ -848,7 +839,7 @@ static int ip6mr_cache_report(struct sk_buff *pkt, vifi_t vifi, int assert)
*/
static
int
ip6mr_cache_unresolved
(
vifi_t
v
ifi
,
struct
sk_buff
*
skb
)
ip6mr_cache_unresolved
(
mifi_t
m
ifi
,
struct
sk_buff
*
skb
)
{
int
err
;
struct
mfc6_cache
*
c
;
...
...
@@ -883,7 +874,7 @@ ip6mr_cache_unresolved(vifi_t vifi, struct sk_buff *skb)
/*
* Reflect first query at pim6sd
*/
if
((
err
=
ip6mr_cache_report
(
skb
,
v
ifi
,
MRT6MSG_NOCACHE
))
<
0
)
{
if
((
err
=
ip6mr_cache_report
(
skb
,
m
ifi
,
MRT6MSG_NOCACHE
))
<
0
)
{
/* If the report failed throw the cache entry
out - Brad Parker
*/
...
...
@@ -992,11 +983,11 @@ static int ip6mr_mfc_add(struct mf6cctl *mfc, int mrtsock)
{
int
line
;
struct
mfc6_cache
*
uc
,
*
c
,
**
cp
;
unsigned
char
ttls
[
MAX
V
IFS
];
unsigned
char
ttls
[
MAX
M
IFS
];
int
i
;
memset
(
ttls
,
255
,
MAX
V
IFS
);
for
(
i
=
0
;
i
<
MAX
V
IFS
;
i
++
)
{
memset
(
ttls
,
255
,
MAX
M
IFS
);
for
(
i
=
0
;
i
<
MAX
M
IFS
;
i
++
)
{
if
(
IF_ISSET
(
i
,
&
mfc
->
mf6cc_ifset
))
ttls
[
i
]
=
1
;
...
...
@@ -1188,7 +1179,7 @@ int ip6_mroute_setsockopt(struct sock *sk, int optname, char __user *optval, int
return
-
EINVAL
;
if
(
copy_from_user
(
&
vif
,
optval
,
sizeof
(
vif
)))
return
-
EFAULT
;
if
(
vif
.
mif6c_mifi
>=
MAX
V
IFS
)
if
(
vif
.
mif6c_mifi
>=
MAX
M
IFS
)
return
-
ENFILE
;
rtnl_lock
();
ret
=
mif6_add
(
&
vif
,
sk
==
mroute6_socket
);
...
...
@@ -1238,7 +1229,7 @@ int ip6_mroute_setsockopt(struct sock *sk, int optname, char __user *optval, int
#ifdef CONFIG_IPV6_PIMSM_V2
case
MRT6_PIM
:
{
int
v
,
ret
;
int
v
;
if
(
get_user
(
v
,
(
int
__user
*
)
optval
))
return
-
EFAULT
;
v
=
!!
v
;
...
...
net/ipv6/ipv6_sockglue.c
浏览文件 @
6fb9114e
...
...
@@ -16,7 +16,6 @@
*
* FIXME: Make the setsockopt code POSIX compliant: That is
*
* o Return -EINVAL for setsockopt of short lengths
* o Truncate getsockopt returns
* o Return an optlen of the truncated length if need be
*
...
...
@@ -114,8 +113,13 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
if
(
optval
==
NULL
)
val
=
0
;
else
if
(
get_user
(
val
,
(
int
__user
*
)
optval
))
return
-
EFAULT
;
else
{
if
(
optlen
>=
sizeof
(
int
))
{
if
(
get_user
(
val
,
(
int
__user
*
)
optval
))
return
-
EFAULT
;
}
else
val
=
0
;
}
valbool
=
(
val
!=
0
);
...
...
@@ -127,6 +131,8 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
switch
(
optname
)
{
case
IPV6_ADDRFORM
:
if
(
optlen
<
sizeof
(
int
))
goto
e_inval
;
if
(
val
==
PF_INET
)
{
struct
ipv6_txoptions
*
opt
;
struct
sk_buff
*
pktopt
;
...
...
@@ -159,8 +165,6 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
if
(
sk
->
sk_protocol
==
IPPROTO_TCP
)
{
struct
inet_connection_sock
*
icsk
=
inet_csk
(
sk
);
struct
net
*
net
=
sock_net
(
sk
);
local_bh_disable
();
sock_prot_inuse_add
(
net
,
sk
->
sk_prot
,
-
1
);
sock_prot_inuse_add
(
net
,
&
tcp_prot
,
1
);
...
...
@@ -172,7 +176,6 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
tcp_sync_mss
(
sk
,
icsk
->
icsk_pmtu_cookie
);
}
else
{
struct
proto
*
prot
=
&
udp_prot
;
struct
net
*
net
=
sock_net
(
sk
);
if
(
sk
->
sk_protocol
==
IPPROTO_UDPLITE
)
prot
=
&
udplite_prot
;
...
...
@@ -204,63 +207,86 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
goto
e_inval
;
case
IPV6_V6ONLY
:
if
(
inet_sk
(
sk
)
->
num
)
if
(
optlen
<
sizeof
(
int
)
||
inet_sk
(
sk
)
->
num
)
goto
e_inval
;
np
->
ipv6only
=
valbool
;
retv
=
0
;
break
;
case
IPV6_RECVPKTINFO
:
if
(
optlen
<
sizeof
(
int
))
goto
e_inval
;
np
->
rxopt
.
bits
.
rxinfo
=
valbool
;
retv
=
0
;
break
;
case
IPV6_2292PKTINFO
:
if
(
optlen
<
sizeof
(
int
))
goto
e_inval
;
np
->
rxopt
.
bits
.
rxoinfo
=
valbool
;
retv
=
0
;
break
;
case
IPV6_RECVHOPLIMIT
:
if
(
optlen
<
sizeof
(
int
))
goto
e_inval
;
np
->
rxopt
.
bits
.
rxhlim
=
valbool
;
retv
=
0
;
break
;
case
IPV6_2292HOPLIMIT
:
if
(
optlen
<
sizeof
(
int
))
goto
e_inval
;
np
->
rxopt
.
bits
.
rxohlim
=
valbool
;
retv
=
0
;
break
;
case
IPV6_RECVRTHDR
:
if
(
optlen
<
sizeof
(
int
))
goto
e_inval
;
np
->
rxopt
.
bits
.
srcrt
=
valbool
;
retv
=
0
;
break
;
case
IPV6_2292RTHDR
:
if
(
optlen
<
sizeof
(
int
))
goto
e_inval
;
np
->
rxopt
.
bits
.
osrcrt
=
valbool
;
retv
=
0
;
break
;
case
IPV6_RECVHOPOPTS
:
if
(
optlen
<
sizeof
(
int
))
goto
e_inval
;
np
->
rxopt
.
bits
.
hopopts
=
valbool
;
retv
=
0
;
break
;
case
IPV6_2292HOPOPTS
:
if
(
optlen
<
sizeof
(
int
))
goto
e_inval
;
np
->
rxopt
.
bits
.
ohopopts
=
valbool
;
retv
=
0
;
break
;
case
IPV6_RECVDSTOPTS
:
if
(
optlen
<
sizeof
(
int
))
goto
e_inval
;
np
->
rxopt
.
bits
.
dstopts
=
valbool
;
retv
=
0
;
break
;
case
IPV6_2292DSTOPTS
:
if
(
optlen
<
sizeof
(
int
))
goto
e_inval
;
np
->
rxopt
.
bits
.
odstopts
=
valbool
;
retv
=
0
;
break
;
case
IPV6_TCLASS
:
if
(
optlen
<
sizeof
(
int
))
goto
e_inval
;
if
(
val
<
-
1
||
val
>
0xff
)
goto
e_inval
;
np
->
tclass
=
val
;
...
...
@@ -268,11 +294,15 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
break
;
case
IPV6_RECVTCLASS
:
if
(
optlen
<
sizeof
(
int
))
goto
e_inval
;
np
->
rxopt
.
bits
.
rxtclass
=
valbool
;
retv
=
0
;
break
;
case
IPV6_FLOWINFO
:
if
(
optlen
<
sizeof
(
int
))
goto
e_inval
;
np
->
rxopt
.
bits
.
rxflow
=
valbool
;
retv
=
0
;
break
;
...
...
@@ -291,9 +321,9 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
if
(
optname
!=
IPV6_RTHDR
&&
!
capable
(
CAP_NET_RAW
))
break
;
retv
=
-
EINVAL
;
if
(
optlen
&
0x7
||
optlen
>
8
*
255
)
break
;
if
(
optlen
<
sizeof
(
struct
ipv6_opt_hdr
)
||
optlen
&
0x7
||
optlen
>
8
*
255
)
goto
e_inval
;
opt
=
ipv6_renew_options
(
sk
,
np
->
opt
,
optname
,
(
struct
ipv6_opt_hdr
__user
*
)
optval
,
...
...
@@ -411,6 +441,8 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
break
;
}
case
IPV6_UNICAST_HOPS
:
if
(
optlen
<
sizeof
(
int
))
goto
e_inval
;
if
(
val
>
255
||
val
<
-
1
)
goto
e_inval
;
np
->
hop_limit
=
val
;
...
...
@@ -420,6 +452,8 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
case
IPV6_MULTICAST_HOPS
:
if
(
sk
->
sk_type
==
SOCK_STREAM
)
goto
e_inval
;
if
(
optlen
<
sizeof
(
int
))
goto
e_inval
;
if
(
val
>
255
||
val
<
-
1
)
goto
e_inval
;
np
->
mcast_hops
=
val
;
...
...
@@ -427,6 +461,8 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
break
;
case
IPV6_MULTICAST_LOOP
:
if
(
optlen
<
sizeof
(
int
))
goto
e_inval
;
np
->
mc_loop
=
valbool
;
retv
=
0
;
break
;
...
...
@@ -434,6 +470,8 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
case
IPV6_MULTICAST_IF
:
if
(
sk
->
sk_type
==
SOCK_STREAM
)
goto
e_inval
;
if
(
optlen
<
sizeof
(
int
))
goto
e_inval
;
if
(
val
)
{
if
(
sk
->
sk_bound_dev_if
&&
sk
->
sk_bound_dev_if
!=
val
)
...
...
@@ -452,6 +490,9 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
{
struct
ipv6_mreq
mreq
;
if
(
optlen
<
sizeof
(
struct
ipv6_mreq
))
goto
e_inval
;
retv
=
-
EPROTO
;
if
(
inet_sk
(
sk
)
->
is_icsk
)
break
;
...
...
@@ -471,7 +512,7 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
{
struct
ipv6_mreq
mreq
;
if
(
optlen
!=
sizeof
(
struct
ipv6_mreq
))
if
(
optlen
<
sizeof
(
struct
ipv6_mreq
))
goto
e_inval
;
retv
=
-
EFAULT
;
...
...
@@ -490,6 +531,9 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
struct
group_req
greq
;
struct
sockaddr_in6
*
psin6
;
if
(
optlen
<
sizeof
(
struct
group_req
))
goto
e_inval
;
retv
=
-
EFAULT
;
if
(
copy_from_user
(
&
greq
,
optval
,
sizeof
(
struct
group_req
)))
break
;
...
...
@@ -514,7 +558,7 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
struct
group_source_req
greqs
;
int
omode
,
add
;
if
(
optlen
!=
sizeof
(
struct
group_source_req
))
if
(
optlen
<
sizeof
(
struct
group_source_req
))
goto
e_inval
;
if
(
copy_from_user
(
&
greqs
,
optval
,
sizeof
(
greqs
)))
{
retv
=
-
EFAULT
;
...
...
@@ -588,27 +632,37 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
break
;
}
case
IPV6_ROUTER_ALERT
:
if
(
optlen
<
sizeof
(
int
))
goto
e_inval
;
retv
=
ip6_ra_control
(
sk
,
val
,
NULL
);
break
;
case
IPV6_MTU_DISCOVER
:
if
(
optlen
<
sizeof
(
int
))
goto
e_inval
;
if
(
val
<
0
||
val
>
3
)
goto
e_inval
;
np
->
pmtudisc
=
val
;
retv
=
0
;
break
;
case
IPV6_MTU
:
if
(
optlen
<
sizeof
(
int
))
goto
e_inval
;
if
(
val
&&
val
<
IPV6_MIN_MTU
)
goto
e_inval
;
np
->
frag_size
=
val
;
retv
=
0
;
break
;
case
IPV6_RECVERR
:
if
(
optlen
<
sizeof
(
int
))
goto
e_inval
;
np
->
recverr
=
valbool
;
if
(
!
val
)
skb_queue_purge
(
&
sk
->
sk_error_queue
);
retv
=
0
;
break
;
case
IPV6_FLOWINFO_SEND
:
if
(
optlen
<
sizeof
(
int
))
goto
e_inval
;
np
->
sndflow
=
valbool
;
retv
=
0
;
break
;
...
...
@@ -628,6 +682,9 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
unsigned
int
pref
=
0
;
unsigned
int
prefmask
=
~
0
;
if
(
optlen
<
sizeof
(
int
))
goto
e_inval
;
retv
=
-
EINVAL
;
/* check PUBLIC/TMP/PUBTMP_DEFAULT conflicts */
...
...
net/ipv6/mcast.c
浏览文件 @
6fb9114e
...
...
@@ -127,8 +127,6 @@ static struct in6_addr mld2_all_mcr = MLD2_ALL_MCR_INIT;
/* Big mc list lock for all the sockets */
static
DEFINE_RWLOCK
(
ipv6_sk_mc_lock
);
int
__ipv6_dev_mc_dec
(
struct
inet6_dev
*
idev
,
struct
in6_addr
*
addr
);
static
void
igmp6_join_group
(
struct
ifmcaddr6
*
ma
);
static
void
igmp6_leave_group
(
struct
ifmcaddr6
*
ma
);
static
void
igmp6_timer_handler
(
unsigned
long
data
);
...
...
@@ -177,7 +175,7 @@ int sysctl_mld_max_msf __read_mostly = IPV6_MLD_MAX_MSF;
* socket join on multicast group
*/
int
ipv6_sock_mc_join
(
struct
sock
*
sk
,
int
ifindex
,
struct
in6_addr
*
addr
)
int
ipv6_sock_mc_join
(
struct
sock
*
sk
,
int
ifindex
,
const
struct
in6_addr
*
addr
)
{
struct
net_device
*
dev
=
NULL
;
struct
ipv6_mc_socklist
*
mc_lst
;
...
...
@@ -252,7 +250,7 @@ int ipv6_sock_mc_join(struct sock *sk, int ifindex, struct in6_addr *addr)
/*
* socket leave on multicast group
*/
int
ipv6_sock_mc_drop
(
struct
sock
*
sk
,
int
ifindex
,
struct
in6_addr
*
addr
)
int
ipv6_sock_mc_drop
(
struct
sock
*
sk
,
int
ifindex
,
const
struct
in6_addr
*
addr
)
{
struct
ipv6_pinfo
*
np
=
inet6_sk
(
sk
);
struct
ipv6_mc_socklist
*
mc_lst
,
**
lnk
;
...
...
@@ -664,8 +662,8 @@ int ip6_mc_msfget(struct sock *sk, struct group_filter *gsf,
return
err
;
}
int
inet6_mc_check
(
struct
sock
*
sk
,
struct
in6_addr
*
mc_addr
,
struct
in6_addr
*
src_addr
)
int
inet6_mc_check
(
struct
sock
*
sk
,
const
struct
in6_addr
*
mc_addr
,
const
struct
in6_addr
*
src_addr
)
{
struct
ipv6_pinfo
*
np
=
inet6_sk
(
sk
);
struct
ipv6_mc_socklist
*
mc
;
...
...
@@ -871,7 +869,7 @@ static void mld_clear_delrec(struct inet6_dev *idev)
/*
* device multicast group inc (add if not found)
*/
int
ipv6_dev_mc_inc
(
struct
net_device
*
dev
,
struct
in6_addr
*
addr
)
int
ipv6_dev_mc_inc
(
struct
net_device
*
dev
,
const
struct
in6_addr
*
addr
)
{
struct
ifmcaddr6
*
mc
;
struct
inet6_dev
*
idev
;
...
...
@@ -942,7 +940,7 @@ int ipv6_dev_mc_inc(struct net_device *dev, struct in6_addr *addr)
/*
* device multicast group del
*/
int
__ipv6_dev_mc_dec
(
struct
inet6_dev
*
idev
,
struct
in6_addr
*
addr
)
int
__ipv6_dev_mc_dec
(
struct
inet6_dev
*
idev
,
const
struct
in6_addr
*
addr
)
{
struct
ifmcaddr6
*
ma
,
**
map
;
...
...
@@ -967,7 +965,7 @@ int __ipv6_dev_mc_dec(struct inet6_dev *idev, struct in6_addr *addr)
return
-
ENOENT
;
}
int
ipv6_dev_mc_dec
(
struct
net_device
*
dev
,
struct
in6_addr
*
addr
)
int
ipv6_dev_mc_dec
(
struct
net_device
*
dev
,
const
struct
in6_addr
*
addr
)
{
struct
inet6_dev
*
idev
=
in6_dev_get
(
dev
);
int
err
;
...
...
@@ -1012,8 +1010,8 @@ int ipv6_is_mld(struct sk_buff *skb, int nexthdr)
/*
* check if the interface/address pair is valid
*/
int
ipv6_chk_mcast_addr
(
struct
net_device
*
dev
,
struct
in6_addr
*
group
,
struct
in6_addr
*
src_addr
)
int
ipv6_chk_mcast_addr
(
struct
net_device
*
dev
,
const
struct
in6_addr
*
group
,
const
struct
in6_addr
*
src_addr
)
{
struct
inet6_dev
*
idev
;
struct
ifmcaddr6
*
mc
;
...
...
@@ -1406,6 +1404,7 @@ static struct sk_buff *mld_newpack(struct net_device *dev, int size)
struct
sk_buff
*
skb
;
struct
mld2_report
*
pmr
;
struct
in6_addr
addr_buf
;
const
struct
in6_addr
*
saddr
;
int
err
;
u8
ra
[
8
]
=
{
IPPROTO_ICMPV6
,
0
,
IPV6_TLV_ROUTERALERT
,
2
,
0
,
0
,
...
...
@@ -1424,10 +1423,11 @@ static struct sk_buff *mld_newpack(struct net_device *dev, int size)
* use unspecified address as the source address
* when a valid link-local address is not available.
*/
memset
(
&
addr_buf
,
0
,
sizeof
(
addr_buf
));
}
saddr
=
&
in6addr_any
;
}
else
saddr
=
&
addr_buf
;
ip6_nd_hdr
(
sk
,
skb
,
dev
,
&
addr_buf
,
&
mld2_all_mcr
,
NEXTHDR_HOP
,
0
);
ip6_nd_hdr
(
sk
,
skb
,
dev
,
saddr
,
&
mld2_all_mcr
,
NEXTHDR_HOP
,
0
);
memcpy
(
skb_put
(
skb
,
sizeof
(
ra
)),
ra
,
sizeof
(
ra
));
...
...
@@ -1768,10 +1768,9 @@ static void igmp6_send(struct in6_addr *addr, struct net_device *dev, int type)
struct
inet6_dev
*
idev
;
struct
sk_buff
*
skb
;
struct
icmp6hdr
*
hdr
;
struct
in6_addr
*
snd_
addr
;
const
struct
in6_addr
*
snd_addr
,
*
s
addr
;
struct
in6_addr
*
addrp
;
struct
in6_addr
addr_buf
;
struct
in6_addr
all_routers
;
int
err
,
len
,
payload_len
,
full_len
;
u8
ra
[
8
]
=
{
IPPROTO_ICMPV6
,
0
,
IPV6_TLV_ROUTERALERT
,
2
,
0
,
0
,
...
...
@@ -1782,11 +1781,10 @@ static void igmp6_send(struct in6_addr *addr, struct net_device *dev, int type)
IP6_INC_STATS
(
__in6_dev_get
(
dev
),
IPSTATS_MIB_OUTREQUESTS
);
rcu_read_unlock
();
snd_addr
=
addr
;
if
(
type
==
ICMPV6_MGM_REDUCTION
)
{
snd_addr
=
&
all_routers
;
ipv6_addr_all_routers
(
&
all_routers
);
}
if
(
type
==
ICMPV6_MGM_REDUCTION
)
snd_addr
=
&
in6addr_linklocal_allrouters
;
else
snd_addr
=
addr
;
len
=
sizeof
(
struct
icmp6hdr
)
+
sizeof
(
struct
in6_addr
);
payload_len
=
len
+
sizeof
(
ra
);
...
...
@@ -1809,10 +1807,11 @@ static void igmp6_send(struct in6_addr *addr, struct net_device *dev, int type)
* use unspecified address as the source address
* when a valid link-local address is not available.
*/
memset
(
&
addr_buf
,
0
,
sizeof
(
addr_buf
));
}
saddr
=
&
in6addr_any
;
}
else
saddr
=
&
addr_buf
;
ip6_nd_hdr
(
sk
,
skb
,
dev
,
&
addr_buf
,
snd_addr
,
NEXTHDR_HOP
,
payload_len
);
ip6_nd_hdr
(
sk
,
skb
,
dev
,
saddr
,
snd_addr
,
NEXTHDR_HOP
,
payload_len
);
memcpy
(
skb_put
(
skb
,
sizeof
(
ra
)),
ra
,
sizeof
(
ra
));
...
...
@@ -1823,7 +1822,7 @@ static void igmp6_send(struct in6_addr *addr, struct net_device *dev, int type)
addrp
=
(
struct
in6_addr
*
)
skb_put
(
skb
,
sizeof
(
struct
in6_addr
));
ipv6_addr_copy
(
addrp
,
addr
);
hdr
->
icmp6_cksum
=
csum_ipv6_magic
(
&
addr_buf
,
snd_addr
,
len
,
hdr
->
icmp6_cksum
=
csum_ipv6_magic
(
saddr
,
snd_addr
,
len
,
IPPROTO_ICMPV6
,
csum_partial
((
__u8
*
)
hdr
,
len
,
0
));
...
...
@@ -2311,24 +2310,19 @@ void ipv6_mc_init_dev(struct inet6_dev *idev)
void
ipv6_mc_destroy_dev
(
struct
inet6_dev
*
idev
)
{
struct
ifmcaddr6
*
i
;
struct
in6_addr
maddr
;
/* Deactivate timers */
ipv6_mc_down
(
idev
);
/* Delete all-nodes address. */
ipv6_addr_all_nodes
(
&
maddr
);
/* We cannot call ipv6_dev_mc_dec() directly, our caller in
* addrconf.c has NULL'd out dev->ip6_ptr so in6_dev_get() will
* fail.
*/
__ipv6_dev_mc_dec
(
idev
,
&
maddr
);
__ipv6_dev_mc_dec
(
idev
,
&
in6addr_linklocal_allnodes
);
if
(
idev
->
cnf
.
forwarding
)
{
ipv6_addr_all_routers
(
&
maddr
);
__ipv6_dev_mc_dec
(
idev
,
&
maddr
);
}
if
(
idev
->
cnf
.
forwarding
)
__ipv6_dev_mc_dec
(
idev
,
&
in6addr_linklocal_allrouters
);
write_lock_bh
(
&
idev
->
lock
);
while
((
i
=
idev
->
mc_list
)
!=
NULL
)
{
...
...
net/ipv6/mip6.c
浏览文件 @
6fb9114e
...
...
@@ -44,9 +44,9 @@ static inline void *mip6_padn(__u8 *data, __u8 padlen)
if
(
!
data
)
return
NULL
;
if
(
padlen
==
1
)
{
data
[
0
]
=
MIP6_OPT_PAD_1
;
data
[
0
]
=
IPV6_TLV_PAD0
;
}
else
if
(
padlen
>
1
)
{
data
[
0
]
=
MIP6_OPT_PAD_
N
;
data
[
0
]
=
IPV6_TLV_PAD
N
;
data
[
1
]
=
padlen
-
2
;
if
(
padlen
>
2
)
memset
(
data
+
2
,
0
,
data
[
1
]);
...
...
net/ipv6/ndisc.c
浏览文件 @
6fb9114e
...
...
@@ -442,8 +442,9 @@ static void pndisc_destructor(struct pneigh_entry *n)
*/
static
void
__ndisc_send
(
struct
net_device
*
dev
,
struct
neighbour
*
neigh
,
struct
in6_addr
*
daddr
,
struct
in6_addr
*
saddr
,
struct
icmp6hdr
*
icmp6h
,
struct
in6_addr
*
target
,
const
struct
in6_addr
*
daddr
,
const
struct
in6_addr
*
saddr
,
struct
icmp6hdr
*
icmp6h
,
const
struct
in6_addr
*
target
,
int
llinfo
)
{
struct
flowi
fl
;
...
...
@@ -529,12 +530,13 @@ static void __ndisc_send(struct net_device *dev,
}
static
void
ndisc_send_na
(
struct
net_device
*
dev
,
struct
neighbour
*
neigh
,
struct
in6_addr
*
daddr
,
struct
in6_addr
*
solicited_addr
,
int
router
,
int
solicited
,
int
override
,
int
inc_opt
)
const
struct
in6_addr
*
daddr
,
const
struct
in6_addr
*
solicited_addr
,
int
router
,
int
solicited
,
int
override
,
int
inc_opt
)
{
struct
in6_addr
tmpaddr
;
struct
inet6_ifaddr
*
ifp
;
struct
in6_addr
*
src_addr
;
const
struct
in6_addr
*
src_addr
;
struct
icmp6hdr
icmp6h
=
{
.
icmp6_type
=
NDISC_NEIGHBOUR_ADVERTISEMENT
,
};
...
...
@@ -564,8 +566,8 @@ static void ndisc_send_na(struct net_device *dev, struct neighbour *neigh,
}
void
ndisc_send_ns
(
struct
net_device
*
dev
,
struct
neighbour
*
neigh
,
struct
in6_addr
*
solicit
,
struct
in6_addr
*
daddr
,
struct
in6_addr
*
saddr
)
const
struct
in6_addr
*
solicit
,
const
struct
in6_addr
*
daddr
,
const
struct
in6_addr
*
saddr
)
{
struct
in6_addr
addr_buf
;
struct
icmp6hdr
icmp6h
=
{
...
...
@@ -584,8 +586,8 @@ void ndisc_send_ns(struct net_device *dev, struct neighbour *neigh,
!
ipv6_addr_any
(
saddr
)
?
ND_OPT_SOURCE_LL_ADDR
:
0
);
}
void
ndisc_send_rs
(
struct
net_device
*
dev
,
struct
in6_addr
*
saddr
,
struct
in6_addr
*
daddr
)
void
ndisc_send_rs
(
struct
net_device
*
dev
,
const
struct
in6_addr
*
saddr
,
const
struct
in6_addr
*
daddr
)
{
struct
icmp6hdr
icmp6h
=
{
.
icmp6_type
=
NDISC_ROUTER_SOLICITATION
,
...
...
@@ -816,10 +818,7 @@ static void ndisc_recv_ns(struct sk_buff *skb)
is_router
=
!!
idev
->
cnf
.
forwarding
;
if
(
dad
)
{
struct
in6_addr
maddr
;
ipv6_addr_all_nodes
(
&
maddr
);
ndisc_send_na
(
dev
,
NULL
,
&
maddr
,
&
msg
->
target
,
ndisc_send_na
(
dev
,
NULL
,
&
in6addr_linklocal_allnodes
,
&
msg
->
target
,
is_router
,
0
,
(
ifp
!=
NULL
),
1
);
goto
out
;
}
...
...
@@ -1447,7 +1446,7 @@ static void ndisc_redirect_rcv(struct sk_buff *skb)
}
void
ndisc_send_redirect
(
struct
sk_buff
*
skb
,
struct
neighbour
*
neigh
,
struct
in6_addr
*
target
)
const
struct
in6_addr
*
target
)
{
struct
net_device
*
dev
=
skb
->
dev
;
struct
net
*
net
=
dev_net
(
dev
);
...
...
net/ipv6/raw.c
浏览文件 @
6fb9114e
...
...
@@ -357,8 +357,10 @@ void raw6_icmp_error(struct sk_buff *skb, int nexthdr,
read_lock
(
&
raw_v6_hashinfo
.
lock
);
sk
=
sk_head
(
&
raw_v6_hashinfo
.
ht
[
hash
]);
if
(
sk
!=
NULL
)
{
saddr
=
&
ipv6_hdr
(
skb
)
->
saddr
;
daddr
=
&
ipv6_hdr
(
skb
)
->
daddr
;
/* Note: ipv6_hdr(skb) != skb->data */
struct
ipv6hdr
*
ip6h
=
(
struct
ipv6hdr
*
)
skb
->
data
;
saddr
=
&
ip6h
->
saddr
;
daddr
=
&
ip6h
->
daddr
;
net
=
dev_net
(
skb
->
dev
);
while
((
sk
=
__raw_v6_lookup
(
net
,
sk
,
nexthdr
,
saddr
,
daddr
,
...
...
@@ -805,15 +807,6 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,
fl
.
fl6_flowlabel
=
np
->
flow_label
;
}
if
(
ipv6_addr_any
(
daddr
))
{
/*
* unspecified destination address
* treated as error... is this correct ?
*/
fl6_sock_release
(
flowlabel
);
return
(
-
EINVAL
);
}
if
(
fl
.
oif
==
0
)
fl
.
oif
=
sk
->
sk_bound_dev_if
;
...
...
@@ -846,7 +839,10 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,
if
(
err
)
goto
out
;
ipv6_addr_copy
(
&
fl
.
fl6_dst
,
daddr
);
if
(
!
ipv6_addr_any
(
daddr
))
ipv6_addr_copy
(
&
fl
.
fl6_dst
,
daddr
);
else
fl
.
fl6_dst
.
s6_addr
[
15
]
=
0x1
;
/* :: means loopback (BSD'ism) */
if
(
ipv6_addr_any
(
&
fl
.
fl6_src
)
&&
!
ipv6_addr_any
(
&
np
->
saddr
))
ipv6_addr_copy
(
&
fl
.
fl6_src
,
&
np
->
saddr
);
...
...
net/ipv6/route.c
浏览文件 @
6fb9114e
...
...
@@ -556,8 +556,8 @@ static struct rt6_info *ip6_pol_route_lookup(struct net *net,
}
struct
rt6_info
*
rt6_lookup
(
struct
net
*
net
,
struct
in6_addr
*
daddr
,
struct
in6_addr
*
saddr
,
int
oif
,
int
strict
)
struct
rt6_info
*
rt6_lookup
(
struct
net
*
net
,
const
struct
in6_addr
*
daddr
,
const
struct
in6_addr
*
saddr
,
int
oif
,
int
strict
)
{
struct
flowi
fl
=
{
.
oif
=
oif
,
...
...
@@ -925,7 +925,7 @@ static DEFINE_SPINLOCK(icmp6_dst_lock);
struct
dst_entry
*
icmp6_dst_alloc
(
struct
net_device
*
dev
,
struct
neighbour
*
neigh
,
struct
in6_addr
*
addr
)
const
struct
in6_addr
*
addr
)
{
struct
rt6_info
*
rt
;
struct
inet6_dev
*
idev
=
in6_dev_get
(
dev
);
...
...
net/ipv6/sit.c
浏览文件 @
6fb9114e
...
...
@@ -379,7 +379,7 @@ static void ipip6_tunnel_uninit(struct net_device *dev)
dev_put
(
dev
);
}
else
{
ipip6_tunnel_unlink
(
netdev_priv
(
dev
));
ipip6_tunnel_del_prl
(
netdev_priv
(
dev
),
0
);
ipip6_tunnel_del_prl
(
netdev_priv
(
dev
),
NULL
);
dev_put
(
dev
);
}
}
...
...
net/ipv6/tcp_ipv6.c
浏览文件 @
6fb9114e
...
...
@@ -543,7 +543,7 @@ static struct tcp_md5sig_key *tcp_v6_md5_do_lookup(struct sock *sk,
return
NULL
;
for
(
i
=
0
;
i
<
tp
->
md5sig_info
->
entries6
;
i
++
)
{
if
(
ipv6_addr_
cmp
(
&
tp
->
md5sig_info
->
keys6
[
i
].
addr
,
addr
)
==
0
)
if
(
ipv6_addr_
equal
(
&
tp
->
md5sig_info
->
keys6
[
i
].
addr
,
addr
)
)
return
&
tp
->
md5sig_info
->
keys6
[
i
].
base
;
}
return
NULL
;
...
...
@@ -632,7 +632,7 @@ static int tcp_v6_md5_do_del(struct sock *sk, struct in6_addr *peer)
int
i
;
for
(
i
=
0
;
i
<
tp
->
md5sig_info
->
entries6
;
i
++
)
{
if
(
ipv6_addr_
cmp
(
&
tp
->
md5sig_info
->
keys6
[
i
].
addr
,
peer
)
==
0
)
{
if
(
ipv6_addr_
equal
(
&
tp
->
md5sig_info
->
keys6
[
i
].
addr
,
peer
)
)
{
/* Free the key */
kfree
(
tp
->
md5sig_info
->
keys6
[
i
].
base
.
key
);
tp
->
md5sig_info
->
entries6
--
;
...
...
net/ipv6/udp.c
浏览文件 @
6fb9114e
...
...
@@ -752,7 +752,10 @@ int udpv6_sendmsg(struct kiocb *iocb, struct sock *sk,
opt
=
ipv6_fixup_options
(
&
opt_space
,
opt
);
fl
.
proto
=
sk
->
sk_protocol
;
ipv6_addr_copy
(
&
fl
.
fl6_dst
,
daddr
);
if
(
!
ipv6_addr_any
(
daddr
))
ipv6_addr_copy
(
&
fl
.
fl6_dst
,
daddr
);
else
fl
.
fl6_dst
.
s6_addr
[
15
]
=
0x1
;
/* :: means loopback (BSD'ism) */
if
(
ipv6_addr_any
(
&
fl
.
fl6_src
)
&&
!
ipv6_addr_any
(
&
np
->
saddr
))
ipv6_addr_copy
(
&
fl
.
fl6_src
,
&
np
->
saddr
);
fl
.
fl_ip_sport
=
inet
->
sport
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录