lists.osmocom.org
Sign In Sign Up
Manage this list Sign In Sign Up

Keyboard Shortcuts

Thread View

  • j: Next unread message
  • k: Previous unread message
  • j a: Jump to all threads
  • j l: Jump to MailingList overview

gerrit-log

Thread Start a new thread
Download
Threads by month
  • ----- 2026 -----
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2025 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2024 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2023 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2022 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
gerrit-log@lists.osmocom.org

October 2024

  • 1 participants
  • 1631 discussions
[S] Change in osmo-ggsn[master]: ggsn: Support announcing APN MTU over PCO
by lynxis lazus 21 Oct '24

21 Oct '24
Attention is currently required from: fixeria, laforge, osmith, pespin. lynxis lazus has posted comments on this change by pespin. ( https://gerrit.osmocom.org/c/osmo-ggsn/+/38457?usp=email ) Change subject: ggsn: Support announcing APN MTU over PCO ...................................................................... Patch Set 5: Code-Review+1 -- To view, visit https://gerrit.osmocom.org/c/osmo-ggsn/+/38457?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email Gerrit-MessageType: comment Gerrit-Project: osmo-ggsn Gerrit-Branch: master Gerrit-Change-Id: I8532acfffadda9e83962b30e4f6b17eb8b3362ac Gerrit-Change-Number: 38457 Gerrit-PatchSet: 5 Gerrit-Owner: pespin <pespin(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: laforge <laforge(a)osmocom.org> Gerrit-Reviewer: lynxis lazus <lynxis(a)fe80.eu> Gerrit-Reviewer: osmith <osmith(a)sysmocom.de> Gerrit-Attention: osmith <osmith(a)sysmocom.de> Gerrit-Attention: laforge <laforge(a)osmocom.org> Gerrit-Attention: pespin <pespin(a)sysmocom.de> Gerrit-Attention: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Comment-Date: Mon, 21 Oct 2024 17:43:01 +0000 Gerrit-HasComments: No Gerrit-Has-Labels: Yes
1 0
0 0
[XS] Change in osmo-ggsn[master]: vty: Fix missing newline in description of 'apn tun-device' cmd
by lynxis lazus 21 Oct '24

21 Oct '24
Attention is currently required from: pespin. lynxis lazus has posted comments on this change by pespin. ( https://gerrit.osmocom.org/c/osmo-ggsn/+/38482?usp=email ) Change subject: vty: Fix missing newline in description of 'apn tun-device' cmd ...................................................................... Patch Set 1: Code-Review+2 -- To view, visit https://gerrit.osmocom.org/c/osmo-ggsn/+/38482?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email Gerrit-MessageType: comment Gerrit-Project: osmo-ggsn Gerrit-Branch: master Gerrit-Change-Id: I92002acdb83455eb6becc688c33192d3856b0aa6 Gerrit-Change-Number: 38482 Gerrit-PatchSet: 1 Gerrit-Owner: pespin <pespin(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: lynxis lazus <lynxis(a)fe80.eu> Gerrit-Attention: pespin <pespin(a)sysmocom.de> Gerrit-Comment-Date: Mon, 21 Oct 2024 17:42:48 +0000 Gerrit-HasComments: No Gerrit-Has-Labels: Yes
1 0
0 0
[S] Change in osmo-ggsn[master]: ggsn: Support announcing APN MTU over PCO
by lynxis lazus 21 Oct '24

21 Oct '24
Attention is currently required from: fixeria, laforge, osmith, pespin. lynxis lazus has posted comments on this change by pespin. ( https://gerrit.osmocom.org/c/osmo-ggsn/+/38457?usp=email ) Change subject: ggsn: Support announcing APN MTU over PCO ...................................................................... Patch Set 5: (1 comment) Patchset: PS5: 0 MTU might be interesting. But fine with me. -- To view, visit https://gerrit.osmocom.org/c/osmo-ggsn/+/38457?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email Gerrit-MessageType: comment Gerrit-Project: osmo-ggsn Gerrit-Branch: master Gerrit-Change-Id: I8532acfffadda9e83962b30e4f6b17eb8b3362ac Gerrit-Change-Number: 38457 Gerrit-PatchSet: 5 Gerrit-Owner: pespin <pespin(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: laforge <laforge(a)osmocom.org> Gerrit-Reviewer: lynxis lazus <lynxis(a)fe80.eu> Gerrit-Reviewer: osmith <osmith(a)sysmocom.de> Gerrit-Attention: osmith <osmith(a)sysmocom.de> Gerrit-Attention: laforge <laforge(a)osmocom.org> Gerrit-Attention: pespin <pespin(a)sysmocom.de> Gerrit-Attention: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Comment-Date: Mon, 21 Oct 2024 17:25:31 +0000 Gerrit-HasComments: Yes Gerrit-Has-Labels: No
1 0
0 0
[S] Change in osmo-ggsn[master]: WIP: ggsn: apply configured APN MTU to tun
by pespin 21 Oct '24

21 Oct '24
pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ggsn/+/38484?usp=email ) Change subject: WIP: ggsn: apply configured APN MTU to tun ...................................................................... WIP: ggsn: apply configured APN MTU to tun Change-Id: Ifae556169d895860812c9ea5633292d7e3fab338 --- M ggsn/ggsn.c M ggsn/ggsn.h M ggsn/ggsn_vty.c 3 files changed, 33 insertions(+), 3 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-ggsn refs/changes/84/38484/1 diff --git a/ggsn/ggsn.c b/ggsn/ggsn.c index 1908958..53b5213 100644 --- a/ggsn/ggsn.c +++ b/ggsn/ggsn.c @@ -309,6 +309,16 @@ return -1; } + if (apn->tun.cfg.mtu_apply) { + rc = osmo_netdev_set_mtu(apn->tun.tun->netdev, apn->cfg.mtu); + if (rc < 0) { + LOGPAPN(LOGL_ERROR, apn, "Failed to set tun interface MTU %u: %s\n", + apn->cfg.mtu, strerror(errno)); + apn_stop(apn); + return -1; + } + } + if (apn->tun.cfg.ipup_script) { LOGPAPN(LOGL_INFO, apn, "Running ip-up script %s\n", apn->tun.cfg.ipup_script); diff --git a/ggsn/ggsn.h b/ggsn/ggsn.h index bd953a4..23df05e 100644 --- a/ggsn/ggsn.h +++ b/ggsn/ggsn.h @@ -95,6 +95,8 @@ /* ip-up and ip-down script names/paths */ char *ipup_script; char *ipdown_script; + /* Whether to apply the MTU (apn->cfg.mtu) on the tun device: */ + bool mtu_apply; } cfg; struct tun_t *tun; } tun; diff --git a/ggsn/ggsn_vty.c b/ggsn/ggsn_vty.c index eda0096..b0f07fe 100644 --- a/ggsn/ggsn_vty.c +++ b/ggsn/ggsn_vty.c @@ -422,16 +422,33 @@ /* MAX_POSSIBLE_APN_MTU = 9000 * MAX_DESIRED_APN_MTU = 1420 */ DEFUN(cfg_apn_mtu, cfg_apn_mtu_cmd, - "mtu (<0-" OSMO_STRINGIFY_VAL(MAX_POSSIBLE_APN_MTU) ">|default)", + "mtu (<0-" OSMO_STRINGIFY_VAL(MAX_POSSIBLE_APN_MTU) ">|default) [apply]", "Configure announced MTU\n" "MTU of the APN, announced to the UE\n" - "Default value of the MTU of the APN (1420)\n") + "Default value of the MTU of the APN (1420)\n" + "Apply the MTU on the tun-device of the APN\n") { struct apn_ctx *apn = (struct apn_ctx *) vty->index; + int rc; + if (strcmp(argv[0], "default") == 0) apn->cfg.mtu = MAX_DESIRED_APN_MTU; else apn->cfg.mtu = atoi(argv[0]); + apn->tun.cfg.mtu_apply = (argc > 1); + + if (apn->tun.cfg.mtu_apply && apn->tun.tun) { + rc = osmo_netdev_set_mtu(apn->tun.tun->netdev, apn->cfg.mtu); + if (rc < 0) { + char buf_err[128]; + strerror_r(errno, buf_err, sizeof(buf_err)); + LOGPAPN(LOGL_ERROR, apn, "Failed to set tun interface MTU %u: %s (%d)\n", + apn->cfg.mtu, buf_err, rc); + vty_out(vty, "%% Failed to set tun interface MTU %u: %s (%d)%s", + apn->cfg.mtu, buf_err, rc, VTY_NEWLINE); + return CMD_WARNING; + } + } return CMD_SUCCESS; } @@ -705,7 +722,8 @@ VTY_NEWLINE); } - vty_out(vty, " mtu %" PRIu16 "%s", apn->cfg.mtu, VTY_NEWLINE); + vty_out(vty, " mtu %" PRIu16 "%s%s", apn->cfg.mtu, + apn->tun.cfg.mtu_apply ? " apply" : "", VTY_NEWLINE); if (!apn->cfg.tx_gpdu_seq) vty_out(vty, " no g-pdu tx-sequence-numbers%s", VTY_NEWLINE); -- To view, visit https://gerrit.osmocom.org/c/osmo-ggsn/+/38484?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email Gerrit-MessageType: newchange Gerrit-Project: osmo-ggsn Gerrit-Branch: master Gerrit-Change-Id: Ifae556169d895860812c9ea5633292d7e3fab338 Gerrit-Change-Number: 38484 Gerrit-PatchSet: 1 Gerrit-Owner: pespin <pespin(a)sysmocom.de>
1 0
0 0
[XS] Change in osmo-ggsn[master]: vty: Fix missing newline in description of 'apn tun-device' cmd
by pespin 21 Oct '24

21 Oct '24
pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ggsn/+/38482?usp=email ) Change subject: vty: Fix missing newline in description of 'apn tun-device' cmd ...................................................................... vty: Fix missing newline in description of 'apn tun-device' cmd Change-Id: I92002acdb83455eb6becc688c33192d3856b0aa6 --- M ggsn/ggsn_vty.c 1 file changed, 1 insertion(+), 1 deletion(-) git pull ssh://gerrit.osmocom.org:29418/osmo-ggsn refs/changes/82/38482/1 diff --git a/ggsn/ggsn_vty.c b/ggsn/ggsn_vty.c index 13036d8..3e139c3 100644 --- a/ggsn/ggsn_vty.c +++ b/ggsn/ggsn_vty.c @@ -412,7 +412,7 @@ DEFUN(cfg_apn_tun_dev_name, cfg_apn_tun_dev_name_cmd, "tun-device NAME", "Configure tun device name\n" - "TUN device name") + "TUN device name\n") { struct apn_ctx *apn = (struct apn_ctx *) vty->index; osmo_talloc_replace_string(apn, &apn->tun.cfg.dev_name, argv[0]); -- To view, visit https://gerrit.osmocom.org/c/osmo-ggsn/+/38482?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email Gerrit-MessageType: newchange Gerrit-Project: osmo-ggsn Gerrit-Branch: master Gerrit-Change-Id: I92002acdb83455eb6becc688c33192d3856b0aa6 Gerrit-Change-Number: 38482 Gerrit-PatchSet: 1 Gerrit-Owner: pespin <pespin(a)sysmocom.de>
1 0
0 0
[S] Change in osmo-ggsn[master]: ggsn: Support announcing APN MTU over PCO
by pespin 21 Oct '24

21 Oct '24
Attention is currently required from: fixeria, laforge, lynxis lazus, osmith. Hello Jenkins Builder, fixeria, laforge, lynxis lazus, osmith, I'd like you to reexamine a change. Please visit https://gerrit.osmocom.org/c/osmo-ggsn/+/38457?usp=email to look at the new patch set (#5). The following approvals got outdated and were removed: Code-Review+1 by osmith, Code-Review-1 by lynxis lazus, Verified+1 by Jenkins Builder Change subject: ggsn: Support announcing APN MTU over PCO ...................................................................... ggsn: Support announcing APN MTU over PCO This is only useful for IPv4 (or IPv4v6) APNs. IPv6 APNs obtain this information from SLAAC RA. Related: OS#6298 Related: SYS#7122 Change-Id: I8532acfffadda9e83962b30e4f6b17eb8b3362ac --- M ggsn/ggsn.c M ggsn/ggsn.h M ggsn/ggsn_vty.c M ggsn/pco.c 4 files changed, 45 insertions(+), 0 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-ggsn refs/changes/57/38457/5 -- To view, visit https://gerrit.osmocom.org/c/osmo-ggsn/+/38457?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email Gerrit-MessageType: newpatchset Gerrit-Project: osmo-ggsn Gerrit-Branch: master Gerrit-Change-Id: I8532acfffadda9e83962b30e4f6b17eb8b3362ac Gerrit-Change-Number: 38457 Gerrit-PatchSet: 5 Gerrit-Owner: pespin <pespin(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: laforge <laforge(a)osmocom.org> Gerrit-Reviewer: lynxis lazus <lynxis(a)fe80.eu> Gerrit-Reviewer: osmith <osmith(a)sysmocom.de> Gerrit-Attention: osmith <osmith(a)sysmocom.de> Gerrit-Attention: laforge <laforge(a)osmocom.org> Gerrit-Attention: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Attention: lynxis lazus <lynxis(a)fe80.eu>
1 0
0 0
[L] Change in osmo-ggsn[master]: ggsn: Use osmo_netdev_addaddr() libosmocore API
by pespin 21 Oct '24

21 Oct '24
pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ggsn/+/38483?usp=email ) Change subject: ggsn: Use osmo_netdev_addaddr() libosmocore API ...................................................................... ggsn: Use osmo_netdev_addaddr() libosmocore API This allows dropping a lot of duplicated code. While at it, drop references to non-linux systems, which are not maintained anymore. Param "dstaddr" was not used anywhere in the old APIs, so it can also be dropped. Param "tun->routes" was also used in BSD code, so it can also be dropped. Change-Id: I1fccfd658542481cd61536fbd3c7a3a32a1c253b --- M ggsn/ggsn.c M lib/netdev.c M lib/netdev.h M lib/tun.c M lib/tun.h M sgsnemu/sgsnemu.c 6 files changed, 39 insertions(+), 620 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-ggsn refs/changes/83/38483/1 diff --git a/ggsn/ggsn.c b/ggsn/ggsn.c index 7967f42..1908958 100644 --- a/ggsn/ggsn.c +++ b/ggsn/ggsn.c @@ -264,7 +264,7 @@ if (apn->v4.cfg.ifconfig_prefix.addr.len) { LOGPAPN(LOGL_INFO, apn, "Setting tun IP address %s\n", in46p_ntoa(&apn->v4.cfg.ifconfig_prefix)); - if (tun_addaddr(apn->tun.tun, &apn->v4.cfg.ifconfig_prefix.addr, NULL, + if (tun_addaddr(apn->tun.tun, &apn->v4.cfg.ifconfig_prefix.addr, apn->v4.cfg.ifconfig_prefix.prefixlen)) { LOGPAPN(LOGL_ERROR, apn, "Failed to set tun IPv4 address %s: %s\n", in46p_ntoa(&apn->v4.cfg.ifconfig_prefix), strerror(errno)); @@ -276,7 +276,7 @@ if (apn->v6.cfg.ifconfig_prefix.addr.len) { LOGPAPN(LOGL_INFO, apn, "Setting tun IPv6 address %s\n", in46p_ntoa(&apn->v6.cfg.ifconfig_prefix)); - if (tun_addaddr(apn->tun.tun, &apn->v6.cfg.ifconfig_prefix.addr, NULL, + if (tun_addaddr(apn->tun.tun, &apn->v6.cfg.ifconfig_prefix.addr, apn->v6.cfg.ifconfig_prefix.prefixlen)) { LOGPAPN(LOGL_ERROR, apn, "Failed to set tun IPv6 address %s: %s. " "Ensure you have ipv6 support and not used the disable_ipv6 sysctl?\n", @@ -289,7 +289,7 @@ if (apn->v6.cfg.ll_prefix.addr.len) { LOGPAPN(LOGL_INFO, apn, "Setting tun IPv6 link-local address %s\n", in46p_ntoa(&apn->v6.cfg.ll_prefix)); - if (tun_addaddr(apn->tun.tun, &apn->v6.cfg.ll_prefix.addr, NULL, + if (tun_addaddr(apn->tun.tun, &apn->v6.cfg.ll_prefix.addr, apn->v6.cfg.ll_prefix.prefixlen)) { LOGPAPN(LOGL_ERROR, apn, "Failed to set tun IPv6 link-local address %s: %s. " "Ensure you have ipv6 support and not used the disable_ipv6 sysctl?\n", @@ -300,6 +300,15 @@ apn->v6_lladdr = apn->v6.cfg.ll_prefix.addr.v6; } + rc = osmo_netdev_ifupdown(apn->tun.tun->netdev, true); + if (rc < 0) { + LOGPAPN(LOGL_ERROR, apn, "Failed to set tun interface UP: %s. " + "Ensure you have ipv6 support and not used the disable_ipv6 sysctl?\n", + strerror(errno)); + apn_stop(apn); + return -1; + } + if (apn->tun.cfg.ipup_script) { LOGPAPN(LOGL_INFO, apn, "Running ip-up script %s\n", apn->tun.cfg.ipup_script); diff --git a/lib/netdev.c b/lib/netdev.c index fd3caff..fb18d60 100644 --- a/lib/netdev.c +++ b/lib/netdev.c @@ -37,522 +37,14 @@ #include <net/route.h> #include <net/if.h> -#if defined(__linux__) #include <linux/netlink.h> #include <linux/rtnetlink.h> -#elif defined (__FreeBSD__) -#include <net/if_var.h> -#include <netinet/in_var.h> - -#elif defined (__APPLE__) -#include <net/if.h> - -#else -#error "Unknown platform!" -#endif - #include "netdev.h" #include "syserr.h" -#if defined(__linux__) - #include <linux/ipv6.h> -static int netdev_nlattr(struct nlmsghdr *n, int nsize, int type, void *d, int dlen) -{ - int len = RTA_LENGTH(dlen); - int alen = NLMSG_ALIGN(n->nlmsg_len); - struct rtattr *rta = (struct rtattr *)(((void *)n) + alen); - if (alen + len > nsize) - return -1; - rta->rta_len = len; - rta->rta_type = type; - memcpy(RTA_DATA(rta), d, dlen); - n->nlmsg_len = alen + len; - return 0; -} -#endif - -static int netdev_sifflags(const char *devname, int flags) -{ - struct ifreq ifr; - int fd; - - memset(&ifr, '\0', sizeof(ifr)); - ifr.ifr_flags = flags; - strncpy(ifr.ifr_name, devname, IFNAMSIZ); - ifr.ifr_name[IFNAMSIZ - 1] = 0; /* Make sure to terminate */ - if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { - SYS_ERR(DTUN, LOGL_ERROR, errno, "socket() failed"); - return -1; - } - if (ioctl(fd, SIOCSIFFLAGS, &ifr)) { - SYS_ERR(DTUN, LOGL_ERROR, errno, - "ioctl(SIOCSIFFLAGS) failed"); - close(fd); - return -1; - } - close(fd); - return 0; -} - -int netdev_setaddr4(const char *devname, struct in_addr *addr, - struct in_addr *dstaddr, struct in_addr *netmask) -{ - struct ifreq ifr; - int fd; - - memset(&ifr, '\0', sizeof(ifr)); - ifr.ifr_addr.sa_family = AF_INET; - ifr.ifr_dstaddr.sa_family = AF_INET; - -#if defined(__linux__) - ifr.ifr_netmask.sa_family = AF_INET; -#elif defined(__FreeBSD__) || defined (__APPLE__) - ((struct sockaddr_in *)&ifr.ifr_addr)->sin_len = - sizeof(struct sockaddr_in); - ((struct sockaddr_in *)&ifr.ifr_dstaddr)->sin_len = - sizeof(struct sockaddr_in); -#endif - - strncpy(ifr.ifr_name, devname, IFNAMSIZ); - ifr.ifr_name[IFNAMSIZ - 1] = 0; /* Make sure to terminate */ - - /* Create a channel to the NET kernel. */ - if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { - SYS_ERR(DTUN, LOGL_ERROR, errno, "socket() failed"); - return -1; - } - - if (addr) { /* Set the interface address */ - memcpy(&((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr, addr, - sizeof(*addr)); - if (ioctl(fd, SIOCSIFADDR, (void *)&ifr) < 0) { - if (errno != EEXIST) { - SYS_ERR(DTUN, LOGL_ERROR, errno, - "ioctl(SIOCSIFADDR) failed"); - } else { - SYS_ERR(DTUN, LOGL_NOTICE, errno, - "ioctl(SIOCSIFADDR): Address already exists"); - } - close(fd); - return -1; - } - } - - if (dstaddr) { /* Set the destination address */ - memcpy(&((struct sockaddr_in *)&ifr.ifr_dstaddr)->sin_addr, - dstaddr, sizeof(*dstaddr)); - if (ioctl(fd, SIOCSIFDSTADDR, (caddr_t) & ifr) < 0) { - SYS_ERR(DTUN, LOGL_ERROR, errno, - "ioctl(SIOCSIFDSTADDR) failed"); - close(fd); - return -1; - } - } - - if (netmask) { /* Set the netmask */ -#if defined(__linux__) - memcpy(&((struct sockaddr_in *)&ifr.ifr_netmask)->sin_addr, - netmask, sizeof(*netmask)); -#elif defined(__FreeBSD__) || defined (__APPLE__) - ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr.s_addr = - netmask->s_addr; -#endif - - if (ioctl(fd, SIOCSIFNETMASK, (void *)&ifr) < 0) { - SYS_ERR(DTUN, LOGL_ERROR, errno, - "ioctl(SIOCSIFNETMASK) failed"); - close(fd); - return -1; - } - } - - close(fd); - - netdev_sifflags(devname, IFF_UP | IFF_RUNNING); - - /* On linux the route to the interface is set automatically - on FreeBSD we have to do this manually */ -#if defined(__FreeBSD__) || defined (__APPLE__) - netdev_addroute4(dstaddr, addr, &this->netmask); -#endif - - return 0; -} - -int netdev_setaddr6(const char *devname, struct in6_addr *addr, struct in6_addr *dstaddr, - size_t prefixlen) -{ - struct in6_ifreq ifr; - int fd; - - memset(&ifr, 0, sizeof(ifr)); - -#if defined(__linux__) - ifr.ifr6_prefixlen = prefixlen; - ifr.ifr6_ifindex = if_nametoindex(devname); - if (ifr.ifr6_ifindex == 0) { - SYS_ERR(DTUN, LOGL_ERROR, 0, "Error getting ifindex for %s\n", devname); - return -1; - } -#elif defined(__FreeBSD__) || defined (__APPLE__) - strncpy(ifr.ifr_name, devname, IFNAMSIZ); -#endif - - /* Create a channel to the NET kernel */ - if ((fd = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) { - SYS_ERR(DTUN, LOGL_ERROR, 0, "socket() failed"); - return -1; - } - -#if defined(__linux__) - if (addr) { - memcpy(&ifr.ifr6_addr, addr, sizeof(*addr)); - if (ioctl(fd, SIOCSIFADDR, (void *) &ifr) < 0) { - if (errno != EEXIST) { - SYS_ERR(DTUN, LOGL_ERROR, 0, "ioctl(SIOCSIFADDR) failed"); - } else { - SYS_ERR(DTUN, LOGL_NOTICE, 0, "ioctl(SIOCSIFADDR): Address already exists"); - } - close(fd); - return -1; - } - } - -#if 0 - /* FIXME: looks like this is not possible/necessary for IPv6? */ - if (dstaddr) { - memcpy(&ifr.ifr6_addr, dstaddr, sizeof(*dstaddr)); - if (ioctl(fd, SIOCSIFDSTADDR, (caddr_t *) &ifr) < 0) { - SYS_ERR(DTUN, LOGL_ERROR, "ioctl(SIOCSIFDSTADDR) failed"); - close(fd); - return -1; - } - } -#endif - -#elif defined(__FreeBSD__) || defined (__APPLE__) - if (addr) - memcpy(&ifr.ifr_ifru.ifru_addr, addr, sizeof(ifr.ifr_ifru.ifru_addr)); - if (dstaddr) - memcpy(&ifr.ifr_ifru.ifru_dstaddr, dstaddr, sizeof(ifr.ifr_ifru.ifru_dstaddr)); - - if (ioctl(fd, SIOCSIFADDR_IN6, (struct ifreq *)&ifr) < 0) { - SYS_ERR(DTUN, LOGL_ERROR, 0, "ioctl(SIOCSIFADDR_IN6) failed"); - close(fd); - return -1; - } -#endif - - close(fd); - - netdev_sifflags(devname, IFF_UP | IFF_RUNNING); - - /* On linux the route to the interface is set automatically - on FreeBSD we have to do this manually */ -#if 0 /* FIXME */ -//#if defined(__FreeBSD__) || defined (__APPLE__) - netdev_addroute6(dstaddr, addr, prefixlen); -#endif - - return 0; -} - -int netdev_addaddr4(const char *devname, struct in_addr *addr, - struct in_addr *dstaddr, struct in_addr *netmask) -{ - int fd; -#if defined(__linux__) - struct { - struct nlmsghdr n; - struct ifaddrmsg i; - char buf[TUN_NLBUFSIZE]; - } req; - - struct sockaddr_nl local; - socklen_t addr_len; - int status; - - struct sockaddr_nl nladdr; - struct iovec iov; - struct msghdr msg; - - memset(&req, 0, sizeof(req)); - req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifaddrmsg)); - req.n.nlmsg_flags = NLM_F_REQUEST | NLM_F_CREATE; - req.n.nlmsg_type = RTM_NEWADDR; - req.i.ifa_family = AF_INET; - req.i.ifa_prefixlen = 32; /* 32 FOR IPv4 */ - req.i.ifa_flags = 0; - req.i.ifa_scope = RT_SCOPE_HOST; /* TODO or 0 */ - req.i.ifa_index = if_nametoindex(devname); - if (!req.i.ifa_index) { - SYS_ERR(DTUN, LOGL_ERROR, errno, "Unable to get ifindex for %s", devname); - return -1; - } - - netdev_nlattr(&req.n, sizeof(req), IFA_ADDRESS, addr, sizeof(*addr)); - if (dstaddr) - netdev_nlattr(&req.n, sizeof(req), IFA_LOCAL, dstaddr, sizeof(*dstaddr)); - - if ((fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE)) < 0) { - SYS_ERR(DTUN, LOGL_ERROR, errno, "socket() failed"); - return -1; - } - - memset(&local, 0, sizeof(local)); - local.nl_family = AF_NETLINK; - local.nl_groups = 0; - - if (bind(fd, (struct sockaddr *)&local, sizeof(local)) < 0) { - SYS_ERR(DTUN, LOGL_ERROR, errno, "bind() failed"); - close(fd); - return -1; - } - - addr_len = sizeof(local); - if (getsockname(fd, (struct sockaddr *)&local, &addr_len) < 0) { - SYS_ERR(DTUN, LOGL_ERROR, errno, - "getsockname() failed"); - close(fd); - return -1; - } - - if (addr_len != sizeof(local)) { - SYS_ERR(DTUN, LOGL_ERROR, 0, - "Wrong address length %d", addr_len); - close(fd); - return -1; - } - - if (local.nl_family != AF_NETLINK) { - SYS_ERR(DTUN, LOGL_ERROR, 0, - "Wrong address family %d", local.nl_family); - close(fd); - return -1; - } - - iov.iov_base = (void *)&req.n; - iov.iov_len = req.n.nlmsg_len; - - msg.msg_name = (void *)&nladdr; - msg.msg_namelen = sizeof(nladdr); - msg.msg_iov = &iov; - msg.msg_iovlen = 1; - msg.msg_control = NULL; - msg.msg_controllen = 0; - msg.msg_flags = 0; - - memset(&nladdr, 0, sizeof(nladdr)); - nladdr.nl_family = AF_NETLINK; - nladdr.nl_pid = 0; - nladdr.nl_groups = 0; - - req.n.nlmsg_seq = 0; - req.n.nlmsg_flags |= NLM_F_ACK; - - status = sendmsg(fd, &msg, 0); - if (status != req.n.nlmsg_len) { - SYS_ERR(DTUN, LOGL_ERROR, errno, "sendmsg() failed, returned %d", status); - close(fd); - return -1; - } - - status = netdev_sifflags(devname, IFF_UP | IFF_RUNNING); - if (status == -1) { - close(fd); - return -1; - } -#elif defined (__FreeBSD__) || defined (__APPLE__) - struct ifaliasreq areq; - - memset(&areq, 0, sizeof(areq)); - - /* Set up interface name */ - strncpy(areq.ifra_name, devname, IFNAMSIZ); - areq.ifra_name[IFNAMSIZ - 1] = 0; /* Make sure to terminate */ - - ((struct sockaddr_in *)&areq.ifra_addr)->sin_family = AF_INET; - ((struct sockaddr_in *)&areq.ifra_addr)->sin_len = - sizeof(areq.ifra_addr); - ((struct sockaddr_in *)&areq.ifra_addr)->sin_addr.s_addr = addr->s_addr; - - ((struct sockaddr_in *)&areq.ifra_mask)->sin_family = AF_INET; - ((struct sockaddr_in *)&areq.ifra_mask)->sin_len = - sizeof(areq.ifra_mask); - ((struct sockaddr_in *)&areq.ifra_mask)->sin_addr.s_addr = - netmask->s_addr; - - /* For some reason FreeBSD uses ifra_broadcast for specifying dstaddr */ - ((struct sockaddr_in *)&areq.ifra_broadaddr)->sin_family = AF_INET; - ((struct sockaddr_in *)&areq.ifra_broadaddr)->sin_len = - sizeof(areq.ifra_broadaddr); - ((struct sockaddr_in *)&areq.ifra_broadaddr)->sin_addr.s_addr = - dstaddr->s_addr; - - /* Create a channel to the NET kernel. */ - if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { - SYS_ERR(DTUN, LOGL_ERROR, errno, "socket() failed"); - return -1; - } - - if (ioctl(fd, SIOCAIFADDR, (void *)&areq) < 0) { - SYS_ERR(DTUN, LOGL_ERROR, errno, - "ioctl(SIOCAIFADDR) failed"); - close(fd); - return -1; - } -#endif - close(fd); - return 0; -} - -int netdev_addaddr6(const char *devname, struct in6_addr *addr, - struct in6_addr *dstaddr, int prefixlen) -{ - int fd; -#if defined(__linux__) - struct { - struct nlmsghdr n; - struct ifaddrmsg i; - char buf[TUN_NLBUFSIZE]; - } req; - - struct sockaddr_nl local; - socklen_t addr_len; - int status; - - struct sockaddr_nl nladdr; - struct iovec iov; - struct msghdr msg; - - memset(&req, 0, sizeof(req)); - req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifaddrmsg)); - req.n.nlmsg_flags = NLM_F_REQUEST | NLM_F_CREATE; - req.n.nlmsg_type = RTM_NEWADDR; - req.i.ifa_family = AF_INET6; - req.i.ifa_prefixlen = prefixlen; /* 64 FOR IPv6 */ - req.i.ifa_flags = 0; - req.i.ifa_scope = RT_SCOPE_HOST; /* TODO or 0 */ - req.i.ifa_index = if_nametoindex(devname); - if (!req.i.ifa_index) { - SYS_ERR(DTUN, LOGL_ERROR, errno, "Unable to get ifindex for %s", devname); - return -1; - } - - netdev_nlattr(&req.n, sizeof(req), IFA_ADDRESS, addr, sizeof(*addr)); - if (dstaddr) - netdev_nlattr(&req.n, sizeof(req), IFA_LOCAL, dstaddr, sizeof(*dstaddr)); - - if ((fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE)) < 0) { - SYS_ERR(DTUN, LOGL_ERROR, errno, "socket() failed"); - return -1; - } - - memset(&local, 0, sizeof(local)); - local.nl_family = AF_NETLINK; - local.nl_groups = 0; - - if (bind(fd, (struct sockaddr *)&local, sizeof(local)) < 0) { - SYS_ERR(DTUN, LOGL_ERROR, errno, "bind() failed"); - close(fd); - return -1; - } - - addr_len = sizeof(local); - if (getsockname(fd, (struct sockaddr *)&local, &addr_len) < 0) { - SYS_ERR(DTUN, LOGL_ERROR, errno, - "getsockname() failed"); - close(fd); - return -1; - } - - if (addr_len != sizeof(local)) { - SYS_ERR(DTUN, LOGL_ERROR, 0, - "Wrong address length %d", addr_len); - close(fd); - return -1; - } - - if (local.nl_family != AF_NETLINK) { - SYS_ERR(DTUN, LOGL_ERROR, 0, - "Wrong address family %d", local.nl_family); - close(fd); - return -1; - } - - iov.iov_base = (void *)&req.n; - iov.iov_len = req.n.nlmsg_len; - - msg.msg_name = (void *)&nladdr; - msg.msg_namelen = sizeof(nladdr); - msg.msg_iov = &iov; - msg.msg_iovlen = 1; - msg.msg_control = NULL; - msg.msg_controllen = 0; - msg.msg_flags = 0; - - memset(&nladdr, 0, sizeof(nladdr)); - nladdr.nl_family = AF_NETLINK; - nladdr.nl_pid = 0; - nladdr.nl_groups = 0; - - req.n.nlmsg_seq = 0; - req.n.nlmsg_flags |= NLM_F_ACK; - - status = sendmsg(fd, &msg, 0); - if (status != req.n.nlmsg_len) { - SYS_ERR(DTUN, LOGL_ERROR, errno, "sendmsg() failed, returned %d", status); - close(fd); - return -1; - } - - status = netdev_sifflags(devname, IFF_UP | IFF_RUNNING); - if (status == -1) { - close(fd); - return -1; - } -#elif defined (__FreeBSD__) || defined (__APPLE__) - struct ifaliasreq areq; - - memset(&areq, 0, sizeof(areq)); - - /* Set up interface name */ - strncpy(areq.ifra_name, devname, IFNAMSIZ); - areq.ifra_name[IFNAMSIZ - 1] = 0; /* Make sure to terminate */ - - ((struct sockaddr_in6 *)&areq.ifra_addr)->sin6_family = AF_INET6; - ((struct sockaddr_in6 *)&areq.ifra_addr)->sin6_len = sizeof(areq.ifra_addr); - ((struct sockaddr_in6 *)&areq.ifra_addr)->sin6_addr.s6_addr = addr->s6_addr; - - ((struct sockaddr_in6 *)&areq.ifra_mask)->sin6_family = AF_INET6; - ((struct sockaddr_in6 *)&areq.ifra_mask)->sin6_len = sizeof(areq.ifra_mask); - ((struct sockaddr_in6 *)&areq.ifra_mask)->sin6_addr.s6_addr = netmask->s6_addr; - - /* For some reason FreeBSD uses ifra_broadcast for specifying dstaddr */ - ((struct sockaddr_in6 *)&areq.ifra_broadaddr)->sin6_family = AF_INET6; - ((struct sockaddr_in6 *)&areq.ifra_broadaddr)->sin6_len = sizeof(areq.ifra_broadaddr); - ((struct sockaddr_in6 *)&areq.ifra_broadaddr)->sin6_addr.s6_addr = dstaddr->s6_addr; - - /* Create a channel to the NET kernel. */ - if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { - SYS_ERR(DTUN, LOGL_ERROR, errno, "socket() failed"); - return -1; - } - - if (ioctl(fd, SIOCAIFADDR, (void *)&areq) < 0) { - SYS_ERR(DTUN, LOGL_ERROR, errno, - "ioctl(SIOCAIFADDR) failed"); - close(fd); - return -1; - } -#endif - close(fd); - return 0; -} - static int netdev_route4(struct in_addr *dst, struct in_addr *gateway, struct in_addr *mask, int delete) { int fd; diff --git a/lib/netdev.h b/lib/netdev.h index 1bce814..2e8e77b 100644 --- a/lib/netdev.h +++ b/lib/netdev.h @@ -53,18 +53,6 @@ }; #endif /* !HAVE_IPHDR */ -extern int netdev_setaddr4(const char *devname, struct in_addr *addr, - struct in_addr *dstaddr, struct in_addr *netmask); - -extern int netdev_setaddr6(const char *devname, struct in6_addr *addr, struct in6_addr *dstaddr, - size_t prefixlen); - -extern int netdev_addaddr4(const char *devname, struct in_addr *addr, - struct in_addr *dstaddr, struct in_addr *netmask); - -extern int netdev_addaddr6(const char *devname, struct in6_addr *addr, - struct in6_addr *dstaddr, int prefixlen); - extern int netdev_addroute4(struct in_addr *dst, struct in_addr *gateway, struct in_addr *mask); extern int netdev_delroute4(struct in_addr *dst, struct in_addr *gateway, struct in_addr *mask); extern int netdev_addroute6(struct in6_addr *dst, struct in6_addr *gateway, int prefixlen, const char *gw_iface); diff --git a/lib/tun.c b/lib/tun.c index acc3927..055c4fc 100644 --- a/lib/tun.c +++ b/lib/tun.c @@ -49,99 +49,38 @@ #include "syserr.h" #include "gtp-kernel.h" -static int tun_setaddr4(struct tun_t *this, struct in_addr *addr, - struct in_addr *dstaddr, struct in_addr *netmask) +int tun_addaddr(struct tun_t *this, struct in46_addr *addr, size_t prefixlen) { + struct osmo_sockaddr osa = {0}; int rc; - rc = netdev_setaddr4(this->devname, addr, dstaddr, netmask); - if (rc < 0) - return rc; + OSMO_ASSERT(this->netdev); + OSMO_ASSERT(addr); - if (addr) { - this->addr.len = sizeof(struct in_addr); - this->addr.v4.s_addr = addr->s_addr; - } - if (dstaddr) { - this->dstaddr.len = sizeof(struct in_addr); - this->dstaddr.v4.s_addr = dstaddr->s_addr; - } - if (netmask) - this->netmask.s_addr = netmask->s_addr; - this->addrs++; -#if defined(__FreeBSD__) || defined (__APPLE__) - this->routes = 1; -#endif - - return rc; -} - -static int tun_setaddr6(struct tun_t *this, struct in6_addr *addr, struct in6_addr *dstaddr, - size_t prefixlen) -{ - int rc; - rc = netdev_setaddr6(this->devname, addr, dstaddr, prefixlen); - if (rc < 0) - return rc; - if (dstaddr) { - this->dstaddr.len = sizeof(*dstaddr); - memcpy(&this->dstaddr.v6, dstaddr, sizeof(*dstaddr)); - } - this->addrs++; -#if defined(__FreeBSD__) || defined (__APPLE__) - this->routes = 1; -#endif - - return rc; -} - -static int tun_addaddr4(struct tun_t *this, struct in_addr *addr, - struct in_addr *dstaddr, struct in_addr *netmask) -{ - int rc; - - /* TODO: Is this needed on FreeBSD? */ - if (!this->addrs) /* Use ioctl for first addr to make ping work */ - return tun_setaddr4(this, addr, dstaddr, netmask); /* TODO dstaddr */ - - rc = netdev_addaddr4(this->devname, addr, dstaddr, netmask); - if (rc < 0) - return rc; - - this->addrs++; - - return rc; -} - -static int tun_addaddr6(struct tun_t *this, - struct in6_addr *addr, - struct in6_addr *dstaddr, int prefixlen) -{ - int rc; - - if (!this->addrs) /* Use ioctl for first addr to make ping work */ - return tun_setaddr6(this, addr, dstaddr, prefixlen); - - rc = netdev_addaddr6(this->devname, addr, dstaddr, prefixlen); - if (rc < 0) - return rc; - - this->addrs++; - - return rc; -} - -int tun_addaddr(struct tun_t *this, struct in46_addr *addr, struct in46_addr *dstaddr, size_t prefixlen) -{ - struct in_addr netmask; switch (addr->len) { case 4: - netmask.s_addr = htonl(0xffffffff << (32 - prefixlen)); - return tun_addaddr4(this, &addr->v4, dstaddr ? &dstaddr->v4 : NULL, &netmask); + osa.u.sin.sin_family = AF_INET; + memcpy(&osa.u.sin.sin_addr, &addr->v4, sizeof(struct in_addr)); + /* Store first IPv4 IP address to be used in ipup script: */ + if (this->addrs == 0) { + this->addr.len = sizeof(struct in_addr); + this->addr.v4.s_addr = addr->v4.s_addr; + this->netmask.s_addr = htonl(0xffffffff << (32 - prefixlen)); + } + break; case 16: - return tun_addaddr6(this, &addr->v6, dstaddr ? &dstaddr->v6 : NULL, prefixlen); + osa.u.sin.sin_family = AF_INET6; + memcpy(&osa.u.sin6.sin6_addr, &addr->v6, sizeof(struct in6_addr)); + break; default: return -1; } + + rc = osmo_netdev_add_addr(this->netdev, &osa, prefixlen); + if (rc < 0) + return rc; + + this->addrs++; + return rc; } static int tun_tundev_data_ind_cb(struct osmo_tundev *tundev, struct msgb *msg) @@ -168,7 +107,6 @@ t->cb_ind = NULL; t->addrs = 0; - t->routes = 0; t->fd = -1; if (!use_kernel) { @@ -235,11 +173,6 @@ int tun_free(struct tun_t *tun) { - - if (tun->routes) { - netdev_delroute4(&tun->dstaddr.v4, &tun->addr.v4, &tun->netmask); - } - if (tun->tundev) { if (osmo_tundev_close(tun->tundev) < 0) { SYS_ERR(DTUN, LOGL_ERROR, errno, "close() failed"); diff --git a/lib/tun.h b/lib/tun.h index 8a3a2d4..544e56a 100644 --- a/lib/tun.h +++ b/lib/tun.h @@ -37,10 +37,8 @@ struct osmo_netdev *netdev; int fd; /* File descriptor to tun interface */ struct in46_addr addr; - struct in46_addr dstaddr; struct in_addr netmask; int addrs; /* Number of allocated IP addresses */ - int routes; /* One if we allocated an automatic route */ char devname[IFNAMSIZ]; /* Name of the tun device */ int (*cb_ind) (struct tun_t * tun, void *pack, unsigned len); /* to be used by libgtp callers/users (to attach their own private state) */ @@ -52,8 +50,7 @@ extern int tun_decaps(struct tun_t *this); extern int tun_encaps(struct tun_t *tun, void *pack, unsigned len); -extern int tun_addaddr(struct tun_t *this, struct in46_addr *addr, - struct in46_addr *dstaddr, size_t prefixlen); +extern int tun_addaddr(struct tun_t *this, struct in46_addr *addr, size_t prefixlen); extern int tun_set_cb_ind(struct tun_t *this, int (*cb_ind) (struct tun_t * tun, void *pack, diff --git a/sgsnemu/sgsnemu.c b/sgsnemu/sgsnemu.c index d6d87b7..9ab0f25 100644 --- a/sgsnemu/sgsnemu.c +++ b/sgsnemu/sgsnemu.c @@ -1649,7 +1649,7 @@ if (addr[i].len == 16) prefixlen = 64; /* printf("Setting up interface and routing\n"); */ - tun_addaddr(tun, &addr[i], NULL, prefixlen); + tun_addaddr(tun, &addr[i], prefixlen); if (options.defaultroute) { if (in46a_is_v4(&addr[i])) { struct in_addr rm; @@ -1786,7 +1786,7 @@ } } #endif - rc = tun_addaddr(tun, &addr, NULL, opt_prefix->prefix_len); + rc = tun_addaddr(tun, &addr, opt_prefix->prefix_len); if (rc < 0) { SYS_ERR(DSGSN, LOGL_ERROR, 0, "Failed to add addr %s to tun %s", in46a_ntoa(&addr), tun->devname); @@ -1936,7 +1936,7 @@ } if ((options.createif) && (options.netaddr.len)) { - tun_addaddr(tun, &options.netaddr, NULL, options.prefixlen); + tun_addaddr(tun, &options.netaddr, options.prefixlen); if (options.defaultroute) { if (in46a_is_v4(&options.netaddr)) { struct in_addr rm; -- To view, visit https://gerrit.osmocom.org/c/osmo-ggsn/+/38483?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email Gerrit-MessageType: newchange Gerrit-Project: osmo-ggsn Gerrit-Branch: master Gerrit-Change-Id: I1fccfd658542481cd61536fbd3c7a3a32a1c253b Gerrit-Change-Number: 38483 Gerrit-PatchSet: 1 Gerrit-Owner: pespin <pespin(a)sysmocom.de>
1 0
0 0
[M] Change in libosmocore[master]: core/netdev: Add API osmo_netdev_set_mtu()
by pespin 21 Oct '24

21 Oct '24
pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmocore/+/38481?usp=email ) Change subject: core/netdev: Add API osmo_netdev_set_mtu() ...................................................................... core/netdev: Add API osmo_netdev_set_mtu() This API will be used by osmo-ggsn to set the MTU of the tun device created to handle an APN. Related: OS#6298 Related: SYS#7122 Change-Id: I705d71813090f8af5a578d2a1f5920fece03bc5f --- M TODO-RELEASE M include/osmocom/core/netdev.h M src/core/libosmocore.map M src/core/netdev.c 4 files changed, 67 insertions(+), 2 deletions(-) git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/81/38481/1 diff --git a/TODO-RELEASE b/TODO-RELEASE index b3e4742..80387fa 100644 --- a/TODO-RELEASE +++ b/TODO-RELEASE @@ -9,4 +9,5 @@ #library what description / commit summary line gb ADD add bssgp_parse_cell_id2/bssgp_create_cell_id2 gsm ADD add osmo_rai_to_gprs/gprs_rai_to_osmo -core ADD add API osmo_tundev_get_fd() \ No newline at end of file +core ADD add API osmo_tundev_get_fd() +core ADD add API osmo_netdev_set_mtu() \ No newline at end of file diff --git a/include/osmocom/core/netdev.h b/include/osmocom/core/netdev.h index 3238ec3..fb0f124 100644 --- a/include/osmocom/core/netdev.h +++ b/include/osmocom/core/netdev.h @@ -36,6 +36,8 @@ int osmo_netdev_set_netns_name(struct osmo_netdev *netdev, const char *netns); const char *osmo_netdev_get_netns_name(const struct osmo_netdev *netdev); +int osmo_netdev_set_mtu(struct osmo_netdev *netdev, uint32_t mtu); + void osmo_netdev_set_ifupdown_ind_cb(struct osmo_netdev *netdev, osmo_netdev_ifupdown_ind_cb_t ifupdown_ind_cb); void osmo_netdev_set_dev_name_chg_cb(struct osmo_netdev *netdev, osmo_netdev_dev_name_chg_cb_t dev_name_chg_cb); void osmo_netdev_set_mtu_chg_cb(struct osmo_netdev *netdev, osmo_netdev_mtu_chg_cb_t mtu_chg_cb); diff --git a/src/core/libosmocore.map b/src/core/libosmocore.map index c48a2b9..cd5dc94 100644 --- a/src/core/libosmocore.map +++ b/src/core/libosmocore.map @@ -321,6 +321,7 @@ osmo_netdev_set_dev_name_chg_cb; osmo_netdev_set_ifindex; osmo_netdev_set_ifupdown_ind_cb; +osmo_netdev_set_mtu; osmo_netdev_set_mtu_chg_cb; osmo_netdev_set_netns_name; osmo_netdev_set_priv_data; diff --git a/src/core/netdev.c b/src/core/netdev.c index 7ef7657..8e7fc28 100644 --- a/src/core/netdev.c +++ b/src/core/netdev.c @@ -68,7 +68,7 @@ #include <stdio.h> #include <stdlib.h> -#include <stdio.h> +#include <inttypes.h> #include <fcntl.h> #include <unistd.h> #include <errno.h> @@ -531,6 +531,35 @@ return 0; } +static int netdev_mnl_set_mtu(struct osmo_mnl *omnl, unsigned int if_index, + const char *dev_name, uint32_t mtu) +{ + char buf[MNL_SOCKET_BUFFER_SIZE]; + struct nlmsghdr *nlh = mnl_nlmsg_put_header(buf); + struct ifinfomsg *ifm; + unsigned int change = 0; + unsigned int flags = 0; + + nlh->nlmsg_type = RTM_NEWLINK; + nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK; + nlh->nlmsg_seq = time(NULL); + + ifm = mnl_nlmsg_put_extra_header(nlh, sizeof(*ifm)); + ifm->ifi_family = AF_UNSPEC; + ifm->ifi_change = change; + ifm->ifi_flags = flags; + ifm->ifi_index = if_index; + + mnl_attr_put_u32(nlh, IFLA_MTU, mtu); + + if (mnl_socket_sendto(omnl->mnls, nlh, nlh->nlmsg_len) < 0) { + LOGP(DLGLOBAL, LOGL_ERROR, "mnl_socket_sendto\n"); + return -EIO; + } + + return 0; +} + static int netdev_mnl_add_addr(struct osmo_mnl *omnl, unsigned int if_index, const struct osmo_sockaddr *osa, uint8_t prefix) { char buf[MNL_SOCKET_BUFFER_SIZE]; @@ -857,6 +886,38 @@ return netdev->dev_name; } +/*! Set the MTU of the network interface + * \param[in] netdev The netdev object where the field is set + * \param[in] mtu The MTU to be set on the network interface + * \returns 0 on success; negative on error + * + */ +int osmo_netdev_set_mtu(struct osmo_netdev *netdev, uint32_t mtu) +{ + struct osmo_netns_switch_state switch_state; + int rc; + + if (!netdev->registered) + return -ENODEV; + + LOGNETDEV(netdev, LOGL_NOTICE, "Setting dev %s MTU %" PRIu32 "\n", + netdev->dev_name, mtu); + + NETDEV_NETNS_ENTER(netdev, &switch_state, "set_mtu"); + +#if ENABLE_LIBMNL + rc = netdev_mnl_set_mtu(netdev->netns_ctx->omnl, netdev->ifindex, + netdev->dev_name, mtu); +#else + LOGNETDEV(netdev, LOGL_ERROR, "%s: NOT SUPPORTED. Build libosmocore with --enable-libmnl.\n", __func__); + rc = -ENOTSUP; +#endif + + NETDEV_NETNS_EXIT(netdev, &switch_state, "set_mtu"); + + return rc; +} + /*! Bring netdev interface UP or DOWN. * \param[in] netdev The netdev object managing the netdev interface * \param[in] ifupdown true to set the interface UP, false to set it DOWN -- To view, visit https://gerrit.osmocom.org/c/libosmocore/+/38481?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email Gerrit-MessageType: newchange Gerrit-Project: libosmocore Gerrit-Branch: master Gerrit-Change-Id: I705d71813090f8af5a578d2a1f5920fece03bc5f Gerrit-Change-Number: 38481 Gerrit-PatchSet: 1 Gerrit-Owner: pespin <pespin(a)sysmocom.de>
1 0
0 0
[S] Change in osmo-sgsn[master]: GTP: CreatePDPContext: only use IMEISV IE when IMEISV is known
by pespin 21 Oct '24

21 Oct '24
Attention is currently required from: laforge, lynxis lazus. pespin has posted comments on this change by lynxis lazus. ( https://gerrit.osmocom.org/c/osmo-sgsn/+/38444?usp=email ) Change subject: GTP: CreatePDPContext: only use IMEISV IE when IMEISV is known ...................................................................... Patch Set 2: (1 comment) Patchset: PS2: +1 when build passes ;) -- To view, visit https://gerrit.osmocom.org/c/osmo-sgsn/+/38444?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email Gerrit-MessageType: comment Gerrit-Project: osmo-sgsn Gerrit-Branch: master Gerrit-Change-Id: I812af1e702e77214244f32ae65663c1a03b23962 Gerrit-Change-Number: 38444 Gerrit-PatchSet: 2 Gerrit-Owner: lynxis lazus <lynxis(a)fe80.eu> Gerrit-Reviewer: Jenkins Builder Gerrit-CC: laforge <laforge(a)osmocom.org> Gerrit-CC: pespin <pespin(a)sysmocom.de> Gerrit-Attention: laforge <laforge(a)osmocom.org> Gerrit-Attention: lynxis lazus <lynxis(a)fe80.eu> Gerrit-Comment-Date: Mon, 21 Oct 2024 15:35:20 +0000 Gerrit-HasComments: Yes Gerrit-Has-Labels: No
1 0
0 0
[M] Change in osmo-ggsn[master]: ggsn: Support announcing APN MTU over PCO
by pespin 21 Oct '24

21 Oct '24
Attention is currently required from: fixeria, laforge, lynxis lazus. pespin has posted comments on this change by pespin. ( https://gerrit.osmocom.org/c/osmo-ggsn/+/38457?usp=email ) Change subject: ggsn: Support announcing APN MTU over PCO ...................................................................... Patch Set 4: (1 comment) File ggsn/ggsn.h: https://gerrit.osmocom.org/c/osmo-ggsn/+/38457/comment/24e82802_54211cc8?us… : PS4, Line 24: /* > Annex C is "informative" not "normative", and it explains it's talking about situation "when some o […] Fine, I'll update the the max allowed MTU, but I think we all agree it's good to keep the "default" one to some value around the value I'm already setting in here. -- To view, visit https://gerrit.osmocom.org/c/osmo-ggsn/+/38457?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email Gerrit-MessageType: comment Gerrit-Project: osmo-ggsn Gerrit-Branch: master Gerrit-Change-Id: I8532acfffadda9e83962b30e4f6b17eb8b3362ac Gerrit-Change-Number: 38457 Gerrit-PatchSet: 4 Gerrit-Owner: pespin <pespin(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: laforge <laforge(a)osmocom.org> Gerrit-Reviewer: lynxis lazus <lynxis(a)fe80.eu> Gerrit-Reviewer: osmith <osmith(a)sysmocom.de> Gerrit-Attention: laforge <laforge(a)osmocom.org> Gerrit-Attention: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Attention: lynxis lazus <lynxis(a)fe80.eu> Gerrit-Comment-Date: Mon, 21 Oct 2024 15:34:47 +0000 Gerrit-HasComments: Yes Gerrit-Has-Labels: No Comment-In-Reply-To: laforge <laforge(a)osmocom.org>
1 0
0 0
  • ← Newer
  • 1
  • ...
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • ...
  • 164
  • Older →

HyperKitty Powered by HyperKitty version 1.3.12.