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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">socket: IPv6 support for osmo_sock_set_dscp()<br><br>IPv6 has the analogous to DSCP: The "traffic class" field.<br><br>See https://tools.ietf.org/html/draft-itojun-ipv6-tclass-api-03<br><br>Change-Id: Ib31b977f67d60aa7f30ca4ab6eceba3d1d5eeee1<br>Related: SYS#5427<br>---<br>M src/socket.c<br>1 file changed, 36 insertions(+), 7 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/socket.c b/src/socket.c</span><br><span>index 6afe986..59d0876 100644</span><br><span>--- a/src/socket.c</span><br><span>+++ b/src/socket.c</span><br><span>@@ -1800,25 +1800,54 @@</span><br><span>  *  \returns 0 on success; negative on error. */</span><br><span> int osmo_sock_set_dscp(int fd, uint8_t dscp)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+   struct sockaddr_storage local_addr;</span><br><span style="color: hsl(120, 100%, 40%);">+   socklen_t local_addr_len = sizeof(local_addr);</span><br><span>       uint8_t tos;</span><br><span>         socklen_t tos_len = sizeof(tos);</span><br><span style="color: hsl(120, 100%, 40%);">+      int tclass;</span><br><span style="color: hsl(120, 100%, 40%);">+   socklen_t tclass_len = sizeof(tclass);</span><br><span>       int rc;</span><br><span> </span><br><span>  /* DSCP is a 6-bit value stored in the upper 6 bits of the 8-bit TOS */</span><br><span>      if (dscp > 63)</span><br><span>            return -EINVAL;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     /* read the original value */</span><br><span style="color: hsl(0, 100%, 40%);">-   rc = getsockopt(fd, IPPROTO_IP, IP_TOS, &tos, &tos_len);</span><br><span style="color: hsl(120, 100%, 40%);">+      rc = getsockname(fd, (struct sockaddr *)&local_addr, &local_addr_len);</span><br><span>       if (rc < 0)</span><br><span>               return rc;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  /* mask-in the DSCP into the upper 6 bits */</span><br><span style="color: hsl(0, 100%, 40%);">-    tos &= 0x03;</span><br><span style="color: hsl(0, 100%, 40%);">-        tos |= dscp << 2;</span><br><span style="color: hsl(120, 100%, 40%);">+       switch (local_addr.ss_family) {</span><br><span style="color: hsl(120, 100%, 40%);">+       case AF_INET:</span><br><span style="color: hsl(120, 100%, 40%);">+         /* read the original value */</span><br><span style="color: hsl(120, 100%, 40%);">+         rc = getsockopt(fd, IPPROTO_IP, IP_TOS, &tos, &tos_len);</span><br><span style="color: hsl(120, 100%, 40%);">+              if (rc < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                        return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+            /* mask-in the DSCP into the upper 6 bits */</span><br><span style="color: hsl(120, 100%, 40%);">+          tos &= 0x03;</span><br><span style="color: hsl(120, 100%, 40%);">+              tos |= dscp << 2;</span><br><span style="color: hsl(120, 100%, 40%);">+               /* and write it back to the kernel */</span><br><span style="color: hsl(120, 100%, 40%);">+         rc = setsockopt(fd, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case AF_INET6:</span><br><span style="color: hsl(120, 100%, 40%);">+                /* read the original value */</span><br><span style="color: hsl(120, 100%, 40%);">+         rc = getsockopt(fd, IPPROTO_IPV6, IPV6_TCLASS, &tclass, &tclass_len);</span><br><span style="color: hsl(120, 100%, 40%);">+         if (rc < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                        return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+            /* mask-in the DSCP into the upper 6 bits */</span><br><span style="color: hsl(120, 100%, 40%);">+          tclass &= 0x03;</span><br><span style="color: hsl(120, 100%, 40%);">+           tclass |= dscp << 2;</span><br><span style="color: hsl(120, 100%, 40%);">+            /* and write it back to the kernel */</span><br><span style="color: hsl(120, 100%, 40%);">+         rc = setsockopt(fd, IPPROTO_IPV6, IPV6_TCLASS, &tclass, sizeof(tclass));</span><br><span style="color: hsl(120, 100%, 40%);">+          break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case AF_UNSPEC:</span><br><span style="color: hsl(120, 100%, 40%);">+       default:</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGP(DLGLOBAL, LOGL_ERROR, "No DSCP support for socket family %u\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                     local_addr.ss_family);</span><br><span style="color: hsl(120, 100%, 40%);">+           rc = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* and write it back to the kernel */</span><br><span style="color: hsl(0, 100%, 40%);">-   return setsockopt(fd, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));</span><br><span style="color: hsl(120, 100%, 40%);">+     return rc;</span><br><span> }</span><br><span> </span><br><span> /*! Set the priority value of a socket.</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/23935">change 23935</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/+/23935"/><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: Ib31b977f67d60aa7f30ca4ab6eceba3d1d5eeee1 </div>
<div style="display:none"> Gerrit-Change-Number: 23935 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>