提交 2d10076d 编写于 作者: D Dmitry Kozlov

ipoe: fixed incorrect arp reply (reply for request which started session)

上级 00015eb0
......@@ -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);
......
......@@ -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;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册