Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xiphi1978
linux
提交
5f95ac91
L
linux
项目概览
xiphi1978
/
linux
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
L
linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
5f95ac91
编写于
4月 28, 2008
作者:
Y
YOSHIFUJI Hideaki
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
key: Share common code path to extract address from sockaddr{}.
Signed-off-by:
N
YOSHIFUJI Hideaki
<
yoshfuji@linux-ipv6.org
>
上级
e5b56652
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
38 addition
and
69 deletion
+38
-69
net/key/af_key.c
net/key/af_key.c
+38
-69
未找到文件。
net/key/af_key.c
浏览文件 @
5f95ac91
...
...
@@ -592,25 +592,30 @@ static inline int pfkey_sockaddr_len(sa_family_t family)
return
0
;
}
static
int
pfkey_sadb_addr2xfrm_addr
(
struct
sadb_address
*
addr
,
xfrm_address_t
*
xaddr
)
static
int
pfkey_sockaddr_extract
(
const
struct
sockaddr
*
sa
,
xfrm_address_t
*
xaddr
)
{
switch
(
((
struct
sockaddr
*
)(
addr
+
1
))
->
sa_family
)
{
switch
(
sa
->
sa_family
)
{
case
AF_INET
:
xaddr
->
a4
=
((
struct
sockaddr_in
*
)
(
addr
+
1
)
)
->
sin_addr
.
s_addr
;
((
struct
sockaddr_in
*
)
sa
)
->
sin_addr
.
s_addr
;
return
AF_INET
;
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
case
AF_INET6
:
memcpy
(
xaddr
->
a6
,
&
((
struct
sockaddr_in6
*
)
(
addr
+
1
)
)
->
sin6_addr
,
&
((
struct
sockaddr_in6
*
)
sa
)
->
sin6_addr
,
sizeof
(
struct
in6_addr
));
return
AF_INET6
;
#endif
default:
return
0
;
}
/* NOTREACHED */
return
0
;
}
static
int
pfkey_sadb_addr2xfrm_addr
(
struct
sadb_address
*
addr
,
xfrm_address_t
*
xaddr
)
{
return
pfkey_sockaddr_extract
((
struct
sockaddr
*
)(
addr
+
1
),
xaddr
);
}
static
struct
xfrm_state
*
pfkey_xfrm_state_lookup
(
struct
sadb_msg
*
hdr
,
void
**
ext_hdrs
)
...
...
@@ -1828,10 +1833,6 @@ static int
parse_ipsecrequest
(
struct
xfrm_policy
*
xp
,
struct
sadb_x_ipsecrequest
*
rq
)
{
struct
xfrm_tmpl
*
t
=
xp
->
xfrm_vec
+
xp
->
xfrm_nr
;
struct
sockaddr_in
*
sin
;
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
struct
sockaddr_in6
*
sin6
;
#endif
int
mode
;
if
(
xp
->
xfrm_nr
>=
XFRM_MAX_DEPTH
)
...
...
@@ -1856,31 +1857,19 @@ parse_ipsecrequest(struct xfrm_policy *xp, struct sadb_x_ipsecrequest *rq)
/* addresses present only in tunnel mode */
if
(
t
->
mode
==
XFRM_MODE_TUNNEL
)
{
struct
sockaddr
*
sa
;
sa
=
(
struct
sockaddr
*
)(
rq
+
1
);
switch
(
sa
->
sa_family
)
{
case
AF_INET
:
sin
=
(
struct
sockaddr_in
*
)
sa
;
t
->
saddr
.
a4
=
sin
->
sin_addr
.
s_addr
;
sin
++
;
if
(
sin
->
sin_family
!=
AF_INET
)
return
-
EINVAL
;
t
->
id
.
daddr
.
a4
=
sin
->
sin_addr
.
s_addr
;
break
;
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
case
AF_INET6
:
sin6
=
(
struct
sockaddr_in6
*
)
sa
;
memcpy
(
t
->
saddr
.
a6
,
&
sin6
->
sin6_addr
,
sizeof
(
struct
in6_addr
));
sin6
++
;
if
(
sin6
->
sin6_family
!=
AF_INET6
)
return
-
EINVAL
;
memcpy
(
t
->
id
.
daddr
.
a6
,
&
sin6
->
sin6_addr
,
sizeof
(
struct
in6_addr
));
break
;
#endif
default:
u8
*
sa
=
(
u8
*
)
(
rq
+
1
);
int
family
,
socklen
;
family
=
pfkey_sockaddr_extract
((
struct
sockaddr
*
)
sa
,
&
t
->
saddr
);
if
(
!
family
)
return
-
EINVAL
;
}
t
->
encap_family
=
sa
->
sa_family
;
socklen
=
pfkey_sockaddr_len
(
family
);
if
(
pfkey_sockaddr_extract
((
struct
sockaddr
*
)(
sa
+
socklen
),
&
t
->
id
.
daddr
)
!=
family
)
return
-
EINVAL
;
t
->
encap_family
=
family
;
}
else
t
->
encap_family
=
xp
->
family
;
...
...
@@ -2375,44 +2364,24 @@ static int parse_sockaddr_pair(struct sadb_x_ipsecrequest *rq,
xfrm_address_t
*
saddr
,
xfrm_address_t
*
daddr
,
u16
*
family
)
{
struct
sockaddr
*
sa
=
(
struct
sockaddr
*
)(
rq
+
1
);
u8
*
sa
=
(
u8
*
)
(
rq
+
1
);
int
af
,
socklen
;
if
(
rq
->
sadb_x_ipsecrequest_len
<
pfkey_sockaddr_pair_size
(
sa
->
sa_family
))
pfkey_sockaddr_pair_size
(
((
struct
sockaddr
*
)
sa
)
->
sa_family
))
return
-
EINVAL
;
switch
(
sa
->
sa_family
)
{
case
AF_INET
:
{
struct
sockaddr_in
*
sin
;
sin
=
(
struct
sockaddr_in
*
)
sa
;
if
((
sin
+
1
)
->
sin_family
!=
AF_INET
)
return
-
EINVAL
;
memcpy
(
&
saddr
->
a4
,
&
sin
->
sin_addr
,
sizeof
(
saddr
->
a4
));
sin
++
;
memcpy
(
&
daddr
->
a4
,
&
sin
->
sin_addr
,
sizeof
(
daddr
->
a4
));
*
family
=
AF_INET
;
break
;
}
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
case
AF_INET6
:
{
struct
sockaddr_in6
*
sin6
;
sin6
=
(
struct
sockaddr_in6
*
)
sa
;
if
((
sin6
+
1
)
->
sin6_family
!=
AF_INET6
)
return
-
EINVAL
;
memcpy
(
&
saddr
->
a6
,
&
sin6
->
sin6_addr
,
sizeof
(
saddr
->
a6
));
sin6
++
;
memcpy
(
&
daddr
->
a6
,
&
sin6
->
sin6_addr
,
sizeof
(
daddr
->
a6
));
*
family
=
AF_INET6
;
break
;
}
#endif
default:
af
=
pfkey_sockaddr_extract
((
struct
sockaddr
*
)
sa
,
saddr
);
if
(
!
af
)
return
-
EINVAL
;
socklen
=
pfkey_sockaddr_len
(
af
);
if
(
pfkey_sockaddr_extract
((
struct
sockaddr
*
)
(
sa
+
socklen
),
daddr
)
!=
af
)
return
-
EINVAL
;
}
*
family
=
af
;
return
0
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录