diff options
author | Dmitry Kozlov <xeb@mail.ru> | 2016-06-08 22:57:36 +0300 |
---|---|---|
committer | Dmitry Kozlov <xeb@mail.ru> | 2016-06-08 22:57:36 +0300 |
commit | 2d10076d240537e1f48bca0bb6e0b99aa4427406 (patch) | |
tree | 6ba7d9e826e7227ef56e6e808edacd674aa7ec37 | |
parent | 00015eb051babde040ec30e3b867f49b7d4e5441 (diff) | |
download | accel-ppp-2d10076d240537e1f48bca0bb6e0b99aa4427406.tar.gz accel-ppp-2d10076d240537e1f48bca0bb6e0b99aa4427406.zip |
ipoe: fixed incorrect arp reply (reply for request which started session)
-rw-r--r-- | accel-pppd/ctrl/ipoe/arp.c | 1 | ||||
-rw-r--r-- | accel-pppd/ctrl/ipoe/ipoe.c | 21 |
2 files changed, 14 insertions, 8 deletions
diff --git a/accel-pppd/ctrl/ipoe/arp.c b/accel-pppd/ctrl/ipoe/arp.c index 58533582..4818c3b5 100644 --- a/accel-pppd/ctrl/ipoe/arp.c +++ b/accel-pppd/ctrl/ipoe/arp.c @@ -120,6 +120,7 @@ void arp_send(int ifindex, struct _arphdr *arph) dst.sll_family = AF_PACKET; dst.sll_ifindex = ifindex; dst.sll_protocol = htons(ETH_P_ARP); + memcpy(dst.sll_addr, arph->ar_tha, ETH_ALEN); arph->ar_op = htons(ARPOP_REPLY); diff --git a/accel-pppd/ctrl/ipoe/ipoe.c b/accel-pppd/ctrl/ipoe/ipoe.c index b3e2ba25..c7db14aa 100644 --- a/accel-pppd/ctrl/ipoe/ipoe.c +++ b/accel-pppd/ctrl/ipoe/ipoe.c @@ -892,6 +892,19 @@ static void __ipoe_session_activate(struct ipoe_session *ses) } else ses->ctrl.dont_ifcfg = 0; + if (ses->arph) { + if (ses->arph->ar_tpa == ses->router) { + memcpy(ses->arph->ar_tha, ses->arph->ar_sha, ETH_ALEN); + memcpy(ses->arph->ar_sha, ses->serv->hwaddr, ETH_ALEN); + ses->arph->ar_tpa = ses->arph->ar_spa; + ses->arph->ar_spa = ses->router; + arp_send(ses->serv->ifindex, ses->arph); + } + + _free(ses->arph); + ses->arph = NULL; + } + if (ses->serv->opt_mode == MODE_L2 && ses->serv->opt_ipv6 && sock6_fd != -1) { ses->ses.ipv6 = ipdb_get_ipv6(&ses->ses); if (!ses->ses.ipv6) @@ -919,14 +932,6 @@ static void __ipoe_session_activate(struct ipoe_session *ses) dhcpv4_packet_free(ses->dhcpv4_request); ses->dhcpv4_request = NULL; - } else if (ses->arph) { - if (ses->arph->ar_tpa == ses->router) { - memcpy(ses->arph->ar_tha, ses->serv->hwaddr, ETH_ALEN); - arp_send(ses->serv->ifindex, ses->arph); - } - - _free(ses->arph); - ses->arph = NULL; } ses->timer.expire = ipoe_session_timeout; |