From fafc9cfcf652a92a007a4930384db6e2a60f27f6 Mon Sep 17 00:00:00 2001 From: Viacheslav Date: Fri, 19 Sep 2025 09:28:36 +0000 Subject: [PATCH] T7843: Remove accel-ppp form the packages Remove the `accel-ppp` from the packages, as we migrated to the `accel-ppp-ng` and do not need it anymore. Remove build scripts and patches. --- .../linux-kernel/build-accel-ppp.sh | 50 -- scripts/package-build/linux-kernel/build.py | 10 - .../package-build/linux-kernel/package.toml | 6 - ...ling-Number-to-Calling-Station-ID-RA.patch | 183 ----- ...for-Framed-Route-and-Framed-IPv6-Rou.patch | 639 ------------------ .../0002-Radius-Dns-Server-IPv6-Address.patch | 195 ------ ...ntation-of-vrf-support-for-iproute_a.patch | 213 ------ ...e-in-accel-pppd-libnetlink-iputils.c.patch | 26 - 8 files changed, 1322 deletions(-) delete mode 100755 scripts/package-build/linux-kernel/build-accel-ppp.sh delete mode 100644 scripts/package-build/linux-kernel/patches/accel-ppp/0001-L2TP-Include-Calling-Number-to-Calling-Station-ID-RA.patch delete mode 100644 scripts/package-build/linux-kernel/patches/accel-ppp/0002-Add-vrf-support-for-Framed-Route-and-Framed-IPv6-Rou.patch delete mode 100644 scripts/package-build/linux-kernel/patches/accel-ppp/0002-Radius-Dns-Server-IPv6-Address.patch delete mode 100644 scripts/package-build/linux-kernel/patches/accel-ppp/0003-Simplify-implementation-of-vrf-support-for-iproute_a.patch delete mode 100644 scripts/package-build/linux-kernel/patches/accel-ppp/0004-Fix-whitespace-in-accel-pppd-libnetlink-iputils.c.patch diff --git a/scripts/package-build/linux-kernel/build-accel-ppp.sh b/scripts/package-build/linux-kernel/build-accel-ppp.sh deleted file mode 100755 index a2f8df52..00000000 --- a/scripts/package-build/linux-kernel/build-accel-ppp.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/bin/sh -CWD=$(pwd) -KERNEL_VAR_FILE=${CWD}/kernel-vars - -ACCEL_SRC=${CWD}/accel-ppp -if [ ! -d ${ACCEL_SRC} ]; then - echo "Accel-PPP source not found" - exit 1 -fi - -if [ ! -f ${KERNEL_VAR_FILE} ]; then - echo "Kernel variable file '${KERNEL_VAR_FILE}' does not exist, run ./build_kernel.sh first" - exit 1 -fi - -cd ${ACCEL_SRC} -git reset --hard HEAD -git clean --force -d -x - -PATCH_DIR=${CWD}/patches/accel-ppp -if [ -d $PATCH_DIR ]; then - cd ${ACCEL_SRC} - for patch in $(ls ${PATCH_DIR}) - do - echo "I: Apply patch: ${PATCH_DIR}/${patch}" - patch -p1 < ${PATCH_DIR}/${patch} - done -fi - -. ${KERNEL_VAR_FILE} -mkdir -p ${ACCEL_SRC}/build -cd ${ACCEL_SRC}/build - -echo "I: Build Accel-PPP Debian package" -cmake -DBUILD_IPOE_DRIVER=TRUE \ - -DBUILD_VLAN_MON_DRIVER=TRUE \ - -DCMAKE_INSTALL_PREFIX=/usr \ - -DKDIR=${KERNEL_DIR} \ - -DLUA=5.3 \ - -DMODULES_KDIR=${KERNEL_VERSION}${KERNEL_SUFFIX} \ - -DCPACK_TYPE=Debian12 .. -make - -# Sign generated Kernel modules -${CWD}/sign-modules.sh . - -cpack -G DEB - -# rename resulting Debian package according git description -mv accel-ppp*.deb ${CWD}/accel-ppp_$(git describe --always --tags)_$(dpkg --print-architecture).deb diff --git a/scripts/package-build/linux-kernel/build.py b/scripts/package-build/linux-kernel/build.py index 8cba9430..347f0af7 100755 --- a/scripts/package-build/linux-kernel/build.py +++ b/scripts/package-build/linux-kernel/build.py @@ -139,9 +139,6 @@ def build_package(package: dict, dependencies: list) -> None: elif package['build_cmd'] == 'build_linux_firmware': build_linux_firmware(package['commit_id'], package['scm_url']) create_tarball(f'{package["name"]}-{package["commit_id"]}', f'{package["name"]}') - elif package['build_cmd'] == 'build_accel_ppp': - build_accel_ppp(package['commit_id'], package['scm_url']) - create_tarball(f'{package["name"]}-{package["commit_id"]}', f'{package["name"]}') elif package['build_cmd'] == 'build_accel_ppp_ng': build_accel_ppp_ng(package['commit_id'], package['scm_url']) create_tarball(f'{package["name"]}-{package["commit_id"]}', f'{package["name"]}') @@ -212,13 +209,6 @@ def build_linux_firmware(commit_id, scm_url): run(['./build-linux-firmware.sh'], check=True) -def build_accel_ppp(commit_id, scm_url): - """Build accel-ppp""" - repo_dir = Path('accel-ppp') - clone_or_update_repo(repo_dir, scm_url, commit_id) - run(['./build-accel-ppp.sh'], check=True) - - def build_accel_ppp_ng(commit_id, scm_url): """Build accel-ppp-ng""" repo_dir = Path('accel-ppp-ng') diff --git a/scripts/package-build/linux-kernel/package.toml b/scripts/package-build/linux-kernel/package.toml index 86134949..51ae55ae 100644 --- a/scripts/package-build/linux-kernel/package.toml +++ b/scripts/package-build/linux-kernel/package.toml @@ -16,12 +16,6 @@ commit_id = "20240610" scm_url = "https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git" build_cmd = "build_linux_firmware" -[[packages]] -name = "accel-ppp" -commit_id = "1.13.0" -scm_url = "https://github.com/accel-ppp/accel-ppp.git" -build_cmd = "build_accel_ppp" - [[packages]] name = "accel-ppp-ng" commit_id = "f5764ea" diff --git a/scripts/package-build/linux-kernel/patches/accel-ppp/0001-L2TP-Include-Calling-Number-to-Calling-Station-ID-RA.patch b/scripts/package-build/linux-kernel/patches/accel-ppp/0001-L2TP-Include-Calling-Number-to-Calling-Station-ID-RA.patch deleted file mode 100644 index 0c3141a0..00000000 --- a/scripts/package-build/linux-kernel/patches/accel-ppp/0001-L2TP-Include-Calling-Number-to-Calling-Station-ID-RA.patch +++ /dev/null @@ -1,183 +0,0 @@ -From 12778d1e9296b6dbf190a80dcf407b24f9821f95 Mon Sep 17 00:00:00 2001 -From: zsdc -Date: Tue, 4 Apr 2023 11:15:26 +0300 -Subject: [PATCH] L2TP: Include Calling-Number to Calling-Station-ID RADIUS - attribute - -Patch authored by Alexander Serkin from -https://phabricator.accel-ppp.org/T59 ---- - accel-pppd/ctrl/l2tp/l2tp.c | 112 ++++++++++++++++++++++++++++++------ - 1 file changed, 93 insertions(+), 19 deletions(-) - -diff --git a/accel-pppd/ctrl/l2tp/l2tp.c b/accel-pppd/ctrl/l2tp/l2tp.c -index 027d710..c541c60 100644 ---- a/accel-pppd/ctrl/l2tp/l2tp.c -+++ b/accel-pppd/ctrl/l2tp/l2tp.c -@@ -123,6 +123,11 @@ struct l2tp_sess_t - struct l2tp_conn_t *paren_conn; - uint16_t sid; - uint16_t peer_sid; -+/* We will keep l2tp attributes Calling-Number/Called-Number and their length while the session exists */ -+ char *calling_num; -+ int calling_num_len; -+ char *called_num; -+ int called_num_len; - - unsigned int ref_count; - int state1; -@@ -979,6 +984,10 @@ static void __session_destroy(struct l2tp_sess_t *sess) - _free(sess->ctrl.calling_station_id); - if (sess->ctrl.called_station_id) - _free(sess->ctrl.called_station_id); -+ if (sess->calling_num) -+ _free(sess->calling_num); -+ if (sess->called_num) -+ _free(sess->called_num); - - log_session(log_info2, sess, "session destroyed\n"); - -@@ -1771,25 +1780,52 @@ static int l2tp_session_start_data_channel(struct l2tp_sess_t *sess) - sess->ctrl.max_mtu = conf_ppp_max_mtu; - sess->ctrl.mppe = conf_mppe; - -- sess->ctrl.calling_station_id = _malloc(17); -- if (sess->ctrl.calling_station_id == NULL) { -- log_session(log_error, sess, -- "impossible to start data channel:" -- " allocation of calling station ID failed\n"); -- goto err; -+ /* If l2tp calling number avp exists, we use it, otherwise we use lac ip */ -+ if (sess->calling_num != NULL) { -+ sess->ctrl.calling_station_id = _malloc(sess->calling_num_len+1); -+ if (sess->ctrl.calling_station_id == NULL) { -+ log_session(log_error, sess, -+ "impossible to start data channel:" -+ " allocation of calling station ID failed\n"); -+ goto err; -+ }else { -+ strcpy(sess->ctrl.calling_station_id, sess->calling_num); -+ } -+ } else { -+ sess->ctrl.calling_station_id = _malloc(17); -+ if (sess->ctrl.calling_station_id == NULL) { -+ log_session(log_error, sess, -+ "impossible to start data channel:" -+ " allocation of calling station ID failed\n"); -+ goto err; -+ } else { -+ u_inet_ntoa(sess->paren_conn->peer_addr.sin_addr.s_addr, -+ sess->ctrl.calling_station_id); -+ } - } -- u_inet_ntoa(sess->paren_conn->peer_addr.sin_addr.s_addr, -- sess->ctrl.calling_station_id); -- -- sess->ctrl.called_station_id = _malloc(17); -- if (sess->ctrl.called_station_id == NULL) { -- log_session(log_error, sess, -- "impossible to start data channel:" -- " allocation of called station ID failed\n"); -- goto err; -+ /* If l2tp called number avp exists, we use it, otherwise we use my ip */ -+ if (sess->called_num != NULL) { -+ sess->ctrl.called_station_id = _malloc(sess->called_num_len+1); -+ if (sess->ctrl.called_station_id == NULL) { -+ log_session(log_error, sess, -+ "impossible to start data channel:" -+ " allocation of called station ID failed\n"); -+ goto err; -+ } else { -+ strcpy(sess->ctrl.called_station_id, sess->called_num); -+ } -+ } else { -+ sess->ctrl.called_station_id = _malloc(17); -+ if (sess->ctrl.called_station_id == NULL) { -+ log_session(log_error, sess, -+ "impossible to start data channel:" -+ " allocation of called station ID failed\n"); -+ goto err; -+ } else { -+ u_inet_ntoa(sess->paren_conn->host_addr.sin_addr.s_addr, -+ sess->ctrl.called_station_id); -+ } - } -- u_inet_ntoa(sess->paren_conn->host_addr.sin_addr.s_addr, -- sess->ctrl.called_station_id); - - if (conf_ip_pool) { - sess->ppp.ses.ipv4_pool_name = _strdup(conf_ip_pool); -@@ -3295,6 +3331,10 @@ static int l2tp_recv_ICRQ(struct l2tp_conn_t *conn, - uint16_t sid = 0; - uint16_t res = 0; - uint16_t err = 0; -+ uint8_t *calling[254] = {0}; -+ uint8_t *called[254] = {0}; -+ int n = 0; -+ int m = 0; - - if (conn->state != STATE_ESTB && conn->lns_mode) { - log_tunnel(log_warn, conn, "discarding unexpected ICRQ\n"); -@@ -3332,7 +3372,17 @@ static int l2tp_recv_ICRQ(struct l2tp_conn_t *conn, - case Call_Serial_Number: - case Bearer_Type: - case Calling_Number: -+ /* Save Calling-Number L2TP attribute locally */ -+ if (attr->attr->id == Calling_Number) { -+ n = attr->length; -+ memcpy(calling,attr->val.octets,n); -+ } - case Called_Number: -+ /* Save Called-Number L2TP attribute locally */ -+ if (attr->attr->id == Called_Number) { -+ m = attr->length; -+ memcpy(called,attr->val.octets,m); -+ } - case Sub_Address: - case Physical_Channel_ID: - break; -@@ -3371,6 +3421,30 @@ static int l2tp_recv_ICRQ(struct l2tp_conn_t *conn, - sess->peer_sid = peer_sid; - sid = sess->sid; - -+ /* Allocate memory for Calling-Number if exists, and put it to l2tp_sess_t structure */ -+ if (calling != NULL && n > 0) { -+ sess->calling_num = _malloc(n+1); -+ if (sess->calling_num == NULL) { -+ log_tunnel(log_warn, conn, "can't allocate memory for Calling Number attribute. Will use LAC IP instead\n"); -+ }else{ -+ memcpy(sess->calling_num, calling, n); -+ sess->calling_num[n] = '\0'; -+ sess->calling_num_len = n; -+ } -+ } -+ -+ /* Allocate memory for Called-Number if exists, and put it to l2tp_sess_t structure */ -+ if (called != NULL && m > 1) { -+ sess->called_num = _malloc(m+1); -+ if (sess->called_num == NULL) { -+ log_tunnel(log_warn, conn, "can't allocate memory for Called Number attribute. Will use my IP instead\n"); -+ } else { -+ memcpy(sess->called_num, called, m); -+ sess->called_num[m] = '\0'; -+ sess->called_num_len = m; -+ } -+ } -+ - if (unknown_attr) { - log_tunnel(log_error, conn, "impossible to handle ICRQ:" - " unknown mandatory attribute type %i," -@@ -3390,8 +3464,8 @@ static int l2tp_recv_ICRQ(struct l2tp_conn_t *conn, - goto out_reject; - } - -- log_tunnel(log_info1, conn, "new session %hu-%hu created following" -- " reception of ICRQ\n", sid, peer_sid); -+ log_tunnel(log_info1, conn, "new session %hu-%hu with calling num %s len %d, called num %s len %d created following" -+ " reception of ICRQ\n", sid, peer_sid, sess->calling_num, sess->calling_num_len, sess->called_num, sess->called_num_len); - - return 0; - --- -2.34.1 - diff --git a/scripts/package-build/linux-kernel/patches/accel-ppp/0002-Add-vrf-support-for-Framed-Route-and-Framed-IPv6-Rou.patch b/scripts/package-build/linux-kernel/patches/accel-ppp/0002-Add-vrf-support-for-Framed-Route-and-Framed-IPv6-Rou.patch deleted file mode 100644 index b963050f..00000000 --- a/scripts/package-build/linux-kernel/patches/accel-ppp/0002-Add-vrf-support-for-Framed-Route-and-Framed-IPv6-Rou.patch +++ /dev/null @@ -1,639 +0,0 @@ -From 5587c45d9e3264f45eba636941cf80b90f2f6186 Mon Sep 17 00:00:00 2001 -From: Chris Hills -Date: Thu, 29 Jun 2023 09:24:36 +0100 -Subject: [PATCH 2/4] Add vrf support for Framed-Route and Framed-IPv6-Route - -(cherry picked from commit 899dc375fe01672a5eae2d7f7db81edc0d2a4440) ---- - accel-pppd/CMakeLists.txt | 4 + - accel-pppd/ctrl/ipoe/ipoe.c | 20 ++++ - accel-pppd/ifcfg.c | 6 +- - accel-pppd/ipv6/dhcpv6.c | 8 ++ - accel-pppd/libnetlink/iputils.c | 110 ++++++++++++++++- - accel-pppd/libnetlink/iputils.h | 11 ++ - accel-pppd/libnetlink/rt_names.c | 196 +++++++++++++++++++++++++++++++ - accel-pppd/libnetlink/rt_names.h | 14 +++ - accel-pppd/radius/radius.c | 21 +++- - 9 files changed, 384 insertions(+), 6 deletions(-) - create mode 100644 accel-pppd/libnetlink/rt_names.c - create mode 100644 accel-pppd/libnetlink/rt_names.h - -diff --git a/accel-pppd/CMakeLists.txt b/accel-pppd/CMakeLists.txt -index ab8a350..c3995ea 100644 ---- a/accel-pppd/CMakeLists.txt -+++ b/accel-pppd/CMakeLists.txt -@@ -123,6 +123,10 @@ ADD_EXECUTABLE(accel-pppd - main.c - ) - -+IF (DEFINED HAVE_VRF) -+ target_sources(accel-pppd PRIVATE libnetlink/rt_names.c) -+ENDIF (DEFINED HAVE_VRF) -+ - TARGET_LINK_LIBRARIES(accel-pppd triton rt pthread ${crypto_lib} pcre) - set_property(TARGET accel-pppd PROPERTY CMAKE_SKIP_BUILD_RPATH FALSE) - set_property(TARGET accel-pppd PROPERTY CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) -diff --git a/accel-pppd/ctrl/ipoe/ipoe.c b/accel-pppd/ctrl/ipoe/ipoe.c -index 61b7c23..6f23fd6 100644 ---- a/accel-pppd/ctrl/ipoe/ipoe.c -+++ b/accel-pppd/ctrl/ipoe/ipoe.c -@@ -1067,9 +1067,17 @@ static void __ipoe_session_activate(struct ipoe_session *ses) - - if (ses->ifindex == -1 && !serv->opt_ifcfg) { - if (!serv->opt_ip_unnumbered) -+#ifdef HAVE_VRF -+ iproute_add(serv->ifindex, ses->router, ses->yiaddr, 0, conf_proto, ses->mask, 0, NULL); -+#else - iproute_add(serv->ifindex, ses->router, ses->yiaddr, 0, conf_proto, ses->mask, 0); -+#endif - else -+#ifdef HAVE_VRF -+ iproute_add(serv->ifindex, serv->opt_src ?: ses->router, ses->yiaddr, 0, conf_proto, 32, 0, NULL); -+#else - iproute_add(serv->ifindex, serv->opt_src ?: ses->router, ses->yiaddr, 0, conf_proto, 32, 0); -+#endif - } - - if (ses->l4_redirect) -@@ -1170,7 +1178,11 @@ static void ipoe_session_started(struct ap_session *s) - - if (ses->ses.ipv4->peer_addr != ses->yiaddr) - //ipaddr_add_peer(ses->ses.ifindex, ses->router, ses->yiaddr); // breaks quagga -+#ifdef HAVE_VRF -+ iproute_add(ses->ses.ifindex, ses->router, ses->yiaddr, 0, conf_proto, 32, 0, NULL); -+#else - iproute_add(ses->ses.ifindex, ses->router, ses->yiaddr, 0, conf_proto, 32, 0); -+#endif - - if (ses->ifindex != -1 && ses->xid) { - ses->dhcpv4 = dhcpv4_create(ses->ctrl.ctx, ses->ses.ifname, ""); -@@ -1254,9 +1266,17 @@ static void ipoe_session_finished(struct ap_session *s) - } else if (ses->started) { - if (!serv->opt_ifcfg) { - if (!serv->opt_ip_unnumbered) -+#ifdef HAVE_VRF -+ iproute_del(serv->ifindex, ses->router, ses->yiaddr, 0, conf_proto, ses->mask, 0, NULL); -+#else - iproute_del(serv->ifindex, ses->router, ses->yiaddr, 0, conf_proto, ses->mask, 0); -+#endif - else -+#ifdef HAVE_VRF -+ iproute_del(serv->ifindex, serv->opt_src ?: ses->router, ses->yiaddr, 0, conf_proto, 32, 0, NULL); -+#else - iproute_del(serv->ifindex, serv->opt_src ?: ses->router, ses->yiaddr, 0, conf_proto, 32, 0); -+#endif - } - } - -diff --git a/accel-pppd/ifcfg.c b/accel-pppd/ifcfg.c -index 3750060..3b1848e 100644 ---- a/accel-pppd/ifcfg.c -+++ b/accel-pppd/ifcfg.c -@@ -234,7 +234,11 @@ void __export ap_session_ifdown(struct ap_session *ses) - if (!a->installed) - continue; - if (a->prefix_len > 64) -+#ifdef HAVE_VRF -+ ip6route_del(ses->ifindex, &a->addr, a->prefix_len, NULL, 0, 0, ses->vrf_name); -+#else - ip6route_del(ses->ifindex, &a->addr, a->prefix_len, NULL, 0, 0); -+#endif - else { - struct in6_addr addr; - memcpy(addr.s6_addr, &a->addr, 8); -@@ -376,4 +380,4 @@ int __export ap_session_vrf(struct ap_session *ses, const char *vrf_name, int le - - return 0; - } --#endif -\ No newline at end of file -+#endif -diff --git a/accel-pppd/ipv6/dhcpv6.c b/accel-pppd/ipv6/dhcpv6.c -index 158771b..41e6c3f 100644 ---- a/accel-pppd/ipv6/dhcpv6.c -+++ b/accel-pppd/ipv6/dhcpv6.c -@@ -159,7 +159,11 @@ static void ev_ses_finished(struct ap_session *ses) - if (pd->dp_active) { - struct ipv6db_addr_t *p; - list_for_each_entry(p, &ses->ipv6_dp->prefix_list, entry) -+#ifdef HAVE_VRF -+ ip6route_del(0, &p->addr, p->prefix_len, NULL, 0, 0, ses->vrf_name); -+#else - ip6route_del(0, &p->addr, p->prefix_len, NULL, 0, 0); -+#endif - } - - ipdb_put_ipv6_prefix(ses, ses->ipv6_dp); -@@ -181,7 +185,11 @@ static void insert_dp_routes(struct ap_session *ses, struct dhcpv6_pd *pd, struc - addr = NULL; - - list_for_each_entry(p, &ses->ipv6_dp->prefix_list, entry) { -+#ifdef HAVE_VRF -+ if (ip6route_add(ses->ifindex, &p->addr, p->prefix_len, addr, 0, 0, ses->vrf_name)) { -+#else - if (ip6route_add(ses->ifindex, &p->addr, p->prefix_len, addr, 0, 0)) { -+#endif - err = errno; - inet_ntop(AF_INET6, &p->addr, str1, sizeof(str1)); - if (addr) -diff --git a/accel-pppd/libnetlink/iputils.c b/accel-pppd/libnetlink/iputils.c -index 23325fc..6c61fc2 100644 ---- a/accel-pppd/libnetlink/iputils.c -+++ b/accel-pppd/libnetlink/iputils.c -@@ -11,7 +11,9 @@ - #include - #include - #include --//#include -+#ifdef HAVE_VRF -+#include -+#endif - //#include - //#include - #include -@@ -21,6 +23,9 @@ - #include "libnetlink.h" - #include "iputils.h" - #include "ap_net.h" -+#ifdef HAVE_VRF -+#include "rt_names.h" -+#endif - - #ifdef ACCEL_DP - #define _malloc(x) malloc(x) -@@ -457,7 +462,82 @@ int __export ipaddr_del_peer(int ifindex, in_addr_t addr, in_addr_t peer) - return r; - } - -+#ifdef HAVE_VRF -+__u32 ipvrf_get_table(const char *vrf_name) -+{ -+ struct iplink_req { -+ struct nlmsghdr n; -+ struct ifinfomsg i; -+ char buf[4096]; -+ } req; -+ struct rtnl_handle *rth = net->rtnl_get(); -+ struct rtattr *tb[IFLA_MAX+1]; -+ struct rtattr *li[IFLA_INFO_MAX+1]; -+ struct rtattr *vrf_attr[IFLA_VRF_MAX + 1]; -+ struct ifinfomsg *ifi; -+ int len; -+ __u32 tb_id = RT_TABLE_MAIN; -+ -+ log_ppp_info2("utils: getting route table for %s\n", vrf_name); -+ -+ if (!vrf_name) -+ return tb_id; -+ -+ memset(&req, 0, sizeof(req) - 4096); -+ -+ req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)); -+ req.n.nlmsg_flags = NLM_F_REQUEST; -+ req.n.nlmsg_type = RTM_GETLINK; -+ req.i.ifi_family = AF_UNSPEC; -+ -+ addattr_l(&req.n, 4096, IFLA_IFNAME, vrf_name, strlen(vrf_name)); -+ -+ if (rtnl_talk(rth, &req.n, 0, 0, &req.n, NULL, NULL, 0) < 0) { -+ if (errno == ENODEV && !strcmp(vrf_name, "default")) -+ if (rtnl_rttable_a2n(&tb_id, "main")) -+ log_ppp_error( -+ "BUG: route table \"main\" not found.\n"); -+ return tb_id; -+ } -+ -+ ifi = NLMSG_DATA(&req.n); -+ -+ len = req.n.nlmsg_len; -+ -+ len -= NLMSG_LENGTH(sizeof(*ifi)); -+ if (len < 0) -+ goto out; -+ -+ parse_rtattr(tb, IFLA_MAX, IFLA_RTA(ifi), len); -+ -+ if (!tb[IFLA_LINKINFO]) -+ goto out; -+ -+ parse_rtattr_nested(li, IFLA_INFO_MAX, tb[IFLA_LINKINFO]); -+ -+ if (!li[IFLA_INFO_KIND] || !li[IFLA_INFO_DATA]) -+ goto out; -+ -+ if (strcmp(RTA_DATA(li[IFLA_INFO_KIND]), "vrf")) -+ goto out; -+ -+ parse_rtattr_nested(vrf_attr, IFLA_VRF_MAX, li[IFLA_INFO_DATA]); -+ if (vrf_attr[IFLA_VRF_TABLE]) -+ tb_id = *(__u32 *)RTA_DATA(vrf_attr[IFLA_VRF_TABLE]); -+ -+ if (!tb_id) -+ log_ppp_error("BUG: VRF %s is missing table id\n", vrf_name); -+ -+out: -+ return tb_id; -+} -+#endif -+ -+#ifdef HAVE_VRF -+int __export iproute_add(int ifindex, in_addr_t src, in_addr_t dst, in_addr_t gw, int proto, int mask, uint32_t prio, const char *vrf_name) -+#else - int __export iproute_add(int ifindex, in_addr_t src, in_addr_t dst, in_addr_t gw, int proto, int mask, uint32_t prio) -+#endif - { - struct ipaddr_req { - struct nlmsghdr n; -@@ -472,11 +552,17 @@ int __export iproute_add(int ifindex, in_addr_t src, in_addr_t dst, in_addr_t gw - - memset(&req, 0, sizeof(req) - 4096); - -+#ifdef HAVE_VRF -+ __u32 rt_table = ipvrf_get_table(vrf_name); -+#else -+ __u32 rt_table = RT_TABLE_MAIN; -+#endif -+ - req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg)); - req.n.nlmsg_flags = NLM_F_REQUEST | NLM_F_CREATE; - req.n.nlmsg_type = RTM_NEWROUTE; - req.i.rtm_family = AF_INET; -- req.i.rtm_table = RT_TABLE_MAIN; -+ req.i.rtm_table = rt_table; - req.i.rtm_scope = gw ? RT_SCOPE_UNIVERSE : RT_SCOPE_LINK; - req.i.rtm_protocol = proto; - req.i.rtm_type = RTN_UNICAST; -@@ -500,7 +586,11 @@ int __export iproute_add(int ifindex, in_addr_t src, in_addr_t dst, in_addr_t gw - return r; - } - -+#ifdef HAVE_VRF -+int __export iproute_del(int ifindex, in_addr_t src, in_addr_t dst, in_addr_t gw, int proto, int mask, uint32_t prio, const char *vrf_name) -+#else - int __export iproute_del(int ifindex, in_addr_t src, in_addr_t dst, in_addr_t gw, int proto, int mask, uint32_t prio) -+#endif - { - struct ipaddr_req { - struct nlmsghdr n; -@@ -543,7 +633,11 @@ int __export iproute_del(int ifindex, in_addr_t src, in_addr_t dst, in_addr_t gw - return r; - } - -+#ifdef HAVE_VRF -+int __export ip6route_add(int ifindex, const struct in6_addr *dst, int pref_len, const struct in6_addr *gw, int proto, uint32_t prio, const char *vrf_name) -+#else - int __export ip6route_add(int ifindex, const struct in6_addr *dst, int pref_len, const struct in6_addr *gw, int proto, uint32_t prio) -+#endif - { - struct ipaddr_req { - struct nlmsghdr n; -@@ -558,11 +652,17 @@ int __export ip6route_add(int ifindex, const struct in6_addr *dst, int pref_len, - - memset(&req, 0, sizeof(req) - 4096); - -+#ifdef HAVE_VRF -+ __u32 rt_table = ipvrf_get_table(vrf_name); -+#else -+ __u32 rt_table = RT_TABLE_MAIN; -+#endif -+ - req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg)); - req.n.nlmsg_flags = NLM_F_REQUEST | NLM_F_CREATE; - req.n.nlmsg_type = RTM_NEWROUTE; - req.i.rtm_family = AF_INET6; -- req.i.rtm_table = RT_TABLE_MAIN; -+ req.i.rtm_table = rt_table; - req.i.rtm_scope = RT_SCOPE_UNIVERSE; - req.i.rtm_protocol = proto; - req.i.rtm_type = RTN_UNICAST; -@@ -584,7 +684,11 @@ int __export ip6route_add(int ifindex, const struct in6_addr *dst, int pref_len, - return r; - } - -+#ifdef HAVE_VRF -+int __export ip6route_del(int ifindex, const struct in6_addr *dst, int pref_len, const struct in6_addr *gw, int proto, uint32_t prio, const char *vrf_name) -+#else - int __export ip6route_del(int ifindex, const struct in6_addr *dst, int pref_len, const struct in6_addr *gw, int proto, uint32_t prio) -+#endif - { - struct ipaddr_req { - struct nlmsghdr n; -diff --git a/accel-pppd/libnetlink/iputils.h b/accel-pppd/libnetlink/iputils.h -index 9292cea..c3063f4 100644 ---- a/accel-pppd/libnetlink/iputils.h -+++ b/accel-pppd/libnetlink/iputils.h -@@ -4,6 +4,7 @@ - #include - #include - #include -+#include - - typedef int (*iplink_list_func)(int index, int flags, const char *name, int iflink, int vid, void *arg); - -@@ -20,12 +21,22 @@ int ipaddr_add_peer(int ifindex, in_addr_t addr, in_addr_t peer_addr); - int ipaddr_del(int ifindex, in_addr_t addr, int mask); - int ipaddr_del_peer(int ifindex, in_addr_t addr, in_addr_t peer); - -+#ifdef HAVE_VRF -+int iproute_add(int ifindex, in_addr_t src, in_addr_t dst, in_addr_t gw, int proto, int mask, uint32_t prio, const char *vrf_name); -+int iproute_del(int ifindex, in_addr_t src, in_addr_t dst, in_addr_t gw, int proto, int mask, uint32_t prio, const char *vrf_name); -+#else - int iproute_add(int ifindex, in_addr_t src, in_addr_t dst, in_addr_t gw, int proto, int mask, uint32_t prio); - int iproute_del(int ifindex, in_addr_t src, in_addr_t dst, in_addr_t gw, int proto, int mask, uint32_t prio); -+#endif - in_addr_t iproute_get(in_addr_t dst, in_addr_t *gw); - -+#ifdef HAVE_VRF -+int ip6route_add(int ifindex, const struct in6_addr *dst, int pref_len, const struct in6_addr *gw, int proto, uint32_t prio, const char *vrf_name); -+int ip6route_del(int ifindex, const struct in6_addr *dst, int pref_len, const struct in6_addr *gw, int proto, uint32_t prio, const char *vrf_name); -+#else - int ip6route_add(int ifindex, const struct in6_addr *dst, int pref_len, const struct in6_addr *gw, int proto, uint32_t prio); - int ip6route_del(int ifindex, const struct in6_addr *dst, int pref_len, const struct in6_addr *gw, int proto, uint32_t prio); -+#endif - int ip6addr_add(int ifindex, struct in6_addr *addr, int prefix_len); - int ip6addr_add_peer(int ifindex, struct in6_addr *addr, struct in6_addr *peer_addr); - int ip6addr_del(int ifindex, struct in6_addr *addr, int prefix_len); -diff --git a/accel-pppd/libnetlink/rt_names.c b/accel-pppd/libnetlink/rt_names.c -new file mode 100644 -index 0000000..5591a67 ---- /dev/null -+++ b/accel-pppd/libnetlink/rt_names.c -@@ -0,0 +1,196 @@ -+/* SPDX-License-Identifier: GPL-2.0-or-later */ -+/* -+ * rt_names.c rtnetlink names DB. -+ * -+ * Authors: Alexey Kuznetsov, -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+ -+#include "rt_names.h" -+#include "utils.h" -+ -+#define NAME_MAX_LEN 512 -+#define CONFDIR "/etc/iproute2" -+ -+int numeric; -+ -+struct rtnl_hash_entry { -+ struct rtnl_hash_entry *next; -+ const char *name; -+ unsigned int id; -+}; -+ -+static int fread_id_name(FILE *fp, int *id, char *namebuf) -+{ -+ char buf[NAME_MAX_LEN]; -+ -+ while (fgets(buf, sizeof(buf), fp)) { -+ char *p = buf; -+ -+ while (*p == ' ' || *p == '\t') -+ p++; -+ -+ if (*p == '#' || *p == '\n' || *p == 0) -+ continue; -+ -+ if (sscanf(p, "0x%x %s\n", id, namebuf) != 2 && -+ sscanf(p, "0x%x %s #", id, namebuf) != 2 && -+ sscanf(p, "%d %s\n", id, namebuf) != 2 && -+ sscanf(p, "%d %s #", id, namebuf) != 2) { -+ strcpy(namebuf, p); -+ return -1; -+ } -+ return 1; -+ } -+ return 0; -+} -+ -+static void -+rtnl_hash_initialize(const char *file, struct rtnl_hash_entry **hash, int size) -+{ -+ struct rtnl_hash_entry *entry; -+ FILE *fp; -+ int id; -+ char namebuf[NAME_MAX_LEN] = {0}; -+ int ret; -+ -+ fp = fopen(file, "r"); -+ if (!fp) -+ return; -+ -+ while ((ret = fread_id_name(fp, &id, &namebuf[0]))) { -+ if (ret == -1) { -+ fprintf(stderr, "Database %s is corrupted at %s\n", -+ file, namebuf); -+ fclose(fp); -+ return; -+ } -+ -+ if (id < 0) -+ continue; -+ -+ entry = malloc(sizeof(*entry)); -+ if (entry == NULL) { -+ fprintf(stderr, "malloc error: for entry\n"); -+ break; -+ } -+ entry->id = id; -+ entry->name = strdup(namebuf); -+ entry->next = hash[id & (size - 1)]; -+ hash[id & (size - 1)] = entry; -+ } -+ fclose(fp); -+} -+ -+static struct rtnl_hash_entry dflt_table_entry = { .name = "default" }; -+static struct rtnl_hash_entry main_table_entry = { .name = "main" }; -+static struct rtnl_hash_entry local_table_entry = { .name = "local" }; -+ -+static struct rtnl_hash_entry *rtnl_rttable_hash[256] = { -+ [RT_TABLE_DEFAULT] = &dflt_table_entry, -+ [RT_TABLE_MAIN] = &main_table_entry, -+ [RT_TABLE_LOCAL] = &local_table_entry, -+}; -+ -+static int rtnl_rttable_init; -+ -+static void rtnl_rttable_initialize(void) -+{ -+ struct dirent *de; -+ DIR *d; -+ int i; -+ -+ rtnl_rttable_init = 1; -+ for (i = 0; i < 256; i++) { -+ if (rtnl_rttable_hash[i]) -+ rtnl_rttable_hash[i]->id = i; -+ } -+ rtnl_hash_initialize(CONFDIR "/rt_tables", -+ rtnl_rttable_hash, 256); -+ -+ d = opendir(CONFDIR "/rt_tables.d"); -+ if (!d) -+ return; -+ -+ while ((de = readdir(d)) != NULL) { -+ char path[PATH_MAX]; -+ size_t len; -+ -+ if (*de->d_name == '.') -+ continue; -+ -+ /* only consider filenames ending in '.conf' */ -+ len = strlen(de->d_name); -+ if (len <= 5) -+ continue; -+ if (strcmp(de->d_name + len - 5, ".conf")) -+ continue; -+ -+ snprintf(path, sizeof(path), -+ CONFDIR "/rt_tables.d/%s", de->d_name); -+ rtnl_hash_initialize(path, rtnl_rttable_hash, 256); -+ } -+ closedir(d); -+} -+ -+const char *rtnl_rttable_n2a(__u32 id, char *buf, int len) -+{ -+ struct rtnl_hash_entry *entry; -+ -+ if (!rtnl_rttable_init) -+ rtnl_rttable_initialize(); -+ entry = rtnl_rttable_hash[id & 255]; -+ while (entry && entry->id != id) -+ entry = entry->next; -+ if (!numeric && entry) -+ return entry->name; -+ snprintf(buf, len, "%u", id); -+ return buf; -+} -+ -+int rtnl_rttable_a2n(__u32 *id, const char *arg) -+{ -+ static const char *cache; -+ static unsigned long res; -+ struct rtnl_hash_entry *entry; -+ char *end; -+ unsigned long i; -+ -+ if (cache && strcmp(cache, arg) == 0) { -+ *id = res; -+ return 0; -+ } -+ -+ if (!rtnl_rttable_init) -+ rtnl_rttable_initialize(); -+ -+ for (i = 0; i < 256; i++) { -+ entry = rtnl_rttable_hash[i]; -+ while (entry && strcmp(entry->name, arg)) -+ entry = entry->next; -+ if (entry) { -+ cache = entry->name; -+ res = entry->id; -+ *id = res; -+ return 0; -+ } -+ } -+ -+ i = strtoul(arg, &end, 0); -+ if (!end || end == arg || *end || i > RT_TABLE_MAX) -+ return -1; -+ *id = i; -+ return 0; -+} -diff --git a/accel-pppd/libnetlink/rt_names.h b/accel-pppd/libnetlink/rt_names.h -new file mode 100644 -index 0000000..2ba6fe9 ---- /dev/null -+++ b/accel-pppd/libnetlink/rt_names.h -@@ -0,0 +1,14 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+#ifndef RT_NAMES_H_ -+#define RT_NAMES_H_ 1 -+ -+#include -+ -+const char *rtnl_rttable_n2a(__u32 id, char *buf, int len); -+const char *rtnl_dsfield_get_name(int id); -+ -+int rtnl_rttable_a2n(__u32 *id, const char *arg); -+ -+extern int numeric; -+ -+#endif -diff --git a/accel-pppd/radius/radius.c b/accel-pppd/radius/radius.c -index 2406ba0..a45666f 100644 ---- a/accel-pppd/radius/radius.c -+++ b/accel-pppd/radius/radius.c -@@ -313,6 +313,7 @@ int rad_proc_attrs(struct rad_req_t *req) - } else if (attr->vendor->id == VENDOR_Accel_PPP) { - switch (attr->attr->id) { - case Accel_VRF_Name: -+ log_ppp_info2("radius: setting vrf_name to %s\n", attr->val.string); - if (rpd->ses->vrf_name) - _free(rpd->ses->vrf_name); - rpd->ses->vrf_name = _malloc(attr->len + 1); -@@ -642,15 +643,23 @@ static void ses_started(struct ap_session *ses) - char nbuf[INET6_ADDRSTRLEN]; - char gwbuf[INET6_ADDRSTRLEN]; - -+#ifdef HAVE_VRF -+ if (ip6route_add(gw_spec ? 0 : rpd->ses->ifindex, &fr6->prefix, fr6->plen, gw_spec ? &fr6->gw : NULL, 3, fr6->prio, rpd->ses->vrf_name)) { -+#else - if (ip6route_add(gw_spec ? 0 : rpd->ses->ifindex, &fr6->prefix, fr6->plen, gw_spec ? &fr6->gw : NULL, 3, fr6->prio)) { -+#endif - log_ppp_warn("radius: failed to add route %s/%hhu %s %u\n", -- u_ip6str(&fr6->prefix, nbuf), fr6->plen, -- u_ip6str(&fr6->gw, gwbuf), fr6->prio); -+ u_ip6str(&fr6->prefix, nbuf), fr6->plen, -+ u_ip6str(&fr6->gw, gwbuf), fr6->prio); - } - } - - for (fr = rpd->fr; fr; fr = fr->next) { -+#ifdef HAVE_VRF -+ if (iproute_add(fr->gw ? 0 : rpd->ses->ifindex, 0, fr->dst, fr->gw, 3, fr->mask, fr->prio, rpd->ses->vrf_name)) { -+#else - if (iproute_add(fr->gw ? 0 : rpd->ses->ifindex, 0, fr->dst, fr->gw, 3, fr->mask, fr->prio)) { -+#endif - char dst[17], gw[17]; - u_inet_ntoa(fr->dst, dst); - u_inet_ntoa(fr->gw, gw); -@@ -689,12 +698,20 @@ static void ses_finishing(struct ap_session *ses) - * when the interface is removed. - */ - if (!IN6_IS_ADDR_UNSPECIFIED(&fr6->gw)) -+#ifdef HAVE_VRF -+ ip6route_del(0, &fr6->prefix, fr6->plen, &fr6->gw, 3, fr6->prio, rpd->ses->vrf_name); -+#else - ip6route_del(0, &fr6->prefix, fr6->plen, &fr6->gw, 3, fr6->prio); -+#endif - } - - for (fr = rpd->fr; fr; fr = fr->next) { - if (fr->gw) -+#ifdef HAVE_VRF -+ iproute_del(0, 0, fr->dst, fr->gw, 3, fr->mask, fr->prio, rpd->ses->vrf_name); -+#else - iproute_del(0, 0, fr->dst, fr->gw, 3, fr->mask, fr->prio); -+#endif - } - - if (rpd->acct_started || rpd->acct_req) --- -2.39.5 - diff --git a/scripts/package-build/linux-kernel/patches/accel-ppp/0002-Radius-Dns-Server-IPv6-Address.patch b/scripts/package-build/linux-kernel/patches/accel-ppp/0002-Radius-Dns-Server-IPv6-Address.patch deleted file mode 100644 index a8991801..00000000 --- a/scripts/package-build/linux-kernel/patches/accel-ppp/0002-Radius-Dns-Server-IPv6-Address.patch +++ /dev/null @@ -1,195 +0,0 @@ -From: Ben Hardill -Date: Tue, 13 Mar 2025 05:00:00 +0000 -Subject: [PATCH] PPPoE: IPv6 DNS from Radius - managing the DNS-Server-IPv6-Address attribute - -Patch authored by Ben Hardill from -https://github.com/accel-ppp/accel-ppp/pull/69 ---- -diff --git a/accel-pppd/include/ap_session.h b/accel-pppd/include/ap_session.h -index 70515133..507eae04 100644 ---- a/accel-pppd/include/ap_session.h -+++ b/accel-pppd/include/ap_session.h -@@ -84,6 +84,7 @@ struct ap_session - struct ipv4db_item_t *ipv4; - struct ipv6db_item_t *ipv6; - struct ipv6db_prefix_t *ipv6_dp; -+ struct ipv6db_item_t *ipv6_dns; - char *ipv4_pool_name; - char *ipv6_pool_name; - char *dpv6_pool_name; -diff --git a/accel-pppd/ipv6/dhcpv6.c b/accel-pppd/ipv6/dhcpv6.c -index 158771b1..1ef48132 100644 ---- a/accel-pppd/ipv6/dhcpv6.c -+++ b/accel-pppd/ipv6/dhcpv6.c -@@ -214,19 +214,41 @@ static void insert_status(struct dhcpv6_packet *pkt, struct dhcpv6_option *opt, - status->code = htons(code); - } - --static void insert_oro(struct dhcpv6_packet *reply, struct dhcpv6_option *opt) -+static void insert_oro(struct dhcpv6_packet *reply, struct dhcpv6_option *opt, struct ap_session *ses) - { - struct dhcpv6_option *opt1; -- int i, j; -+ int i = 0, j = 0, k = 0; - uint16_t *ptr; - struct in6_addr addr, *addr_ptr; -+ struct ipv6db_addr_t *dns; - - for (i = ntohs(opt->hdr->len) / 2, ptr = (uint16_t *)opt->hdr->data; i; i--, ptr++) { - if (ntohs(*ptr) == D6_OPTION_DNS_SERVERS) { -- if (conf_dns_count) { -- opt1 = dhcpv6_option_alloc(reply, D6_OPTION_DNS_SERVERS, conf_dns_count * sizeof(addr)); -- for (j = 0, addr_ptr = (struct in6_addr *)opt1->hdr->data; j < conf_dns_count; j++, addr_ptr++) -- memcpy(addr_ptr, conf_dns + j, sizeof(addr)); -+ if (ses->ipv6_dns && !list_empty(&ses->ipv6_dns->addr_list)) { -+ list_for_each_entry(dns, &ses->ipv6_dns->addr_list, entry) { -+ j++; -+ } -+ if (j >= 3) { -+ j = 3; -+ } -+ opt1 = dhcpv6_option_alloc(reply, D6_OPTION_DNS_SERVERS, j * sizeof(addr)); -+ addr_ptr = (struct in6_addr *)opt1->hdr->data; -+ list_for_each_entry(dns, &ses->ipv6_dns->addr_list, entry) { -+ if (k < j) { -+ memcpy(addr_ptr, &dns->addr, sizeof(addr)); -+ k++; -+ addr_ptr++; -+ } else { -+ break; -+ } -+ } -+ -+ } else { -+ if (conf_dns_count) { -+ opt1 = dhcpv6_option_alloc(reply, D6_OPTION_DNS_SERVERS, conf_dns_count * sizeof(addr)); -+ for (j = 0, addr_ptr = (struct in6_addr *)opt1->hdr->data; j < conf_dns_count; j++, addr_ptr++) -+ memcpy(addr_ptr, conf_dns + j, sizeof(addr)); -+ } - } - } else if (ntohs(*ptr) == D6_OPTION_DOMAIN_LIST) { - if (conf_dnssl_size) { -@@ -434,7 +456,10 @@ static void dhcpv6_send_reply(struct dhcpv6_packet *req, struct dhcpv6_pd *pd, i - - // Option Request - } else if (ntohs(opt->hdr->code) == D6_OPTION_ORO) { -- insert_oro(reply, opt); -+ if (ses->ipv6_dns &&!list_empty(&ses->ipv6_dns->addr_list)) { -+ log_ppp_info2("User specific IPv6 DNS entries\n"); -+ } -+ insert_oro(reply, opt, ses); - - } else if (ntohs(opt->hdr->code) == D6_OPTION_RAPID_COMMIT) { - if (req->hdr->type == D6_SOLICIT) -@@ -594,7 +619,7 @@ static void dhcpv6_send_reply2(struct dhcpv6_packet *req, struct dhcpv6_pd *pd, - } - // Option Request - } else if (ntohs(opt->hdr->code) == D6_OPTION_ORO) -- insert_oro(reply, opt); -+ insert_oro(reply, opt, ses); - } - - opt1 = dhcpv6_option_alloc(reply, D6_OPTION_PREFERENCE, 1); -diff --git a/accel-pppd/ipv6/nd.c b/accel-pppd/ipv6/nd.c -index 297e4d63..b3054274 100644 ---- a/accel-pppd/ipv6/nd.c -+++ b/accel-pppd/ipv6/nd.c -@@ -174,7 +174,32 @@ static void ipv6_nd_send_ra(struct ipv6_nd_handler_t *h, struct sockaddr_in6 *ds - rinfo++; - }*/ - -- if (conf_dns_count) { -+ if (ses->ipv6_dns && !list_empty(&ses->ipv6_dns->addr_list)) { -+ int i = 0, j = 0; -+ struct ipv6db_addr_t *dns; -+ -+ list_for_each_entry(dns, &ses->ipv6_dns->addr_list, entry) { -+ i++; -+ } -+ if (i >= 3) { -+ i = 3; -+ } -+ rdnssinfo = (struct nd_opt_rdnss_info_local *)pinfo; -+ memset(rdnssinfo, 0, sizeof(*rdnssinfo)); -+ rdnssinfo->nd_opt_rdnssi_type = ND_OPT_RDNSS_INFORMATION; -+ rdnssinfo->nd_opt_rdnssi_len = 1 + 2 * i; -+ rdnssinfo->nd_opt_rdnssi_lifetime = htonl(conf_rdnss_lifetime); -+ rdnss_addr = (struct in6_addr *)rdnssinfo->nd_opt_rdnssi; -+ list_for_each_entry(dns, &ses->ipv6_dns->addr_list, entry) { -+ if (j < i) { -+ memcpy(rdnss_addr, &dns->addr, sizeof(*rdnss_addr)); -+ j++; -+ rdnss_addr++; -+ } else { -+ break; -+ } -+ } -+ } else if (conf_dns_count) { - rdnssinfo = (struct nd_opt_rdnss_info_local *)pinfo; - memset(rdnssinfo, 0, sizeof(*rdnssinfo)); - rdnssinfo->nd_opt_rdnssi_type = ND_OPT_RDNSS_INFORMATION; -diff --git a/accel-pppd/radius/radius.c b/accel-pppd/radius/radius.c -index 786faa56..1379b0b2 100644 ---- a/accel-pppd/radius/radius.c -+++ b/accel-pppd/radius/radius.c -@@ -403,6 +403,12 @@ int rad_proc_attrs(struct rad_req_t *req) - case Framed_IPv6_Route: - rad_add_framed_ipv6_route(attr->val.string, rpd); - break; -+ case DNS_Server_IPv6_Address: -+ a = _malloc(sizeof(*a)); -+ memset(a, 0, sizeof(*a)); -+ a->addr = attr->val.ipv6addr; -+ list_add_tail(&a->entry, &rpd->ipv6_dns.addr_list); -+ break; - } - } - -@@ -420,6 +426,9 @@ int rad_proc_attrs(struct rad_req_t *req) - if (!rpd->ses->ipv6_dp && !list_empty(&rpd->ipv6_dp.prefix_list)) - rpd->ses->ipv6_dp = &rpd->ipv6_dp; - -+ if (!rpd->ses->ipv6_dns && !list_empty(&rpd->ipv6_dns.addr_list)) -+ rpd->ses->ipv6_dns = &rpd->ipv6_dns; -+ - return res; - } - -@@ -584,10 +593,12 @@ static void ses_starting(struct ap_session *ses) - INIT_LIST_HEAD(&rpd->plugin_list); - INIT_LIST_HEAD(&rpd->ipv6_addr.addr_list); - INIT_LIST_HEAD(&rpd->ipv6_dp.prefix_list); -+ INIT_LIST_HEAD(&rpd->ipv6_dns.addr_list); - - rpd->ipv4_addr.owner = &ipdb; - rpd->ipv6_addr.owner = &ipdb; - rpd->ipv6_dp.owner = &ipdb; -+ rpd->ipv6_dns.owner = &ipdb; - - list_add_tail(&rpd->pd.entry, &ses->pd_list); - -@@ -764,6 +775,12 @@ static void ses_finished(struct ap_session *ses) - _free(a); - } - -+ while (!list_empty(&rpd->ipv6_dns.addr_list)) { -+ a = list_entry(rpd->ipv6_dns.addr_list.next, typeof(*a), entry); -+ list_del(&a->entry); -+ _free(a); -+ } -+ - fr6 = rpd->fr6; - while (fr6) { - struct framed_ip6_route *next = fr6->next; -diff --git a/accel-pppd/radius/radius_p.h b/accel-pppd/radius/radius_p.h -index 988f154f..eaa5acb0 100644 ---- a/accel-pppd/radius/radius_p.h -+++ b/accel-pppd/radius/radius_p.h -@@ -65,6 +65,7 @@ struct radius_pd_t { - struct ipv4db_item_t ipv4_addr; - struct ipv6db_item_t ipv6_addr; - struct ipv6db_prefix_t ipv6_dp; -+ struct ipv6db_item_t ipv6_dns; - int acct_interim_interval; - int acct_interim_jitter; - diff --git a/scripts/package-build/linux-kernel/patches/accel-ppp/0003-Simplify-implementation-of-vrf-support-for-iproute_a.patch b/scripts/package-build/linux-kernel/patches/accel-ppp/0003-Simplify-implementation-of-vrf-support-for-iproute_a.patch deleted file mode 100644 index 3c8fff94..00000000 --- a/scripts/package-build/linux-kernel/patches/accel-ppp/0003-Simplify-implementation-of-vrf-support-for-iproute_a.patch +++ /dev/null @@ -1,213 +0,0 @@ -From 4898832b90a6b929b8316fe55085b14c3afcf4a8 Mon Sep 17 00:00:00 2001 -From: Chris Hills -Date: Mon, 3 Jul 2023 14:42:22 +0100 -Subject: [PATCH 3/4] Simplify implementation of vrf support for - iproute_add/del - -(cherry picked from commit 85cbd27bd440e0a4836bb9e03c933e05fd321769) ---- - accel-pppd/ctrl/ipoe/ipoe.c | 24 ++---------------------- - accel-pppd/libnetlink/iputils.c | 16 ---------------- - accel-pppd/libnetlink/iputils.h | 5 ----- - accel-pppd/radius/radius.c | 16 ---------------- - accel-pppd/session.c | 1 + - 5 files changed, 3 insertions(+), 59 deletions(-) - -diff --git a/accel-pppd/ctrl/ipoe/ipoe.c b/accel-pppd/ctrl/ipoe/ipoe.c -index 6f23fd6..3a6c85b 100644 ---- a/accel-pppd/ctrl/ipoe/ipoe.c -+++ b/accel-pppd/ctrl/ipoe/ipoe.c -@@ -1021,9 +1021,9 @@ static void __ipoe_session_activate(struct ipoe_session *ses) - in_addr_t gw; - iproute_get(ses->router, &gw, NULL); - if (gw) -- iproute_add(0, ses->siaddr, ses->yiaddr, gw, conf_proto, 32); -+ iproute_add(0, ses->siaddr, ses->yiaddr, gw, conf_proto, 32, NULL); - else -- iproute_add(0, ses->siaddr, ses->router, gw, conf_proto, 32); -+ iproute_add(0, ses->siaddr, ses->router, gw, conf_proto, 32, NULL); - }*/ - - if (serv->opt_mode == MODE_L3) -@@ -1067,17 +1067,9 @@ static void __ipoe_session_activate(struct ipoe_session *ses) - - if (ses->ifindex == -1 && !serv->opt_ifcfg) { - if (!serv->opt_ip_unnumbered) --#ifdef HAVE_VRF - iproute_add(serv->ifindex, ses->router, ses->yiaddr, 0, conf_proto, ses->mask, 0, NULL); --#else -- iproute_add(serv->ifindex, ses->router, ses->yiaddr, 0, conf_proto, ses->mask, 0); --#endif - else --#ifdef HAVE_VRF - iproute_add(serv->ifindex, serv->opt_src ?: ses->router, ses->yiaddr, 0, conf_proto, 32, 0, NULL); --#else -- iproute_add(serv->ifindex, serv->opt_src ?: ses->router, ses->yiaddr, 0, conf_proto, 32, 0); --#endif - } - - if (ses->l4_redirect) -@@ -1178,11 +1170,7 @@ static void ipoe_session_started(struct ap_session *s) - - if (ses->ses.ipv4->peer_addr != ses->yiaddr) - //ipaddr_add_peer(ses->ses.ifindex, ses->router, ses->yiaddr); // breaks quagga --#ifdef HAVE_VRF - iproute_add(ses->ses.ifindex, ses->router, ses->yiaddr, 0, conf_proto, 32, 0, NULL); --#else -- iproute_add(ses->ses.ifindex, ses->router, ses->yiaddr, 0, conf_proto, 32, 0); --#endif - - if (ses->ifindex != -1 && ses->xid) { - ses->dhcpv4 = dhcpv4_create(ses->ctrl.ctx, ses->ses.ifname, ""); -@@ -1266,17 +1254,9 @@ static void ipoe_session_finished(struct ap_session *s) - } else if (ses->started) { - if (!serv->opt_ifcfg) { - if (!serv->opt_ip_unnumbered) --#ifdef HAVE_VRF - iproute_del(serv->ifindex, ses->router, ses->yiaddr, 0, conf_proto, ses->mask, 0, NULL); --#else -- iproute_del(serv->ifindex, ses->router, ses->yiaddr, 0, conf_proto, ses->mask, 0); --#endif - else --#ifdef HAVE_VRF - iproute_del(serv->ifindex, serv->opt_src ?: ses->router, ses->yiaddr, 0, conf_proto, 32, 0, NULL); --#else -- iproute_del(serv->ifindex, serv->opt_src ?: ses->router, ses->yiaddr, 0, conf_proto, 32, 0); --#endif - } - } - -diff --git a/accel-pppd/libnetlink/iputils.c b/accel-pppd/libnetlink/iputils.c -index 6c61fc2..60eca8b 100644 ---- a/accel-pppd/libnetlink/iputils.c -+++ b/accel-pppd/libnetlink/iputils.c -@@ -533,11 +533,7 @@ out: - } - #endif - --#ifdef HAVE_VRF - int __export iproute_add(int ifindex, in_addr_t src, in_addr_t dst, in_addr_t gw, int proto, int mask, uint32_t prio, const char *vrf_name) --#else --int __export iproute_add(int ifindex, in_addr_t src, in_addr_t dst, in_addr_t gw, int proto, int mask, uint32_t prio) --#endif - { - struct ipaddr_req { - struct nlmsghdr n; -@@ -586,11 +582,7 @@ int __export iproute_add(int ifindex, in_addr_t src, in_addr_t dst, in_addr_t gw - return r; - } - --#ifdef HAVE_VRF - int __export iproute_del(int ifindex, in_addr_t src, in_addr_t dst, in_addr_t gw, int proto, int mask, uint32_t prio, const char *vrf_name) --#else --int __export iproute_del(int ifindex, in_addr_t src, in_addr_t dst, in_addr_t gw, int proto, int mask, uint32_t prio) --#endif - { - struct ipaddr_req { - struct nlmsghdr n; -@@ -633,11 +625,7 @@ int __export iproute_del(int ifindex, in_addr_t src, in_addr_t dst, in_addr_t gw - return r; - } - --#ifdef HAVE_VRF - int __export ip6route_add(int ifindex, const struct in6_addr *dst, int pref_len, const struct in6_addr *gw, int proto, uint32_t prio, const char *vrf_name) --#else --int __export ip6route_add(int ifindex, const struct in6_addr *dst, int pref_len, const struct in6_addr *gw, int proto, uint32_t prio) --#endif - { - struct ipaddr_req { - struct nlmsghdr n; -@@ -684,11 +672,7 @@ int __export ip6route_add(int ifindex, const struct in6_addr *dst, int pref_len, - return r; - } - --#ifdef HAVE_VRF - int __export ip6route_del(int ifindex, const struct in6_addr *dst, int pref_len, const struct in6_addr *gw, int proto, uint32_t prio, const char *vrf_name) --#else --int __export ip6route_del(int ifindex, const struct in6_addr *dst, int pref_len, const struct in6_addr *gw, int proto, uint32_t prio) --#endif - { - struct ipaddr_req { - struct nlmsghdr n; -diff --git a/accel-pppd/libnetlink/iputils.h b/accel-pppd/libnetlink/iputils.h -index c3063f4..d3a93f4 100644 ---- a/accel-pppd/libnetlink/iputils.h -+++ b/accel-pppd/libnetlink/iputils.h -@@ -21,13 +21,8 @@ int ipaddr_add_peer(int ifindex, in_addr_t addr, in_addr_t peer_addr); - int ipaddr_del(int ifindex, in_addr_t addr, int mask); - int ipaddr_del_peer(int ifindex, in_addr_t addr, in_addr_t peer); - --#ifdef HAVE_VRF - int iproute_add(int ifindex, in_addr_t src, in_addr_t dst, in_addr_t gw, int proto, int mask, uint32_t prio, const char *vrf_name); - int iproute_del(int ifindex, in_addr_t src, in_addr_t dst, in_addr_t gw, int proto, int mask, uint32_t prio, const char *vrf_name); --#else --int iproute_add(int ifindex, in_addr_t src, in_addr_t dst, in_addr_t gw, int proto, int mask, uint32_t prio); --int iproute_del(int ifindex, in_addr_t src, in_addr_t dst, in_addr_t gw, int proto, int mask, uint32_t prio); --#endif - in_addr_t iproute_get(in_addr_t dst, in_addr_t *gw); - - #ifdef HAVE_VRF -diff --git a/accel-pppd/radius/radius.c b/accel-pppd/radius/radius.c -index a45666f..9d567b7 100644 ---- a/accel-pppd/radius/radius.c -+++ b/accel-pppd/radius/radius.c -@@ -643,11 +643,7 @@ static void ses_started(struct ap_session *ses) - char nbuf[INET6_ADDRSTRLEN]; - char gwbuf[INET6_ADDRSTRLEN]; - --#ifdef HAVE_VRF - if (ip6route_add(gw_spec ? 0 : rpd->ses->ifindex, &fr6->prefix, fr6->plen, gw_spec ? &fr6->gw : NULL, 3, fr6->prio, rpd->ses->vrf_name)) { --#else -- if (ip6route_add(gw_spec ? 0 : rpd->ses->ifindex, &fr6->prefix, fr6->plen, gw_spec ? &fr6->gw : NULL, 3, fr6->prio)) { --#endif - log_ppp_warn("radius: failed to add route %s/%hhu %s %u\n", - u_ip6str(&fr6->prefix, nbuf), fr6->plen, - u_ip6str(&fr6->gw, gwbuf), fr6->prio); -@@ -655,11 +651,7 @@ static void ses_started(struct ap_session *ses) - } - - for (fr = rpd->fr; fr; fr = fr->next) { --#ifdef HAVE_VRF - if (iproute_add(fr->gw ? 0 : rpd->ses->ifindex, 0, fr->dst, fr->gw, 3, fr->mask, fr->prio, rpd->ses->vrf_name)) { --#else -- if (iproute_add(fr->gw ? 0 : rpd->ses->ifindex, 0, fr->dst, fr->gw, 3, fr->mask, fr->prio)) { --#endif - char dst[17], gw[17]; - u_inet_ntoa(fr->dst, dst); - u_inet_ntoa(fr->gw, gw); -@@ -698,20 +690,12 @@ static void ses_finishing(struct ap_session *ses) - * when the interface is removed. - */ - if (!IN6_IS_ADDR_UNSPECIFIED(&fr6->gw)) --#ifdef HAVE_VRF - ip6route_del(0, &fr6->prefix, fr6->plen, &fr6->gw, 3, fr6->prio, rpd->ses->vrf_name); --#else -- ip6route_del(0, &fr6->prefix, fr6->plen, &fr6->gw, 3, fr6->prio); --#endif - } - - for (fr = rpd->fr; fr; fr = fr->next) { - if (fr->gw) --#ifdef HAVE_VRF - iproute_del(0, 0, fr->dst, fr->gw, 3, fr->mask, fr->prio, rpd->ses->vrf_name); --#else -- iproute_del(0, 0, fr->dst, fr->gw, 3, fr->mask, fr->prio); --#endif - } - - if (rpd->acct_started || rpd->acct_req) -diff --git a/accel-pppd/session.c b/accel-pppd/session.c -index c01417f..fedb6f5 100644 ---- a/accel-pppd/session.c -+++ b/accel-pppd/session.c -@@ -68,6 +68,7 @@ void __export ap_session_init(struct ap_session *ses) - ses->ifindex = -1; - ses->unit_idx = -1; - ses->net = net; -+ ses->vrf_name = NULL; - } - - void __export ap_session_set_ifindex(struct ap_session *ses) --- -2.39.5 - diff --git a/scripts/package-build/linux-kernel/patches/accel-ppp/0004-Fix-whitespace-in-accel-pppd-libnetlink-iputils.c.patch b/scripts/package-build/linux-kernel/patches/accel-ppp/0004-Fix-whitespace-in-accel-pppd-libnetlink-iputils.c.patch deleted file mode 100644 index 9273c8a3..00000000 --- a/scripts/package-build/linux-kernel/patches/accel-ppp/0004-Fix-whitespace-in-accel-pppd-libnetlink-iputils.c.patch +++ /dev/null @@ -1,26 +0,0 @@ -From a959ab0c0d659a8b314b98bb577a79ec9ed3542c Mon Sep 17 00:00:00 2001 -From: Chris Hills -Date: Tue, 11 Jul 2023 10:14:52 +0100 -Subject: [PATCH 4/4] Fix whitespace in accel-pppd/libnetlink/iputils.c - -(cherry picked from commit 10d2fba58928dcb4604a04169cbb3a8c9e8a172f) ---- - accel-pppd/libnetlink/iputils.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/accel-pppd/libnetlink/iputils.c b/accel-pppd/libnetlink/iputils.c -index 60eca8b..afe2380 100644 ---- a/accel-pppd/libnetlink/iputils.c -+++ b/accel-pppd/libnetlink/iputils.c -@@ -551,7 +551,7 @@ int __export iproute_add(int ifindex, in_addr_t src, in_addr_t dst, in_addr_t gw - #ifdef HAVE_VRF - __u32 rt_table = ipvrf_get_table(vrf_name); - #else -- __u32 rt_table = RT_TABLE_MAIN; -+ __u32 rt_table = RT_TABLE_MAIN; - #endif - - req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg)); --- -2.39.5 -