diff --git a/accel-pppd/ifcfg.c b/accel-pppd/ifcfg.c index ea1ac2f9f67c6f043c1321560f810c283fd1441e..bbbcc02d18779be312a97f358257ccc06cf32b61 100644 --- a/accel-pppd/ifcfg.c +++ b/accel-pppd/ifcfg.c @@ -230,3 +230,28 @@ void __export ap_session_ifdown(struct ap_session *ses) } } +void __export ap_session_rename(struct ap_session *ses, const char *ifname, int len) +{ + struct ifreq ifr; + + if (len == -1) + len = strlen(ifname); + + if (len >= IFNAMSIZ - 1) { + log_ppp_warn("cannot rename interface (name it too long)\n"); + return; + } + + ifr.ifr_ifindex = ses->ifindex; + strcpy(ifr.ifr_name, ses->ifname); + memcpy(ifr.ifr_newname, ifname, len); + ifr.ifr_newname[len] = 0; + + if (ioctl(sock_fd, SIOCSIFNAME, &ifr)) + log_ppp_warn("interface rename failed: %s\n", strerror(errno)); + else { + memcpy(ses->ifname, ifname, len); + ses->ifname[len] = 0; + } +} + diff --git a/accel-pppd/include/ap_session.h b/accel-pppd/include/ap_session.h index ecbac53f5cfd465b76418766e177ba2856ef6eb1..86a777c2ceafd979ecb19cbbbac70fbc9eaa7816 100644 --- a/accel-pppd/include/ap_session.h +++ b/accel-pppd/include/ap_session.h @@ -128,6 +128,7 @@ int ap_session_check_single(const char *username); void ap_session_ifup(struct ap_session *ses); void ap_session_ifdown(struct ap_session *ses); +void ap_session_rename(struct ap_session *ses, const char *ifname, int len); int ap_session_read_stats(struct ap_session *ses, struct rtnl_link_stats *stats); diff --git a/accel-pppd/radius/radius.c b/accel-pppd/radius/radius.c index d6d7de071099419171ca62415958aa2a357ca1a6..26e59badaaa9df2d7d3ef58bd43f3c46301c245c 100644 --- a/accel-pppd/radius/radius.c +++ b/accel-pppd/radius/radius.c @@ -142,11 +142,15 @@ int rad_proc_attrs(struct rad_req_t *req) a->addr = attr->val.ipv6prefix.prefix; list_add_tail(&a->entry, &req->rpd->ipv6_dp.prefix_list); break; + case NAS_Port_Id: + ap_session_rename(req->rpd->ses, attr->val.string, attr->len); + break; } } if (dns.ses) triton_event_fire(EV_DNS, &dns); + if (wins.ses) triton_event_fire(EV_WINS, &wins);