summaryrefslogtreecommitdiff
path: root/accel-pppd
diff options
context:
space:
mode:
authorDmitry Kozlov <xeb@mail.ru>2020-04-07 11:08:12 +0300
committerDmitry Kozlov <xeb@mail.ru>2020-04-07 11:08:12 +0300
commitb8f8becfd5cdbf3399fed2867c22dccb16a80aa8 (patch)
tree5118ffa2dd58e68086954b85c859498b0e9be09a /accel-pppd
parentb2de172cb0023d6bcf049cc2c68e95039ef84ffd (diff)
parent7a9e1de558c188d420e39165119e92915af2b3d7 (diff)
downloadaccel-ppp-b8f8becfd5cdbf3399fed2867c22dccb16a80aa8.tar.gz
accel-ppp-b8f8becfd5cdbf3399fed2867c22dccb16a80aa8.zip
Merge branch 'master' of github.com:xebd/accel-ppp
Diffstat (limited to 'accel-pppd')
-rw-r--r--accel-pppd/ifcfg.c3
-rw-r--r--accel-pppd/include/ap_net.h1
-rw-r--r--accel-pppd/net.c18
-rw-r--r--accel-pppd/ppp/ppp.c1
-rw-r--r--accel-pppd/radius/radius.c5
-rw-r--r--accel-pppd/session.c14
6 files changed, 28 insertions, 14 deletions
diff --git a/accel-pppd/ifcfg.c b/accel-pppd/ifcfg.c
index fbd11bf..d939547 100644
--- a/accel-pppd/ifcfg.c
+++ b/accel-pppd/ifcfg.c
@@ -319,6 +319,9 @@ int __export ap_session_rename(struct ap_session *ses, const char *ifname, int l
}
ses->net = ns;
net = ns;
+
+ /* Refresh the index now that it is in a new namespace */
+ ses->ifindex = net->get_ifindex(ses->ifname);
log_ppp_info2("move to namespace %s\n", ns->name);
}
diff --git a/accel-pppd/include/ap_net.h b/accel-pppd/include/ap_net.h
index 91ebdd5..984c6c1 100644
--- a/accel-pppd/include/ap_net.h
+++ b/accel-pppd/include/ap_net.h
@@ -31,6 +31,7 @@ struct ap_net {
void (*rtnl_put)(struct rtnl_handle *);
int (*rtnl_open)(struct rtnl_handle *h, int proto);
int (*move_link)(struct ap_net *net, int ifindex);
+ int (*get_ifindex)(const char * ifname);
void (*release)(struct ap_net *net);
};
diff --git a/accel-pppd/net.c b/accel-pppd/net.c
index e5cf281..9a025ed 100644
--- a/accel-pppd/net.c
+++ b/accel-pppd/net.c
@@ -7,6 +7,7 @@
#include <sched.h>
#include <limits.h>
#include <errno.h>
+#include <linux/if.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <sys/syscall.h>
@@ -215,6 +216,22 @@ static int def_move_link(struct ap_net *new_net, int ifindex)
#endif
}
+static int def_get_ifindex(const char *ifname)
+{
+ struct kern_net *n = container_of(net, typeof(*n), net);
+ struct ifreq ifr;
+
+ memset(&ifr, 0, sizeof(ifr));
+ strcpy(ifr.ifr_name, ifname);
+
+ if (ioctl(n->sock, SIOCGIFINDEX, &ifr)) {
+ log_ppp_error("ioctl(SIOCGIFINDEX): %s\n", strerror(errno));
+ return -1;
+ }
+ return ifr.ifr_ifindex;
+}
+
+
static void def_release(struct ap_net *d)
{
struct kern_net *n = container_of(d, typeof(*n), net);
@@ -299,6 +316,7 @@ static struct ap_net *alloc_net(const char *name)
net->rtnl_put = def_rtnl_put;
net->rtnl_open = def_rtnl_open;
net->move_link = def_move_link;
+ net->get_ifindex = def_get_ifindex;
net->release = def_release;
n->sock = socket(AF_INET, SOCK_DGRAM, 0);
diff --git a/accel-pppd/ppp/ppp.c b/accel-pppd/ppp/ppp.c
index 0606f3f..49b53b1 100644
--- a/accel-pppd/ppp/ppp.c
+++ b/accel-pppd/ppp/ppp.c
@@ -280,6 +280,7 @@ static void destablish_ppp(struct ppp_t *ppp)
}
ppp->ses.net = def_net;
net = def_net;
+ ppp->ses.ifindex = net->get_ifindex(ppp->ses.ifname);
}
sprintf(ifr.ifr_newname, "ppp%i", ppp->ses.unit_idx);
diff --git a/accel-pppd/radius/radius.c b/accel-pppd/radius/radius.c
index e5a65a5..e3fe4b3 100644
--- a/accel-pppd/radius/radius.c
+++ b/accel-pppd/radius/radius.c
@@ -316,7 +316,7 @@ int rad_proc_attrs(struct rad_req_t *req)
case Framed_IP_Address:
if (!conf_gw_ip_address && rpd->ses->ctrl->ppp)
log_ppp_warn("radius: gw-ip-address not specified, cann't assign IP address...\n");
- else if (attr->val.ipaddr != 0xfffffffe) {
+ else if (attr->val.ipaddr != htonl(0xfffffffe)) {
rpd->ipv4_addr.owner = &ipdb;
rpd->ipv4_addr.peer_addr = attr->val.ipaddr;
rpd->ipv4_addr.addr = rpd->ses->ctrl->ppp ? conf_gw_ip_address : 0;
@@ -817,7 +817,8 @@ struct radius_pd_t *rad_find_session_pack(struct rad_packet_t *pack)
port_id = attr->val.string;
break;
case Framed_IP_Address:
- ipaddr = attr->val.ipaddr;
+ if (attr->val.ipaddr != htonl(0xfffffffe))
+ ipaddr = attr->val.ipaddr;
break;
case Calling_Station_Id:
csid = attr->val.string;
diff --git a/accel-pppd/session.c b/accel-pppd/session.c
index 8ef569e..1411f24 100644
--- a/accel-pppd/session.c
+++ b/accel-pppd/session.c
@@ -88,21 +88,11 @@ void __export ap_session_set_ifindex(struct ap_session *ses)
int __export ap_session_starting(struct ap_session *ses)
{
- struct ifreq ifr;
-
if (ap_shutdown)
return -1;
- if (ses->ifindex == -1 && ses->ifname[0]) {
- memset(&ifr, 0, sizeof(ifr));
- strcpy(ifr.ifr_name, ses->ifname);
-
- if (net->sock_ioctl(SIOCGIFINDEX, &ifr)) {
- log_ppp_error("ioctl(SIOCGIFINDEX): %s\n", strerror(errno));
- return -1;
- }
- ses->ifindex = ifr.ifr_ifindex;
- }
+ if (ses->ifindex == -1 && ses->ifname[0])
+ ses->ifindex = net->get_ifindex(ses->ifname);
if (ses->ifindex != -1)
ap_session_set_ifindex(ses);