From 8a6ce75bc2d12a2a0479cff5e84c8c5774bc311c Mon Sep 17 00:00:00 2001
From: Dmitry Kozlov <xeb@mail.ru>
Date: Fri, 25 May 2018 10:42:52 +0300
Subject: ipoe: do not wait packet from ipoe kernel module in
 "shared=0,start=up" mode ipoe: pass mask to ifcfg in ip unnumbered mode

---
 accel-pppd/ctrl/ipoe/ipoe.c | 20 ++++++++++++--------
 1 file changed, 12 insertions(+), 8 deletions(-)

diff --git a/accel-pppd/ctrl/ipoe/ipoe.c b/accel-pppd/ctrl/ipoe/ipoe.c
index bc7f7272..248af30d 100644
--- a/accel-pppd/ctrl/ipoe/ipoe.c
+++ b/accel-pppd/ctrl/ipoe/ipoe.c
@@ -725,7 +725,8 @@ static void find_gw_addr(struct ipoe_session *ses)
 	list_for_each_entry(a, &conf_gw_addr, entry) {
 		if ((ntohl(ses->yiaddr) & (a->mask1)) == (ntohl(a->addr) & (a->mask1))) {
 			ses->router = a->addr;
-			ses->mask = a->mask;
+			if (!ses->mask)
+				ses->mask = a->mask;
 			return;
 		}
 	}
@@ -878,11 +879,15 @@ static void __ipoe_session_start(struct ipoe_session *ses)
 		ses->siaddr = ses->router;
 
 		if (ses->arph) {
-			ses->wait_start = 1;
+			if (ses->serv->opt_shared)
+				ses->wait_start = 1;
+
 			send_arp_reply(ses->serv, ses->arph);
 			_free(ses->arph);
 			ses->arph = NULL;
-		} else {
+		}
+
+		if (!ses->wait_start) {
 			__ipoe_session_activate(ses);
 			return;
 		}
@@ -952,10 +957,9 @@ static void __ipoe_session_activate(struct ipoe_session *ses)
 		ses->ipv4.addr = ses->siaddr;
 	}
 
-	if (ses->ifindex == -1) {
-		if (serv->opt_ifcfg)
-			ipaddr_add_peer(serv->ifindex, ses->router, ses->yiaddr);
-	} else
+	ses->ses.ipv4->mask = conf_ip_unnumbered ? 32 : ses->mask;
+
+	if (ses->ifindex != -1 || serv->opt_ifcfg)
 		ses->ctrl.dont_ifcfg = 0;
 
 	if (ses->serv->opt_mode == MODE_L2 && ses->serv->opt_ipv6 && sock6_fd != -1) {
@@ -975,7 +979,7 @@ static void __ipoe_session_activate(struct ipoe_session *ses)
 
 	ap_session_activate(&ses->ses);
 
-	if (ses->ifindex == -1) {
+	if (ses->ifindex == -1 && !serv->opt_ifcfg) {
 		if (!conf_ip_unnumbered)
 			iproute_add(serv->ifindex, ses->router, ses->yiaddr, 0, conf_proto, ses->mask, 0);
 		else if (!serv->opt_ifcfg)
-- 
cgit v1.2.3