Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Achou.Wang
accel-ppp
提交
421dac78
A
accel-ppp
项目概览
Achou.Wang
/
accel-ppp
通知
6
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
A
accel-ppp
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
421dac78
编写于
10月 27, 2014
作者:
D
Dmitry Kozlov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
ipoe: implemented handling relayed DHCP clients
上级
1819d99a
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
84 addition
and
43 deletion
+84
-43
accel-pppd/ctrl/ipoe/dhcpv4.c
accel-pppd/ctrl/ipoe/dhcpv4.c
+21
-17
accel-pppd/ctrl/ipoe/dhcpv4.h
accel-pppd/ctrl/ipoe/dhcpv4.h
+1
-0
accel-pppd/ctrl/ipoe/ipoe.c
accel-pppd/ctrl/ipoe/ipoe.c
+48
-19
accel-pppd/libnetlink/iputils.c
accel-pppd/libnetlink/iputils.c
+12
-5
accel-pppd/libnetlink/iputils.h
accel-pppd/libnetlink/iputils.h
+2
-2
未找到文件。
accel-pppd/ctrl/ipoe/dhcpv4.c
浏览文件 @
421dac78
...
...
@@ -506,6 +506,8 @@ static int dhcpv4_read(struct triton_md_handler_t *h)
continue
;
}
pack
->
src_addr
=
addr
.
sin_addr
.
s_addr
;
if
(
serv
->
recv
)
serv
->
recv
(
serv
,
pack
);
...
...
@@ -640,7 +642,7 @@ static int dhcpv4_send_raw(struct dhcpv4_serv *serv, struct dhcpv4_packet *pack,
return
0
;
}
static
int
dhcpv4_send_udp
(
struct
dhcpv4_serv
*
serv
,
struct
dhcpv4_packet
*
pack
)
static
int
dhcpv4_send_udp
(
struct
dhcpv4_serv
*
serv
,
struct
dhcpv4_packet
*
pack
,
in_addr_t
ip
,
int
port
)
{
struct
sockaddr_in
addr
;
int
n
;
...
...
@@ -648,8 +650,8 @@ static int dhcpv4_send_udp(struct dhcpv4_serv *serv, struct dhcpv4_packet *pack)
memset
(
&
addr
,
0
,
sizeof
(
addr
));
addr
.
sin_family
=
AF_INET
;
addr
.
sin_port
=
htons
(
DHCP_CLIENT_PORT
);
addr
.
sin_addr
.
s_addr
=
pack
->
hdr
->
giaddr
;
addr
.
sin_port
=
htons
(
port
);
addr
.
sin_addr
.
s_addr
=
ip
;
n
=
sendto
(
serv
->
hnd
.
fd
,
pack
->
data
,
len
,
0
,
(
struct
sockaddr
*
)
&
addr
,
sizeof
(
addr
));
if
(
n
!=
len
)
...
...
@@ -658,14 +660,6 @@ static int dhcpv4_send_udp(struct dhcpv4_serv *serv, struct dhcpv4_packet *pack)
return
0
;
}
static
int
dhcpv4_send
(
struct
dhcpv4_serv
*
serv
,
struct
dhcpv4_packet
*
pack
,
in_addr_t
saddr
,
in_addr_t
daddr
)
{
if
(
pack
->
hdr
->
giaddr
)
return
dhcpv4_send_udp
(
serv
,
pack
);
return
dhcpv4_send_raw
(
serv
,
pack
,
saddr
,
daddr
);
}
int
dhcpv4_packet_add_opt
(
struct
dhcpv4_packet
*
pack
,
int
type
,
const
void
*
data
,
int
len
)
{
struct
dhcpv4_option
*
opt
=
mempool_alloc
(
opt_pool
);
...
...
@@ -713,12 +707,13 @@ int dhcpv4_send_reply(int msg_type, struct dhcpv4_serv *serv, struct dhcpv4_pack
memcpy
(
pack
->
hdr
,
req
->
hdr
,
sizeof
(
*
req
->
hdr
));
pack
->
hdr
->
op
=
DHCP_OP_REPLY
;
//pack->hdr->ciaddr = 0;
pack
->
hdr
->
yiaddr
=
yiaddr
;
if
(
msg_type
==
DHCP
OFFER
)
pack
->
hdr
->
siaddr
=
s
iaddr
;
if
(
msg_type
==
DHCP
ACK
)
pack
->
hdr
->
ciaddr
=
req
->
hdr
->
c
iaddr
;
else
pack
->
hdr
->
siaddr
=
0
;
pack
->
hdr
->
ciaddr
=
0
;
pack
->
hdr
->
siaddr
=
0
;
pack
->
hdr
->
giaddr
=
req
->
hdr
->
giaddr
;
if
(
dhcpv4_packet_add_opt
(
pack
,
53
,
&
msg_type
,
1
))
goto
out_err
;
...
...
@@ -768,7 +763,12 @@ int dhcpv4_send_reply(int msg_type, struct dhcpv4_serv *serv, struct dhcpv4_pack
dhcpv4_print_packet
(
pack
,
0
,
log_ppp_info2
);
}
r
=
dhcpv4_send
(
serv
,
pack
,
siaddr
,
yiaddr
);
if
(
req
->
hdr
->
giaddr
)
r
=
dhcpv4_send_udp
(
serv
,
pack
,
req
->
hdr
->
giaddr
,
DHCP_SERV_PORT
);
else
if
(
pack
->
hdr
->
ciaddr
)
r
=
dhcpv4_send_udp
(
serv
,
pack
,
req
->
hdr
->
ciaddr
,
DHCP_CLIENT_PORT
);
else
r
=
dhcpv4_send_raw
(
serv
,
pack
,
siaddr
,
yiaddr
);
dhcpv4_packet_free
(
pack
);
...
...
@@ -796,6 +796,7 @@ int dhcpv4_send_nak(struct dhcpv4_serv *serv, struct dhcpv4_packet *req)
pack
->
hdr
->
ciaddr
=
0
;
pack
->
hdr
->
yiaddr
=
0
;
pack
->
hdr
->
siaddr
=
0
;
pack
->
hdr
->
giaddr
=
req
->
hdr
->
giaddr
;
val
=
DHCPNAK
;
if
(
dhcpv4_packet_add_opt
(
pack
,
53
,
&
val
,
1
))
...
...
@@ -809,7 +810,10 @@ int dhcpv4_send_nak(struct dhcpv4_serv *serv, struct dhcpv4_packet *req)
dhcpv4_print_packet
(
pack
,
0
,
log_info2
);
}
r
=
dhcpv4_send
(
serv
,
pack
,
0
,
0xffffffff
);
if
(
req
->
hdr
->
giaddr
)
r
=
dhcpv4_send_udp
(
serv
,
pack
,
req
->
hdr
->
giaddr
,
DHCP_SERV_PORT
);
else
r
=
dhcpv4_send_raw
(
serv
,
pack
,
0
,
0xffffffff
);
dhcpv4_packet_free
(
pack
);
...
...
accel-pppd/ctrl/ipoe/dhcpv4.h
浏览文件 @
421dac78
...
...
@@ -65,6 +65,7 @@ struct dhcpv4_packet {
uint32_t
request_ip
;
uint32_t
server_id
;
int
msg_type
;
in_addr_t
src_addr
;
int
volatile
refs
;
uint8_t
*
ptr
;
uint8_t
data
[
0
];
...
...
accel-pppd/ctrl/ipoe/ipoe.c
浏览文件 @
421dac78
...
...
@@ -615,7 +615,7 @@ static void find_gw_addr(struct ipoe_session *ses)
list_for_each_entry
(
a
,
&
conf_gw_addr
,
entry
)
{
if
((
ntohl
(
ses
->
yiaddr
)
&
(
a
->
mask1
))
==
(
ntohl
(
a
->
addr
)
&
(
a
->
mask1
)))
{
ses
->
siadd
r
=
a
->
addr
;
ses
->
route
r
=
a
->
addr
;
ses
->
mask
=
a
->
mask
;
return
;
}
...
...
@@ -633,9 +633,6 @@ static void __ipoe_session_start(struct ipoe_session *ses)
if
(
!
ses
->
yiaddr
&&
!
ses
->
serv
->
opt_nat
)
ses
->
ses
.
ipv4
=
ipdb_get_ipv4
(
&
ses
->
ses
);
if
(
!
ses
->
mask
)
ses
->
mask
=
conf_netmask
;
if
(
ses
->
ses
.
ipv4
)
{
if
(
!
ses
->
mask
)
ses
->
mask
=
ses
->
ses
.
ipv4
->
mask
;
...
...
@@ -652,20 +649,49 @@ static void __ipoe_session_start(struct ipoe_session *ses)
ses->ipv4.mask = ses->mask;
ses->ipv4.owner = NULL;
}*/
if
(
ses
->
dhcpv4_request
)
{
if
(
!
ses
->
yiaddr
)
{
log_ppp_error
(
"no free IPv4 address
\n
"
);
ap_session_terminate
(
&
ses
->
ses
,
TERM_NAS_REQUEST
,
0
);
return
;
}
if
(
!
ses
->
router
)
find_gw_addr
(
ses
);
if
(
!
ses
->
mask
)
ses
->
mask
=
conf_netmask
;
if
(
!
ses
->
mask
)
ses
->
mask
=
32
;
if
(
ses
->
dhcpv4_request
->
hdr
->
giaddr
)
{
/*uint32_t mask = ses->mask == 32 ? 0xffffffff : (((1 << ses->mask) - 1) << (32 - ses->mask));
ses->siaddr = iproute_get(ses->dhcpv4_request->hdr->giaddr);
if ((ntohl(ses->router) & mask) == (ntohl(ses->siaddr) & mask))
ses->siaddr = ses->router;
else if (!ses->router)
ses->router = ses->dhcpv4_request->hdr->giaddr;*/
if
(
ses
->
serv
->
opt_mode
==
MODE_L2
)
ses
->
siaddr
=
ses
->
router
;
else
{
ses
->
siaddr
=
iproute_get
(
ses
->
dhcpv4_request
->
hdr
->
giaddr
,
NULL
);
if
(
!
ses
->
router
)
ses
->
router
=
ses
->
dhcpv4_request
->
hdr
->
giaddr
;
}
}
if
(
!
ses
->
router
)
{
log_ppp_error
(
"can't determine router address
\n
"
);
ap_session_terminate
(
&
ses
->
ses
,
TERM_NAS_REQUEST
,
0
);
return
;
}
if
(
!
ses
->
siaddr
&&
ses
->
router
!=
ses
->
yiaddr
)
ses
->
siaddr
=
ses
->
router
;
if
(
!
ses
->
siaddr
)
find_gw_addr
(
ses
);
if
(
!
ses
->
siaddr
)
ses
->
siaddr
=
ses
->
serv
->
opt_src
;
...
...
@@ -681,12 +707,6 @@ static void __ipoe_session_start(struct ipoe_session *ses)
if
(
ses
->
ses
.
ipv4
&&
!
ses
->
ses
.
ipv4
->
addr
)
ses
->
ses
.
ipv4
->
addr
=
ses
->
siaddr
;
if
(
!
ses
->
router
)
ses
->
router
=
ses
->
siaddr
;
if
(
!
ses
->
mask
)
ses
->
mask
=
32
;
dhcpv4_send_reply
(
DHCPOFFER
,
ses
->
serv
->
dhcpv4
,
ses
->
dhcpv4_request
,
ses
->
yiaddr
,
ses
->
siaddr
,
ses
->
router
,
ses
->
mask
,
ses
->
lease_time
,
ses
->
dhcpv4_relay_reply
);
dhcpv4_packet_free
(
ses
->
dhcpv4_request
);
...
...
@@ -704,7 +724,7 @@ static void __ipoe_session_start(struct ipoe_session *ses)
ses
->
siaddr
=
ses
->
serv
->
opt_src
;
if
(
!
ses
->
siaddr
)
ses
->
siaddr
=
iproute_get
(
ses
->
yiaddr
);
ses
->
siaddr
=
iproute_get
(
ses
->
yiaddr
,
NULL
);
if
(
!
ses
->
siaddr
)
{
log_ppp_error
(
"can't determine local address
\n
"
);
...
...
@@ -779,7 +799,7 @@ static void ipoe_ifcfg_add(struct ipoe_session *ses)
ipoe_serv_add_addr
(
ses
->
serv
,
ses
->
siaddr
,
conf_ip_unnumbered
?
32
:
ses
->
mask
);
if
(
conf_ip_unnumbered
)
{
if
(
iproute_add
(
serv
->
ifindex
,
ses
->
serv
->
opt_src
?
ses
->
serv
->
opt_src
:
ses
->
router
,
ses
->
yiaddr
,
conf_proto
))
if
(
iproute_add
(
serv
->
ifindex
,
ses
->
serv
->
opt_src
?
ses
->
serv
->
opt_src
:
ses
->
router
,
ses
->
yiaddr
,
0
,
conf_proto
))
log_ppp_warn
(
"ipoe: failed to add route to interface '%s'
\n
"
,
serv
->
ifname
);
}
...
...
@@ -817,7 +837,16 @@ static void __ipoe_session_activate(struct ipoe_session *ses)
addr
=
ses
->
ses
.
ipv4
->
peer_addr
;
else
if
(
!
conf_ip_unnumbered
)
ses
->
ctrl
.
dont_ifcfg
=
1
;
if
(
ses
->
dhcpv4_request
&&
ses
->
serv
->
opt_mode
==
MODE_L3
)
{
in_addr_t
gw
;
iproute_get
(
ses
->
router
,
&
gw
);
if
(
gw
)
iproute_add
(
0
,
ses
->
siaddr
,
ses
->
yiaddr
,
gw
,
conf_proto
);
else
iproute_add
(
0
,
ses
->
siaddr
,
ses
->
router
,
gw
,
conf_proto
);
}
if
(
ipoe_nl_modify
(
ses
->
ifindex
,
ses
->
yiaddr
,
addr
,
NULL
,
NULL
))
{
ap_session_terminate
(
&
ses
->
ses
,
TERM_NAS_ERROR
,
0
);
return
;
...
...
@@ -837,10 +866,10 @@ static void __ipoe_session_activate(struct ipoe_session *ses)
ipoe_nl_add_exclude
(
ses
->
yiaddr
,
32
);
iproute_add
(
ses
->
serv
->
ifindex
,
ses
->
siaddr
,
ses
->
yiaddr
,
conf_proto
);
iproute_add
(
ses
->
serv
->
ifindex
,
ses
->
siaddr
,
ses
->
yiaddr
,
0
,
conf_proto
);
ses
->
ctrl
.
dont_ifcfg
=
1
;
}
else
if
(
ses
->
ctrl
.
dont_ifcfg
)
}
else
if
(
ses
->
ctrl
.
dont_ifcfg
&&
ses
->
serv
->
opt_mode
==
MODE_L2
)
ipaddr_add
(
ses
->
ifindex
,
ses
->
siaddr
,
ses
->
mask
);
if
(
ses
->
l4_redirect
)
...
...
accel-pppd/libnetlink/iputils.c
浏览文件 @
421dac78
...
...
@@ -305,7 +305,7 @@ int __export ipaddr_del(int ifindex, in_addr_t addr, int mask)
return
0
;
}
int
__export
iproute_add
(
int
ifindex
,
in_addr_t
src
,
in_addr_t
dst
,
int
proto
)
int
__export
iproute_add
(
int
ifindex
,
in_addr_t
src
,
in_addr_t
dst
,
in
_addr_t
gw
,
in
t
proto
)
{
struct
ipaddr_req
{
struct
nlmsghdr
n
;
...
...
@@ -326,15 +326,18 @@ int __export iproute_add(int ifindex, in_addr_t src, in_addr_t dst, int proto)
req
.
n
.
nlmsg_type
=
RTM_NEWROUTE
;
req
.
i
.
rtm_family
=
AF_INET
;
req
.
i
.
rtm_table
=
RT_TABLE_MAIN
;
req
.
i
.
rtm_scope
=
RT_SCOPE_LINK
;
req
.
i
.
rtm_scope
=
ifindex
?
RT_SCOPE_LINK
:
RT_SCOPE_UNIVERSE
;
req
.
i
.
rtm_protocol
=
proto
;
req
.
i
.
rtm_type
=
RTN_UNICAST
;
req
.
i
.
rtm_dst_len
=
32
;
if
(
ifindex
)
addattr32
(
&
req
.
n
,
sizeof
(
req
),
RTA_OIF
,
ifindex
);
if
(
src
)
addattr32
(
&
req
.
n
,
sizeof
(
req
),
RTA_PREFSRC
,
src
);
if
(
gw
)
addattr32
(
&
req
.
n
,
sizeof
(
req
),
RTA_GATEWAY
,
gw
);
addattr32
(
&
req
.
n
,
sizeof
(
req
),
RTA_DST
,
dst
);
addattr32
(
&
req
.
n
,
sizeof
(
req
),
RTA_OIF
,
ifindex
);
if
(
rtnl_talk
(
rth
,
&
req
.
n
,
0
,
0
,
NULL
,
NULL
,
NULL
,
0
)
<
0
)
return
-
1
;
...
...
@@ -413,7 +416,7 @@ int __export ip6route_add(int ifindex, struct in6_addr *dst, int pref_len, int p
}
in_addr_t
__export
iproute_get
(
in_addr_t
dst
)
in_addr_t
__export
iproute_get
(
in_addr_t
dst
,
in_addr_t
*
gw
)
{
struct
ipaddr_req
{
struct
nlmsghdr
n
;
...
...
@@ -424,6 +427,7 @@ in_addr_t __export iproute_get(in_addr_t dst)
struct
rtattr
*
tb
[
RTA_MAX
+
1
];
int
len
;
in_addr_t
res
=
0
;
*
gw
=
0
;
if
(
!
rth
)
open_rth
();
...
...
@@ -470,7 +474,10 @@ in_addr_t __export iproute_get(in_addr_t dst)
if
(
tb
[
RTA_PREFSRC
])
res
=
*
(
uint32_t
*
)
RTA_DATA
(
tb
[
RTA_PREFSRC
]);
if
(
gw
&&
tb
[
RTA_GATEWAY
])
*
gw
=
*
(
uint32_t
*
)
RTA_DATA
(
tb
[
RTA_GATEWAY
]);
out:
return
res
;
}
...
...
accel-pppd/libnetlink/iputils.h
浏览文件 @
421dac78
...
...
@@ -14,9 +14,9 @@ int iplink_vlan_del(int ifindex);
int
ipaddr_add
(
int
ifindex
,
in_addr_t
addr
,
int
mask
);
int
ipaddr_del
(
int
ifindex
,
in_addr_t
addr
,
int
mask
);
int
iproute_add
(
int
ifindex
,
in_addr_t
src
,
in_addr_t
dst
,
int
proto
);
int
iproute_add
(
int
ifindex
,
in_addr_t
src
,
in_addr_t
dst
,
in
_addr_t
gw
,
in
t
proto
);
int
iproute_del
(
int
ifindex
,
in_addr_t
dst
,
int
proto
);
in_addr_t
iproute_get
(
in_addr_t
dst
);
in_addr_t
iproute_get
(
in_addr_t
dst
,
in_addr_t
*
gw
);
int
ip6route_add
(
int
ifindex
,
struct
in6_addr
*
dst
,
int
prefix_len
,
int
proto
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录