<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/libosmo-netif/+/26429">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">stream: Factor out sctp_recvmg long code chunk<br><br>This makes it easier to follow the general path selection based on<br>protocol type. It will also make it easier when we add new paths based<br>on socket domain.<br><br>Change-Id: Ia3e0f4407e00a2dac9ee885fe1cc1cb4b463898a<br>---<br>M src/stream.c<br>1 file changed, 51 insertions(+), 43 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmo-netif refs/changes/29/26429/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/stream.c b/src/stream.c</span><br><span>index e4fb668..a36ea9e 100644</span><br><span>--- a/src/stream.c</span><br><span>+++ b/src/stream.c</span><br><span>@@ -1290,6 +1290,56 @@</span><br><span>    osmo_fd_write_enable(&conn->ofd);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef HAVE_LIBSCTP</span><br><span style="color: hsl(120, 100%, 40%);">+static int _sctp_recvmg_wrapper(int fd, struct msgb *msg)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  struct sctp_sndrcvinfo sinfo;</span><br><span style="color: hsl(120, 100%, 40%);">+ int flags = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+        int ret;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    ret = sctp_recvmsg(fd, msgb_data(msg), msgb_tailroom(msg),</span><br><span style="color: hsl(120, 100%, 40%);">+                    NULL, NULL, &sinfo, &flags);</span><br><span style="color: hsl(120, 100%, 40%);">+  if (flags & MSG_NOTIFICATION) {</span><br><span style="color: hsl(120, 100%, 40%);">+           union sctp_notification *notif = (union sctp_notification *)msgb_data(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGP(DLINP, LOGL_DEBUG, "NOTIFICATION %u flags=0x%x\n", notif->sn_header.sn_type, notif->sn_header.sn_flags);</span><br><span style="color: hsl(120, 100%, 40%);">+         switch (notif->sn_header.sn_type) {</span><br><span style="color: hsl(120, 100%, 40%);">+                case SCTP_ASSOC_CHANGE:</span><br><span style="color: hsl(120, 100%, 40%);">+                       LOGP(DLINP, LOGL_DEBUG, "===> ASSOC CHANGE:");</span><br><span style="color: hsl(120, 100%, 40%);">+                   switch (notif->sn_assoc_change.sac_state) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        case SCTP_COMM_UP:</span><br><span style="color: hsl(120, 100%, 40%);">+                            LOGPC(DLINP, LOGL_DEBUG, " UP\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                          break;</span><br><span style="color: hsl(120, 100%, 40%);">+                        case SCTP_COMM_LOST:</span><br><span style="color: hsl(120, 100%, 40%);">+                          LOGPC(DLINP, LOGL_DEBUG, " LOST\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                                break;</span><br><span style="color: hsl(120, 100%, 40%);">+                        case SCTP_RESTART:</span><br><span style="color: hsl(120, 100%, 40%);">+                            LOGPC(DLINP, LOGL_DEBUG, " RESTART\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                             break;</span><br><span style="color: hsl(120, 100%, 40%);">+                        case SCTP_SHUTDOWN_COMP:</span><br><span style="color: hsl(120, 100%, 40%);">+                              LOGPC(DLINP, LOGL_DEBUG, " SHUTDOWN COMP\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                               break;</span><br><span style="color: hsl(120, 100%, 40%);">+                        case SCTP_CANT_STR_ASSOC:</span><br><span style="color: hsl(120, 100%, 40%);">+                             LOGPC(DLINP, LOGL_DEBUG, " CANT STR ASSOC\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                              break;</span><br><span style="color: hsl(120, 100%, 40%);">+                        }</span><br><span style="color: hsl(120, 100%, 40%);">+                     break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case SCTP_PEER_ADDR_CHANGE:</span><br><span style="color: hsl(120, 100%, 40%);">+                   LOGP(DLINP, LOGL_DEBUG, "===> PEER ADDR CHANGE\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                      break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case SCTP_SHUTDOWN_EVENT:</span><br><span style="color: hsl(120, 100%, 40%);">+                     LOGP(DLINP, LOGL_DEBUG, "===> SHUTDOWN EVT\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                  /* Handle this like a regular disconnect */</span><br><span style="color: hsl(120, 100%, 40%);">+                   return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                     break;</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+             return -EAGAIN;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+     msgb_sctp_ppid(msg) = ntohl(sinfo.sinfo_ppid);</span><br><span style="color: hsl(120, 100%, 40%);">+        msgb_sctp_stream(msg) = sinfo.sinfo_stream;</span><br><span style="color: hsl(120, 100%, 40%);">+   return ret;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*! \brief Receive data via Osmocom stream server</span><br><span>  *  \param[in] conn Stream Server from which to receive</span><br><span>  *  \param msg pre-allocate message buffer to which received data is appended</span><br><span>@@ -1297,10 +1347,6 @@</span><br><span>  */</span><br><span> int osmo_stream_srv_recv(struct osmo_stream_srv *conn, struct msgb *msg)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-#ifdef HAVE_LIBSCTP</span><br><span style="color: hsl(0, 100%, 40%);">-   struct sctp_sndrcvinfo sinfo;</span><br><span style="color: hsl(0, 100%, 40%);">-   int flags = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span>         int ret;</span><br><span> </span><br><span>         if (!msg)</span><br><span>@@ -1309,45 +1355,7 @@</span><br><span>   switch (conn->srv->proto) {</span><br><span> #ifdef HAVE_LIBSCTP</span><br><span>     case IPPROTO_SCTP:</span><br><span style="color: hsl(0, 100%, 40%);">-              ret = sctp_recvmsg(conn->ofd.fd, msgb_data(msg), msgb_tailroom(msg),</span><br><span style="color: hsl(0, 100%, 40%);">-                         NULL, NULL, &sinfo, &flags);</span><br><span style="color: hsl(0, 100%, 40%);">-            if (flags & MSG_NOTIFICATION) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     union sctp_notification *notif = (union sctp_notification *) msgb_data(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-                    LOGP(DLINP, LOGL_DEBUG, "NOTIFICATION %u flags=0x%x\n", notif->sn_header.sn_type, notif->sn_header.sn_flags);</span><br><span style="color: hsl(0, 100%, 40%);">-                   switch (notif->sn_header.sn_type) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  case SCTP_ASSOC_CHANGE:</span><br><span style="color: hsl(0, 100%, 40%);">-                         LOGP(DLINP, LOGL_DEBUG, "===> ASSOC CHANGE:");</span><br><span style="color: hsl(0, 100%, 40%);">-                             switch (notif->sn_assoc_change.sac_state) {</span><br><span style="color: hsl(0, 100%, 40%);">-                          case SCTP_COMM_UP:</span><br><span style="color: hsl(0, 100%, 40%);">-                                      LOGPC(DLINP, LOGL_DEBUG, " UP\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                                    break;</span><br><span style="color: hsl(0, 100%, 40%);">-                          case SCTP_COMM_LOST:</span><br><span style="color: hsl(0, 100%, 40%);">-                                    LOGPC(DLINP, LOGL_DEBUG, " LOST\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                                  break;</span><br><span style="color: hsl(0, 100%, 40%);">-                          case SCTP_RESTART:</span><br><span style="color: hsl(0, 100%, 40%);">-                                      LOGPC(DLINP, LOGL_DEBUG, " RESTART\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                                       break;</span><br><span style="color: hsl(0, 100%, 40%);">-                          case SCTP_SHUTDOWN_COMP:</span><br><span style="color: hsl(0, 100%, 40%);">-                                        LOGPC(DLINP, LOGL_DEBUG, " SHUTDOWN COMP\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                                 break;</span><br><span style="color: hsl(0, 100%, 40%);">-                          case SCTP_CANT_STR_ASSOC:</span><br><span style="color: hsl(0, 100%, 40%);">-                                       LOGPC(DLINP, LOGL_DEBUG, " CANT STR ASSOC\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                                        break;</span><br><span style="color: hsl(0, 100%, 40%);">-                          }</span><br><span style="color: hsl(0, 100%, 40%);">-                               break;</span><br><span style="color: hsl(0, 100%, 40%);">-                  case SCTP_PEER_ADDR_CHANGE:</span><br><span style="color: hsl(0, 100%, 40%);">-                             LOGP(DLINP, LOGL_DEBUG, "===> PEER ADDR CHANGE\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                                break;</span><br><span style="color: hsl(0, 100%, 40%);">-                  case SCTP_SHUTDOWN_EVENT:</span><br><span style="color: hsl(0, 100%, 40%);">-                               LOGP(DLINP, LOGL_DEBUG, "===> SHUTDOWN EVT\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                            /* Handle this like a regular disconnect */</span><br><span style="color: hsl(0, 100%, 40%);">-                             return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                               break;</span><br><span style="color: hsl(0, 100%, 40%);">-                  }</span><br><span style="color: hsl(0, 100%, 40%);">-                       return -EAGAIN;</span><br><span style="color: hsl(0, 100%, 40%);">-         }</span><br><span style="color: hsl(0, 100%, 40%);">-               msgb_sctp_ppid(msg) = ntohl(sinfo.sinfo_ppid);</span><br><span style="color: hsl(0, 100%, 40%);">-          msgb_sctp_stream(msg) = sinfo.sinfo_stream;</span><br><span style="color: hsl(120, 100%, 40%);">+           ret = _sctp_recvmg_wrapper(conn->ofd.fd, msg);</span><br><span>            break;</span><br><span> #endif</span><br><span>     case IPPROTO_TCP:</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmo-netif/+/26429">change 26429</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/libosmo-netif/+/26429"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmo-netif </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Ia3e0f4407e00a2dac9ee885fe1cc1cb4b463898a </div>
<div style="display:none"> Gerrit-Change-Number: 26429 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>