summaryrefslogtreecommitdiff
path: root/accel-pppd/ctrl
diff options
context:
space:
mode:
authorDmitry Kozlov <xeb@mail.ru>2016-06-08 22:57:36 +0300
committerDmitry Kozlov <xeb@mail.ru>2016-06-08 22:57:36 +0300
commit2d10076d240537e1f48bca0bb6e0b99aa4427406 (patch)
tree6ba7d9e826e7227ef56e6e808edacd674aa7ec37 /accel-pppd/ctrl
parent00015eb051babde040ec30e3b867f49b7d4e5441 (diff)
downloadaccel-ppp-xebd-2d10076d240537e1f48bca0bb6e0b99aa4427406.tar.gz
accel-ppp-xebd-2d10076d240537e1f48bca0bb6e0b99aa4427406.zip
ipoe: fixed incorrect arp reply (reply for request which started session)
Diffstat (limited to 'accel-pppd/ctrl')
-rw-r--r--accel-pppd/ctrl/ipoe/arp.c1
-rw-r--r--accel-pppd/ctrl/ipoe/ipoe.c21
2 files changed, 14 insertions, 8 deletions
diff --git a/accel-pppd/ctrl/ipoe/arp.c b/accel-pppd/ctrl/ipoe/arp.c
index 5853358..4818c3b 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 b3e2ba2..c7db14a 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;