Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
raspberrypi-kernel
提交
300aaeea
R
raspberrypi-kernel
项目概览
openeuler
/
raspberrypi-kernel
通知
13
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
raspberrypi-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
300aaeea
编写于
3月 24, 2008
作者:
Y
YOSHIFUJI Hideaki
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[IPV6] SIT: Add SIOCGETPRL ioctl to get/dump PRL.
Signed-off-by:
N
YOSHIFUJI Hideaki
<
yoshfuji@linux-ipv6.org
>
上级
0009ae1f
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
95 addition
and
10 deletion
+95
-10
include/linux/if_tunnel.h
include/linux/if_tunnel.h
+4
-0
include/net/ipip.h
include/net/ipip.h
+4
-1
net/ipv6/sit.c
net/ipv6/sit.c
+87
-9
未找到文件。
include/linux/if_tunnel.h
浏览文件 @
300aaeea
...
@@ -7,6 +7,7 @@
...
@@ -7,6 +7,7 @@
#define SIOCADDTUNNEL (SIOCDEVPRIVATE + 1)
#define SIOCADDTUNNEL (SIOCDEVPRIVATE + 1)
#define SIOCDELTUNNEL (SIOCDEVPRIVATE + 2)
#define SIOCDELTUNNEL (SIOCDEVPRIVATE + 2)
#define SIOCCHGTUNNEL (SIOCDEVPRIVATE + 3)
#define SIOCCHGTUNNEL (SIOCDEVPRIVATE + 3)
#define SIOCGETPRL (SIOCDEVPRIVATE + 4)
#define SIOCADDPRL (SIOCDEVPRIVATE + 5)
#define SIOCADDPRL (SIOCDEVPRIVATE + 5)
#define SIOCDELPRL (SIOCDEVPRIVATE + 6)
#define SIOCDELPRL (SIOCDEVPRIVATE + 6)
#define SIOCCHGPRL (SIOCDEVPRIVATE + 7)
#define SIOCCHGPRL (SIOCDEVPRIVATE + 7)
...
@@ -38,6 +39,9 @@ struct ip_tunnel_prl {
...
@@ -38,6 +39,9 @@ struct ip_tunnel_prl {
__be32
addr
;
__be32
addr
;
__u16
flags
;
__u16
flags
;
__u16
__reserved
;
__u16
__reserved
;
__u32
datalen
;
__u32
__reserved2
;
void
__user
*
data
;
};
};
/* PRL flags */
/* PRL flags */
...
...
include/net/ipip.h
浏览文件 @
300aaeea
...
@@ -24,13 +24,16 @@ struct ip_tunnel
...
@@ -24,13 +24,16 @@ struct ip_tunnel
int
mlink
;
int
mlink
;
struct
ip_tunnel_parm
parms
;
struct
ip_tunnel_parm
parms
;
struct
ip_tunnel_prl_entry
*
prl
;
/* potential router list */
struct
ip_tunnel_prl_entry
*
prl
;
/* potential router list */
unsigned
int
prl_count
;
/* # of entries in PRL */
};
};
struct
ip_tunnel_prl_entry
struct
ip_tunnel_prl_entry
{
{
struct
ip_tunnel_prl_entry
*
next
;
struct
ip_tunnel_prl_entry
*
next
;
struct
ip_tunnel_prl
entry
;
__be32
addr
;
u16
flags
;
};
};
#define IPTUNNEL_XMIT() do { \
#define IPTUNNEL_XMIT() do { \
...
...
net/ipv6/sit.c
浏览文件 @
300aaeea
...
@@ -203,12 +203,73 @@ __ipip6_tunnel_locate_prl(struct ip_tunnel *t, __be32 addr)
...
@@ -203,12 +203,73 @@ __ipip6_tunnel_locate_prl(struct ip_tunnel *t, __be32 addr)
struct
ip_tunnel_prl_entry
*
p
=
(
struct
ip_tunnel_prl_entry
*
)
NULL
;
struct
ip_tunnel_prl_entry
*
p
=
(
struct
ip_tunnel_prl_entry
*
)
NULL
;
for
(
p
=
t
->
prl
;
p
;
p
=
p
->
next
)
for
(
p
=
t
->
prl
;
p
;
p
=
p
->
next
)
if
(
p
->
entry
.
addr
==
addr
)
if
(
p
->
addr
==
addr
)
break
;
break
;
return
p
;
return
p
;
}
}
static
int
ipip6_tunnel_get_prl
(
struct
ip_tunnel
*
t
,
struct
ip_tunnel_prl
*
a
)
{
struct
ip_tunnel_prl
*
kp
;
struct
ip_tunnel_prl_entry
*
prl
;
unsigned
int
cmax
,
c
=
0
,
ca
,
len
;
int
ret
=
0
;
cmax
=
a
->
datalen
/
sizeof
(
*
a
);
if
(
cmax
>
1
&&
a
->
addr
!=
htonl
(
INADDR_ANY
))
cmax
=
1
;
/* For simple GET or for root users,
* we try harder to allocate.
*/
kp
=
(
cmax
<=
1
||
capable
(
CAP_NET_ADMIN
))
?
kcalloc
(
cmax
,
sizeof
(
*
kp
),
GFP_KERNEL
)
:
NULL
;
read_lock
(
&
ipip6_lock
);
ca
=
t
->
prl_count
<
cmax
?
t
->
prl_count
:
cmax
;
if
(
!
kp
)
{
/* We don't try hard to allocate much memory for
* non-root users.
* For root users, retry allocating enough memory for
* the answer.
*/
kp
=
kcalloc
(
ca
,
sizeof
(
*
kp
),
GFP_ATOMIC
);
if
(
!
kp
)
{
ret
=
-
ENOMEM
;
goto
out
;
}
}
c
=
0
;
for
(
prl
=
t
->
prl
;
prl
;
prl
=
prl
->
next
)
{
if
(
c
>
cmax
)
break
;
if
(
a
->
addr
!=
htonl
(
INADDR_ANY
)
&&
prl
->
addr
!=
a
->
addr
)
continue
;
kp
[
c
].
addr
=
prl
->
addr
;
kp
[
c
].
flags
=
prl
->
flags
;
c
++
;
if
(
a
->
addr
!=
htonl
(
INADDR_ANY
))
break
;
}
out:
read_unlock
(
&
ipip6_lock
);
len
=
sizeof
(
*
kp
)
*
c
;
ret
=
len
?
copy_to_user
(
a
->
data
,
kp
,
len
)
:
0
;
kfree
(
kp
);
if
(
ret
)
return
-
EFAULT
;
a
->
datalen
=
len
;
return
0
;
}
static
int
static
int
ipip6_tunnel_add_prl
(
struct
ip_tunnel
*
t
,
struct
ip_tunnel_prl
*
a
,
int
chg
)
ipip6_tunnel_add_prl
(
struct
ip_tunnel
*
t
,
struct
ip_tunnel_prl
*
a
,
int
chg
)
{
{
...
@@ -221,7 +282,7 @@ ipip6_tunnel_add_prl(struct ip_tunnel *t, struct ip_tunnel_prl *a, int chg)
...
@@ -221,7 +282,7 @@ ipip6_tunnel_add_prl(struct ip_tunnel *t, struct ip_tunnel_prl *a, int chg)
write_lock
(
&
ipip6_lock
);
write_lock
(
&
ipip6_lock
);
for
(
p
=
t
->
prl
;
p
;
p
=
p
->
next
)
{
for
(
p
=
t
->
prl
;
p
;
p
=
p
->
next
)
{
if
(
p
->
entry
.
addr
==
a
->
addr
)
{
if
(
p
->
addr
==
a
->
addr
)
{
if
(
chg
)
if
(
chg
)
goto
update
;
goto
update
;
err
=
-
EEXIST
;
err
=
-
EEXIST
;
...
@@ -242,8 +303,10 @@ ipip6_tunnel_add_prl(struct ip_tunnel *t, struct ip_tunnel_prl *a, int chg)
...
@@ -242,8 +303,10 @@ ipip6_tunnel_add_prl(struct ip_tunnel *t, struct ip_tunnel_prl *a, int chg)
p
->
next
=
t
->
prl
;
p
->
next
=
t
->
prl
;
t
->
prl
=
p
;
t
->
prl
=
p
;
t
->
prl_count
++
;
update:
update:
p
->
entry
=
*
a
;
p
->
addr
=
a
->
addr
;
p
->
flags
=
a
->
flags
;
out:
out:
write_unlock
(
&
ipip6_lock
);
write_unlock
(
&
ipip6_lock
);
return
err
;
return
err
;
...
@@ -259,10 +322,11 @@ ipip6_tunnel_del_prl(struct ip_tunnel *t, struct ip_tunnel_prl *a)
...
@@ -259,10 +322,11 @@ ipip6_tunnel_del_prl(struct ip_tunnel *t, struct ip_tunnel_prl *a)
if
(
a
&&
a
->
addr
!=
htonl
(
INADDR_ANY
))
{
if
(
a
&&
a
->
addr
!=
htonl
(
INADDR_ANY
))
{
for
(
p
=
&
t
->
prl
;
*
p
;
p
=
&
(
*
p
)
->
next
)
{
for
(
p
=
&
t
->
prl
;
*
p
;
p
=
&
(
*
p
)
->
next
)
{
if
((
*
p
)
->
entry
.
addr
==
a
->
addr
)
{
if
((
*
p
)
->
addr
==
a
->
addr
)
{
x
=
*
p
;
x
=
*
p
;
*
p
=
x
->
next
;
*
p
=
x
->
next
;
kfree
(
x
);
kfree
(
x
);
t
->
prl_count
--
;
goto
out
;
goto
out
;
}
}
}
}
...
@@ -272,6 +336,7 @@ ipip6_tunnel_del_prl(struct ip_tunnel *t, struct ip_tunnel_prl *a)
...
@@ -272,6 +336,7 @@ ipip6_tunnel_del_prl(struct ip_tunnel *t, struct ip_tunnel_prl *a)
x
=
t
->
prl
;
x
=
t
->
prl
;
t
->
prl
=
t
->
prl
->
next
;
t
->
prl
=
t
->
prl
->
next
;
kfree
(
x
);
kfree
(
x
);
t
->
prl_count
--
;
}
}
}
}
out:
out:
...
@@ -313,7 +378,7 @@ isatap_chksrc(struct sk_buff *skb, struct iphdr *iph, struct ip_tunnel *t)
...
@@ -313,7 +378,7 @@ isatap_chksrc(struct sk_buff *skb, struct iphdr *iph, struct ip_tunnel *t)
read_lock
(
&
ipip6_lock
);
read_lock
(
&
ipip6_lock
);
p
=
__ipip6_tunnel_locate_prl
(
t
,
iph
->
saddr
);
p
=
__ipip6_tunnel_locate_prl
(
t
,
iph
->
saddr
);
if
(
p
)
{
if
(
p
)
{
if
(
p
->
entry
.
flags
&
PRL_DEFAULT
)
if
(
p
->
flags
&
PRL_DEFAULT
)
skb
->
ndisc_nodetype
=
NDISC_NODETYPE_DEFAULT
;
skb
->
ndisc_nodetype
=
NDISC_NODETYPE_DEFAULT
;
else
else
skb
->
ndisc_nodetype
=
NDISC_NODETYPE_NODEFAULT
;
skb
->
ndisc_nodetype
=
NDISC_NODETYPE_NODEFAULT
;
...
@@ -899,11 +964,12 @@ ipip6_tunnel_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd)
...
@@ -899,11 +964,12 @@ ipip6_tunnel_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd)
err
=
0
;
err
=
0
;
break
;
break
;
case
SIOCGETPRL
:
case
SIOCADDPRL
:
case
SIOCADDPRL
:
case
SIOCDELPRL
:
case
SIOCDELPRL
:
case
SIOCCHGPRL
:
case
SIOCCHGPRL
:
err
=
-
EPERM
;
err
=
-
EPERM
;
if
(
!
capable
(
CAP_NET_ADMIN
))
if
(
cmd
!=
SIOCGETPRL
&&
!
capable
(
CAP_NET_ADMIN
))
goto
done
;
goto
done
;
err
=
-
EINVAL
;
err
=
-
EINVAL
;
if
(
dev
==
ipip6_fb_tunnel_dev
)
if
(
dev
==
ipip6_fb_tunnel_dev
)
...
@@ -915,11 +981,23 @@ ipip6_tunnel_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd)
...
@@ -915,11 +981,23 @@ ipip6_tunnel_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd)
if
(
!
(
t
=
netdev_priv
(
dev
)))
if
(
!
(
t
=
netdev_priv
(
dev
)))
goto
done
;
goto
done
;
if
(
cmd
==
SIOCDELPRL
)
switch
(
cmd
)
{
case
SIOCGETPRL
:
err
=
ipip6_tunnel_get_prl
(
t
,
&
prl
);
if
(
!
err
&&
copy_to_user
(
ifr
->
ifr_ifru
.
ifru_data
,
&
prl
,
sizeof
(
prl
)))
err
=
-
EFAULT
;
break
;
case
SIOCDELPRL
:
err
=
ipip6_tunnel_del_prl
(
t
,
&
prl
);
err
=
ipip6_tunnel_del_prl
(
t
,
&
prl
);
else
break
;
case
SIOCADDPRL
:
case
SIOCCHGPRL
:
err
=
ipip6_tunnel_add_prl
(
t
,
&
prl
,
cmd
==
SIOCCHGPRL
);
err
=
ipip6_tunnel_add_prl
(
t
,
&
prl
,
cmd
==
SIOCCHGPRL
);
netdev_state_change
(
dev
);
break
;
}
if
(
cmd
!=
SIOCGETPRL
)
netdev_state_change
(
dev
);
break
;
break
;
default:
default:
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录