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 /accel-pppd/ctrl/ipoe/ipoe.c | |
parent | 00015eb051babde040ec30e3b867f49b7d4e5441 (diff) | |
download | accel-ppp-2d10076d240537e1f48bca0bb6e0b99aa4427406.tar.gz accel-ppp-2d10076d240537e1f48bca0bb6e0b99aa4427406.zip |
ipoe: fixed incorrect arp reply (reply for request which started session)
Diffstat (limited to 'accel-pppd/ctrl/ipoe/ipoe.c')
-rw-r--r-- | accel-pppd/ctrl/ipoe/ipoe.c | 21 |
1 files changed, 13 insertions, 8 deletions
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; |