<p>lynxis lazus <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/21752">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  laforge: Looks good to me, but someone else must approve
  pespin: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">gprs_ns2: fr: setup the device to correct FR/LMI settings<br><br>A hdlc can be used in different modes. Also a FR device can be used<br>with lmi and certain settings as without it.<br>ns2 will use FR with no lmi in the kernel.<br><br>Related: SYS#5169<br>Change-Id: I04786d2b864860b08c2e1afdb199470f4b80cc3b<br>---<br>M src/gb/gprs_ns2_fr.c<br>1 file changed, 110 insertions(+), 4 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/gb/gprs_ns2_fr.c b/src/gb/gprs_ns2_fr.c</span><br><span>index 5b54b48..6019302 100644</span><br><span>--- a/src/gb/gprs_ns2_fr.c</span><br><span>+++ b/src/gb/gprs_ns2_fr.c</span><br><span>@@ -36,12 +36,14 @@</span><br><span> #include <netinet/ip.h></span><br><span> #include <netinet/ip6.h></span><br><span> #include <arpa/inet.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <net/if.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <linux/if.h></span><br><span> </span><br><span> #include <sys/ioctl.h></span><br><span> #include <netpacket/packet.h></span><br><span> #include <linux/if_ether.h></span><br><span> #include <linux/hdlc.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <linux/hdlc/ioctl.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <linux/sockios.h></span><br><span> </span><br><span> #include <osmocom/gprs/frame_relay.h></span><br><span> #include <osmocom/core/byteswap.h></span><br><span>@@ -84,7 +86,7 @@</span><br><span> };</span><br><span> </span><br><span> struct priv_bind {</span><br><span style="color: hsl(0, 100%, 40%);">-   char netif[IF_NAMESIZE];</span><br><span style="color: hsl(120, 100%, 40%);">+      char netif[IFNAMSIZ];</span><br><span>        struct osmo_fr_link *link;</span><br><span>   struct osmo_wqueue wqueue;</span><br><span>   int ifindex;</span><br><span>@@ -433,6 +435,103 @@</span><br><span> }</span><br><span> #endif /* LIBMNL */</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static int set_ifupdown(const char *netif, bool up)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  int sock, rc;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct ifreq req;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   sock = socket(AF_INET, SOCK_DGRAM, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (sock < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+              return sock;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        memset(&req, 0, sizeof req);</span><br><span style="color: hsl(120, 100%, 40%);">+      strncpy(req.ifr_name, netif, IFNAMSIZ);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (up)</span><br><span style="color: hsl(120, 100%, 40%);">+               req.ifr_flags |= IFF_UP;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    rc = ioctl(sock, SIOCSIFFLAGS, &req);</span><br><span style="color: hsl(120, 100%, 40%);">+     close(sock);</span><br><span style="color: hsl(120, 100%, 40%);">+  return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int setup_device(const char *netif)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        int sock, rc;</span><br><span style="color: hsl(120, 100%, 40%);">+ char buffer[128];</span><br><span style="color: hsl(120, 100%, 40%);">+     fr_proto *fr = (void*)buffer;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct ifreq req;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (sock < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGP(DLNS, LOGL_ERROR, "%s: Unable to create socket: %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+              netif, strerror(errno));</span><br><span style="color: hsl(120, 100%, 40%);">+         return sock;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   memset(&req, 0, sizeof(struct ifreq));</span><br><span style="color: hsl(120, 100%, 40%);">+    memset(&buffer, 0, sizeof(buffer));</span><br><span style="color: hsl(120, 100%, 40%);">+       osmo_strlcpy(req.ifr_name, netif, IFNAMSIZ);</span><br><span style="color: hsl(120, 100%, 40%);">+  req.ifr_settings.ifs_ifsu.sync = (void*)buffer;</span><br><span style="color: hsl(120, 100%, 40%);">+       req.ifr_settings.size = sizeof(buffer);</span><br><span style="color: hsl(120, 100%, 40%);">+       req.ifr_settings.type = IF_GET_PROTO;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       rc = ioctl(sock, SIOCWANDEV, &req);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGP(DLNS, LOGL_ERROR, "%s: Unable to get FR protocol information: %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                netif, strerror(errno));</span><br><span style="color: hsl(120, 100%, 40%);">+         goto err;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* check if the device is good */</span><br><span style="color: hsl(120, 100%, 40%);">+     if (req.ifr_settings.type != IF_PROTO_FR && fr->lmi != LMI_NONE) {</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGP(DLNS, LOGL_INFO, "%s: has correct frame relay mode and lmi\n", netif);</span><br><span style="color: hsl(120, 100%, 40%);">+         goto ifup;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* modify the device to match */</span><br><span style="color: hsl(120, 100%, 40%);">+      rc = set_ifupdown(netif, false);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (rc) {</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGP(DLNS, LOGL_ERROR, "Unable to bring up the device %s: %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                  netif, strerror(errno));</span><br><span style="color: hsl(120, 100%, 40%);">+                goto err;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   memset(&req, 0, sizeof(struct ifreq));</span><br><span style="color: hsl(120, 100%, 40%);">+    memset(fr, 0, sizeof(fr_proto));</span><br><span style="color: hsl(120, 100%, 40%);">+      osmo_strlcpy(req.ifr_name, netif, IFNAMSIZ);</span><br><span style="color: hsl(120, 100%, 40%);">+  req.ifr_settings.type = IF_PROTO_FR;</span><br><span style="color: hsl(120, 100%, 40%);">+  req.ifr_settings.size = sizeof(fr_proto);</span><br><span style="color: hsl(120, 100%, 40%);">+     req.ifr_settings.ifs_ifsu.fr = fr;</span><br><span style="color: hsl(120, 100%, 40%);">+    fr->lmi = LMI_NONE;</span><br><span style="color: hsl(120, 100%, 40%);">+        /* even those settings aren't used, they must be in the range */</span><br><span style="color: hsl(120, 100%, 40%);">+  /* polling verification timer*/</span><br><span style="color: hsl(120, 100%, 40%);">+       fr->t391 = 10;</span><br><span style="color: hsl(120, 100%, 40%);">+     /* link integrity verification polling timer */</span><br><span style="color: hsl(120, 100%, 40%);">+       fr->t392 = 15;</span><br><span style="color: hsl(120, 100%, 40%);">+     /* full status polling counter*/</span><br><span style="color: hsl(120, 100%, 40%);">+      fr->n391 = 6;</span><br><span style="color: hsl(120, 100%, 40%);">+      /* error threshold */</span><br><span style="color: hsl(120, 100%, 40%);">+ fr->n392 = 3;</span><br><span style="color: hsl(120, 100%, 40%);">+      /* monitored events count */</span><br><span style="color: hsl(120, 100%, 40%);">+  fr->n393 = 4;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    rc = ioctl(sock, SIOCWANDEV, &req);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (rc) {</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGP(DLNS, LOGL_ERROR, "%s: Unable to set FR protocol on information: %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                      netif, strerror(errno));</span><br><span style="color: hsl(120, 100%, 40%);">+                goto err;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ifup:</span><br><span style="color: hsl(120, 100%, 40%);">+    rc = set_ifupdown(netif, true);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (rc)</span><br><span style="color: hsl(120, 100%, 40%);">+               LOGP(DLNS, LOGL_ERROR, "Unable to bring up the device %s: %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                  netif, strerror(errno));</span><br><span style="color: hsl(120, 100%, 40%);">+err:</span><br><span style="color: hsl(120, 100%, 40%);">+  close(sock);</span><br><span style="color: hsl(120, 100%, 40%);">+  return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span> /*! Create a new bind for NS over FR.</span><br><span>  *  \param[in] nsi NS instance in which to create the bind</span><br><span>@@ -481,7 +580,7 @@</span><br><span>               goto err_name;</span><br><span>       }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (strlen(netif) > IF_NAMESIZE) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (strlen(netif) > IFNAMSIZ) {</span><br><span>           rc = -EINVAL;</span><br><span>                goto err_priv;</span><br><span>       }</span><br><span>@@ -507,6 +606,13 @@</span><br><span>             goto err_fr;</span><br><span>         }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* set protocol frame relay and lmi */</span><br><span style="color: hsl(120, 100%, 40%);">+        rc = setup_device(priv->netif);</span><br><span style="color: hsl(120, 100%, 40%);">+    if(rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+               LOGP(DLNS, LOGL_ERROR, "Failed to setup the interface %s for frame relay and lmi\n", netif);</span><br><span style="color: hsl(120, 100%, 40%);">+                goto err_fr;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  rc = open_socket(priv->ifindex);</span><br><span>  if (rc < 0)</span><br><span>               goto err_fr;</span><br><span>@@ -597,7 +703,7 @@</span><br><span>                   continue;</span><br><span> </span><br><span>                _netif = gprs_ns2_fr_bind_netif(bind);</span><br><span style="color: hsl(0, 100%, 40%);">-          if (!strncmp(_netif, netif, IF_NAMESIZE))</span><br><span style="color: hsl(120, 100%, 40%);">+             if (!strncmp(_netif, netif, IFNAMSIZ))</span><br><span>                       return bind;</span><br><span>         }</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/21752">change 21752</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/libosmocore/+/21752"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I04786d2b864860b08c2e1afdb199470f4b80cc3b </div>
<div style="display:none"> Gerrit-Change-Number: 21752 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </div>
<div style="display:none"> Gerrit-Owner: lynxis lazus <lynxis@fe80.eu> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: daniel <dwillmann@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: lynxis lazus <lynxis@fe80.eu> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>