This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
lynxis lazus gerrit-no-reply at lists.osmocom.orglynxis lazus has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmocore/+/21752 ) Change subject: gprs_ns2: fr: setup the device to correct FR/LMI settings ...................................................................... gprs_ns2: fr: setup the device to correct FR/LMI settings A hdlc can be used in different modes. Also a FR device can be used with lmi and certain settings as without it. ns2 will use FR with no lmi in the kernel. Change-Id: I04786d2b864860b08c2e1afdb199470f4b80cc3b --- M src/gb/gprs_ns2_fr.c 1 file changed, 110 insertions(+), 4 deletions(-) git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/52/21752/1 diff --git a/src/gb/gprs_ns2_fr.c b/src/gb/gprs_ns2_fr.c index 6aa687c..b5c096f 100644 --- a/src/gb/gprs_ns2_fr.c +++ b/src/gb/gprs_ns2_fr.c @@ -36,12 +36,14 @@ #include <netinet/ip.h> #include <netinet/ip6.h> #include <arpa/inet.h> -#include <net/if.h> +#include <linux/if.h> #include <sys/ioctl.h> #include <netpacket/packet.h> #include <linux/if_ether.h> #include <linux/hdlc.h> +#include <linux/hdlc/ioctl.h> +#include <linux/sockios.h> #include <osmocom/gprs/frame_relay.h> #include <osmocom/core/byteswap.h> @@ -84,7 +86,7 @@ }; struct priv_bind { - char netif[IF_NAMESIZE]; + char netif[IFNAMSIZ]; struct osmo_fr_link *link; struct osmo_wqueue wqueue; int ifindex; @@ -434,6 +436,102 @@ } #endif /* LIBMNL */ +int set_ifupdown(const char *netif, bool up) +{ + int sock, rc; + struct ifreq req; + + sock = socket(AF_INET, SOCK_DGRAM, 0); + if (sock < 0) + return sock; + + memset(&req, 0, sizeof req); + strncpy(req.ifr_name, netif, IFNAMSIZ); + + if (up) + req.ifr_flags |= IFF_UP; + + rc = ioctl(sock, SIOCSIFFLAGS, &req); + close(sock); + return rc; +} + +int setup_device(const char *netif) +{ + int sock, rc; + char buffer[128]; + fr_proto *fr = (void*)buffer; + struct ifreq req; + + sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); + if (sock < 0) { + LOGP(DLNS, LOGL_ERROR, "%s: Unable to create socket: %s\n", + netif, strerror(errno)); + return sock; + } + + memset(&req, 0, sizeof(struct ifreq)); + memset(&buffer, 0, sizeof(buffer)); + strncpy(req.ifr_name, netif, IFNAMSIZ); + req.ifr_settings.ifs_ifsu.sync = (void*)buffer; + req.ifr_settings.size = sizeof(buffer); + req.ifr_settings.type = IF_GET_PROTO; + + rc = ioctl(sock, SIOCWANDEV, &req); + if (rc < 0) { + LOGP(DLNS, LOGL_ERROR, "%s: Unable to get FR protocol information: %s\n", + netif, strerror(errno)); + goto err; + } + + /* check if the device is good */ + if (req.ifr_settings.type != IF_PROTO_FR && fr->lmi != LMI_NONE) { + LOGP(DLNS, LOGL_INFO, "%s: has correct frame relay mode and lmi\n", netif); + goto ifup; + } + + /* modify the device to match */ + rc = set_ifupdown(netif, false); + if (rc) { + LOGP(DLNS, LOGL_ERROR, "Unable to bring up the device %s: %s\n", + netif, strerror(errno)); + goto err; + } + + memset(&req, 0, sizeof(struct ifreq)); + memset(fr, 0, sizeof(fr_proto)); + strncpy(req.ifr_name, netif, IFNAMSIZ); + req.ifr_settings.type = IF_PROTO_FR; + req.ifr_settings.size = sizeof(fr_proto); + req.ifr_settings.ifs_ifsu.fr = fr; + fr->lmi = LMI_NONE; + /* polling verification timer*/ + fr->t391 = 10; + /* link integrity verification polling timer */ + fr->t392 = 15; + /* full status polling counter*/ + fr->n391 = 6; + /* error threshold */ + fr->n392 = 3; + /* monitored events count */ + fr->n393 = 4; + + rc = ioctl(sock, SIOCWANDEV, &req); + if (rc) { + LOGP(DLNS, LOGL_ERROR, "%s: Unable to set FR protocol on information: %s\n", + netif, strerror(errno)); + goto err; + } + +ifup: + rc = set_ifupdown(netif, true); + if (rc) + LOGP(DLNS, LOGL_ERROR, "Unable to bring up the device %s: %s\n", + netif, strerror(errno)); +err: + close(sock); + return rc; +} /*! Create a new bind for NS over FR. * \param[in] nsi NS instance in which to create the bind @@ -482,7 +580,7 @@ goto err_name; } - if (strlen(netif) > IF_NAMESIZE) { + if (strlen(netif) > IFNAMSIZ) { rc = -EINVAL; goto err_priv; } @@ -508,6 +606,14 @@ goto err_fr; } + /* set protocol frame relay and lmi */ + rc = setup_device(priv->netif); + if(rc < 0) { + LOGP(DLNS, LOGL_ERROR, "Failed to setup the interface %s for frame relay and lmi\n", netif); + goto err_fr; + } + + osmo_wqueue_init(&priv->wqueue, 10); priv->wqueue.write_cb = handle_netif_write; priv->wqueue.read_cb = handle_netif_read; @@ -600,7 +706,7 @@ continue; _netif = gprs_ns2_fr_bind_netif(bind); - if (!strncmp(_netif, netif, IF_NAMESIZE)) + if (!strncmp(_netif, netif, IFNAMSIZ)) return bind; } -- To view, visit https://gerrit.osmocom.org/c/libosmocore/+/21752 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: libosmocore Gerrit-Branch: master Gerrit-Change-Id: I04786d2b864860b08c2e1afdb199470f4b80cc3b Gerrit-Change-Number: 21752 Gerrit-PatchSet: 1 Gerrit-Owner: lynxis lazus <lynxis at fe80.eu> Gerrit-MessageType: newchange -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20201217/446dd465/attachment.htm>