提交 41ef1132 编写于 作者: K Kozlov Dmitry

ipoe: detect giaddr if not specified

上级 22ecfca7
...@@ -27,8 +27,7 @@ ...@@ -27,8 +27,7 @@
#define BUF_SIZE 4096 #define BUF_SIZE 4096
struct dhcpv4_relay_ctx struct dhcpv4_relay_ctx {
{
struct list_head entry; struct list_head entry;
struct triton_context_t *ctx; struct triton_context_t *ctx;
triton_event_func recv; triton_event_func recv;
...@@ -796,9 +795,10 @@ struct dhcpv4_relay *dhcpv4_relay_create(const char *_addr, const char *_giaddr, ...@@ -796,9 +795,10 @@ struct dhcpv4_relay *dhcpv4_relay_create(const char *_addr, const char *_giaddr,
struct dhcpv4_relay *r; struct dhcpv4_relay *r;
in_addr_t addr;// = inet_addr(_addr); in_addr_t addr;// = inet_addr(_addr);
int port = DHCP_SERV_PORT; int port = DHCP_SERV_PORT;
in_addr_t giaddr = inet_addr(_giaddr); in_addr_t giaddr;// = inet_addr(_giaddr);
struct sockaddr_in raddr; struct sockaddr_in raddr;
struct sockaddr_in laddr; struct sockaddr_in laddr;
socklen_t len = sizeof(laddr);
int sock = -1; int sock = -1;
int f = 1; int f = 1;
struct dhcpv4_relay_ctx *c; struct dhcpv4_relay_ctx *c;
...@@ -811,6 +811,32 @@ struct dhcpv4_relay *dhcpv4_relay_create(const char *_addr, const char *_giaddr, ...@@ -811,6 +811,32 @@ struct dhcpv4_relay *dhcpv4_relay_create(const char *_addr, const char *_giaddr,
port = atoi(ptr + 1); port = atoi(ptr + 1);
} else } else
addr = inet_addr(_addr); addr = inet_addr(_addr);
memset(&raddr, 0, sizeof(raddr));
raddr.sin_family = AF_INET;
raddr.sin_addr.s_addr = addr;
raddr.sin_port = htons(port);
if (_giaddr)
giaddr = inet_addr(_giaddr);
else {
sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (connect(sock, &raddr, sizeof(raddr))) {
log_error("dhcpv4: relay: %s: connect: %s\n", _addr, strerror(errno));
goto out_err;
}
getsockname(sock, &laddr, &len);
giaddr = laddr.sin_addr.s_addr;
close(sock);
}
memset(&laddr, 0, sizeof(laddr));
laddr.sin_family = AF_INET;
laddr.sin_addr.s_addr = giaddr;
laddr.sin_port = htons(DHCP_SERV_PORT);
list_for_each_entry(r, &relay_list, entry) { list_for_each_entry(r, &relay_list, entry) {
if (r->addr == addr && r->giaddr == giaddr) if (r->addr == addr && r->giaddr == giaddr)
...@@ -823,16 +849,6 @@ struct dhcpv4_relay *dhcpv4_relay_create(const char *_addr, const char *_giaddr, ...@@ -823,16 +849,6 @@ struct dhcpv4_relay *dhcpv4_relay_create(const char *_addr, const char *_giaddr,
r->addr = addr; r->addr = addr;
r->giaddr = giaddr; r->giaddr = giaddr;
memset(&raddr, 0, sizeof(raddr));
raddr.sin_family = AF_INET;
raddr.sin_addr.s_addr = addr;
raddr.sin_port = htons(port);
memset(&laddr, 0, sizeof(laddr));
laddr.sin_family = AF_INET;
laddr.sin_addr.s_addr = giaddr;
laddr.sin_port = htons(DHCP_SERV_PORT);
sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (!sock) { if (!sock) {
log_error("socket: %s\n", strerror(errno)); log_error("socket: %s\n", strerror(errno));
......
...@@ -378,7 +378,6 @@ static void ipoe_session_start(struct ipoe_session *ses) ...@@ -378,7 +378,6 @@ static void ipoe_session_start(struct ipoe_session *ses)
if (ses->serv->opt_shared == 0 && (!ses->ses.ipv4 || ses->ses.ipv4->peer_addr == ses->yiaddr)) { if (ses->serv->opt_shared == 0 && (!ses->ses.ipv4 || ses->ses.ipv4->peer_addr == ses->yiaddr)) {
strncpy(ses->ses.ifname, ses->serv->ifname, AP_IFNAME_LEN); strncpy(ses->ses.ifname, ses->serv->ifname, AP_IFNAME_LEN);
ses->ses.ifindex = ses->serv->ifindex; ses->ses.ifindex = ses->serv->ifindex;
ses->ctrl.dont_ifcfg = 1;
} else if (ses->ifindex == -1) { } else if (ses->ifindex == -1) {
pthread_mutex_lock(&uc_lock); pthread_mutex_lock(&uc_lock);
if (!list_empty(&uc_list)) { if (!list_empty(&uc_list)) {
...@@ -410,6 +409,7 @@ static void ipoe_session_start(struct ipoe_session *ses) ...@@ -410,6 +409,7 @@ static void ipoe_session_start(struct ipoe_session *ses)
strncpy(ses->ses.ifname, ifr.ifr_name, AP_IFNAME_LEN); strncpy(ses->ses.ifname, ifr.ifr_name, AP_IFNAME_LEN);
ses->ses.ifindex = ses->ifindex; ses->ses.ifindex = ses->ifindex;
ses->ses.unit_idx = ses->ifindex; ses->ses.unit_idx = ses->ifindex;
ses->ctrl.dont_ifcfg = 0;
} }
ap_session_set_ifindex(&ses->ses); ap_session_set_ifindex(&ses->ses);
...@@ -1511,7 +1511,7 @@ static void add_interface(const char *ifname, int ifindex, const char *opt) ...@@ -1511,7 +1511,7 @@ static void add_interface(const char *ifname, int ifindex, const char *opt)
serv->dhcpv4_relay = NULL; serv->dhcpv4_relay = NULL;
} }
if (serv->opt_dhcpv4 && opt_relay && opt_giaddr) { if (serv->opt_dhcpv4 && opt_relay) {
if (opt_ifcfg) if (opt_ifcfg)
ipoe_serv_add_addr(serv, giaddr); ipoe_serv_add_addr(serv, giaddr);
serv->dhcpv4_relay = dhcpv4_relay_create(opt_relay, opt_giaddr, &serv->ctx, (triton_event_func)ipoe_recv_dhcpv4_relay); serv->dhcpv4_relay = dhcpv4_relay_create(opt_relay, opt_giaddr, &serv->ctx, (triton_event_func)ipoe_recv_dhcpv4_relay);
...@@ -1550,7 +1550,7 @@ static void add_interface(const char *ifname, int ifindex, const char *opt) ...@@ -1550,7 +1550,7 @@ static void add_interface(const char *ifname, int ifindex, const char *opt)
if (serv->dhcpv4) if (serv->dhcpv4)
serv->dhcpv4->recv = ipoe_recv_dhcpv4; serv->dhcpv4->recv = ipoe_recv_dhcpv4;
if (opt_relay && opt_giaddr) { if (opt_relay) {
if (opt_ifcfg) if (opt_ifcfg)
ipoe_serv_add_addr(serv, giaddr); ipoe_serv_add_addr(serv, giaddr);
serv->dhcpv4_relay = dhcpv4_relay_create(opt_relay, opt_giaddr, &serv->ctx, (triton_event_func)ipoe_recv_dhcpv4_relay); serv->dhcpv4_relay = dhcpv4_relay_create(opt_relay, opt_giaddr, &serv->ctx, (triton_event_func)ipoe_recv_dhcpv4_relay);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册