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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Configure E1 pcap file per line<br><br>In order to allow configuration of pcap files per e1_line<br>the vty command is now (for example line 0):<br><br>  e1_line 0 pcap /tmp/e1cap.pcap<br><br>in place of:<br><br>  pcap /tmp/e1cap.pcap<br><br>Also ensures that a configured pcap appears in 'show running-config'<br>and is written to the config file on issuing 'write'<br><br>This commit deprecates e1_set_pcap_fd()<br><br>Change-Id: I316c3d6a839e84c2f52a148c6b8dd6f5933cf4bf<br>---<br>M include/osmocom/abis/e1_input.h<br>M src/e1_input.c<br>M src/e1_input_vty.c<br>3 files changed, 106 insertions(+), 20 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/abis/e1_input.h b/include/osmocom/abis/e1_input.h</span><br><span>index 9b99f12..9c3fe56 100644</span><br><span>--- a/include/osmocom/abis/e1_input.h</span><br><span>+++ b/include/osmocom/abis/e1_input.h</span><br><span>@@ -223,6 +223,10 @@</span><br><span>      void *driver_data;</span><br><span> </span><br><span>       struct osmo_use_count use_count;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* file name and file descriptor of pcap for this line */</span><br><span style="color: hsl(120, 100%, 40%);">+     char *pcap_file;</span><br><span style="color: hsl(120, 100%, 40%);">+      int pcap_fd;</span><br><span> };</span><br><span> #define e1inp_line_ipa_oml_ts(line) (&line->ts[0])</span><br><span> #define e1inp_line_ipa_rsl_ts(line, trx_id) (&line->ts[1 + (trx_id)])</span><br><span>@@ -317,8 +321,11 @@</span><br><span>         void *rx_cbdata);</span><br><span> </span><br><span> /* Write LAPD frames to the fd. */</span><br><span style="color: hsl(120, 100%, 40%);">+OSMO_DEPRECATED("Use e1_set_pcap_fd2() instead")</span><br><span> int e1_set_pcap_fd(int fd);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int e1_set_pcap_fd2(struct e1inp_line *line, int fd);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* called by TRAU muxer to obtain the destination mux entity */</span><br><span> struct subch_mux *e1inp_get_mux(uint8_t e1_nr, uint8_t ts_nr);</span><br><span> </span><br><span>diff --git a/src/e1_input.c b/src/e1_input.c</span><br><span>index 04c464a..93ab446 100644</span><br><span>--- a/src/e1_input.c</span><br><span>+++ b/src/e1_input.c</span><br><span>@@ -139,6 +139,40 @@</span><br><span> osmo_static_assert(offsetof(struct fake_linux_lapd_header, protocol) == 14, proto_offset);</span><br><span> osmo_static_assert(sizeof(struct fake_linux_lapd_header) == 16,            lapd_header_size);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int e1_set_pcap_fd2(struct e1inp_line *line, int fd)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        static const struct pcap_hdr header = {</span><br><span style="color: hsl(120, 100%, 40%);">+               .magic_number   = 0xa1b2c3d4,</span><br><span style="color: hsl(120, 100%, 40%);">+         .version_major  = 2,</span><br><span style="color: hsl(120, 100%, 40%);">+          .version_minor  = 4,</span><br><span style="color: hsl(120, 100%, 40%);">+          .thiszone       = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+          .sigfigs        = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+          .snaplen        = 65535,</span><br><span style="color: hsl(120, 100%, 40%);">+              .network        = DLT_LINUX_LAPD,</span><br><span style="color: hsl(120, 100%, 40%);">+     };</span><br><span style="color: hsl(120, 100%, 40%);">+    int i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* write header */</span><br><span style="color: hsl(120, 100%, 40%);">+    if (fd >= 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+             int rc = write(fd, &header, sizeof(header));</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%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Set the PCAP file descriptor for all timeslots that have</span><br><span style="color: hsl(120, 100%, 40%);">+    * software LAPD instances, to ensure the osmo_lapd_pcap code is</span><br><span style="color: hsl(120, 100%, 40%);">+       * used to write PCAP files (if requested) */</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < ARRAY_SIZE(line->ts); i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+            struct e1inp_ts *e1i_ts = &line->ts[i];</span><br><span style="color: hsl(120, 100%, 40%);">+                if (e1i_ts->lapd)</span><br><span style="color: hsl(120, 100%, 40%);">+                  e1i_ts->lapd->pcap_fd = fd;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     /* close previous and update */</span><br><span style="color: hsl(120, 100%, 40%);">+       if (line->pcap_fd >= 0)</span><br><span style="color: hsl(120, 100%, 40%);">+         close(line->pcap_fd);</span><br><span style="color: hsl(120, 100%, 40%);">+      line->pcap_fd = fd;</span><br><span style="color: hsl(120, 100%, 40%);">+        return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span> static int pcap_fd = -1;</span><br><span> </span><br><span>@@ -185,7 +219,7 @@</span><br><span> </span><br><span> /* This currently only works for the D-Channel */</span><br><span> static void write_pcap_packet(int direction, int sapi, int tei,</span><br><span style="color: hsl(0, 100%, 40%);">-                            struct msgb *msg) {</span><br><span style="color: hsl(120, 100%, 40%);">+                           struct msgb *msg, int pcap_fd) {</span><br><span>       if (pcap_fd < 0)</span><br><span>          return;</span><br><span> </span><br><span>@@ -286,7 +320,7 @@</span><br><span>     * the _actual_ LAPD packet */</span><br><span>       if (!e1i_ts->lapd) {</span><br><span>              write_pcap_packet(PCAP_OUTPUT, sign_link->sapi,</span><br><span style="color: hsl(0, 100%, 40%);">-                                sign_link->tei, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+                              sign_link->tei, msg, e1i_ts->line->pcap_fd);</span><br><span>      }</span><br><span> </span><br><span>        return 0;</span><br><span>@@ -460,6 +494,7 @@</span><br><span> </span><br><span>  line->driver = driver;</span><br><span>    line->num = e1_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+ line->pcap_fd = -1;</span><br><span> </span><br><span>   line->rate_ctr = rate_ctr_group_alloc(line, &e1inp_ctr_g_d, line->num);</span><br><span>    if (!line->rate_ctr) {</span><br><span>@@ -664,7 +699,7 @@</span><br><span>               * the libosmocore LAPD implementation, it will take</span><br><span>                  * care of writing the _actual_ LAPD packet */</span><br><span>               if (!ts->lapd)</span><br><span style="color: hsl(0, 100%, 40%);">-                       write_pcap_packet(PCAP_INPUT, sapi, tei, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+                        write_pcap_packet(PCAP_INPUT, sapi, tei, msg, ts->line->pcap_fd);</span><br><span>              /* consult the list of signalling links */</span><br><span>           link = e1inp_lookup_sign_link(ts, tei, sapi);</span><br><span>                if (!link) {</span><br><span>@@ -901,7 +936,7 @@</span><br><span>   for (i = 0; i < ARRAY_SIZE(line->ts); i++) {</span><br><span>           struct e1inp_ts *e1i_ts = &line->ts[i];</span><br><span>               if (e1i_ts->lapd)</span><br><span style="color: hsl(0, 100%, 40%);">-                    e1i_ts->lapd->pcap_fd = pcap_fd;</span><br><span style="color: hsl(120, 100%, 40%);">+                        e1i_ts->lapd->pcap_fd = line->pcap_fd;</span><br><span>      }</span><br><span> </span><br><span>        /* Send a signal to anyone who is interested in new lines being</span><br><span>@@ -916,13 +951,16 @@</span><br><span> static int e1i_sig_cb(unsigned int subsys, unsigned int signal,</span><br><span>                 void *handler_data, void *signal_data)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+     struct e1inp_line *line;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   if (subsys != SS_L_GLOBAL ||</span><br><span>             signal != S_L_GLOBAL_SHUTDOWN)</span><br><span>           return 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (pcap_fd) {</span><br><span style="color: hsl(0, 100%, 40%);">-          close(pcap_fd);</span><br><span style="color: hsl(0, 100%, 40%);">-         pcap_fd = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+ llist_for_each_entry(line, &e1inp_line_list, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+              if (line->pcap_fd >=0)</span><br><span style="color: hsl(120, 100%, 40%);">+                  close(line->pcap_fd);</span><br><span style="color: hsl(120, 100%, 40%);">+              line->pcap_fd = -1;</span><br><span>       }</span><br><span> </span><br><span>        return 0;</span><br><span>diff --git a/src/e1_input_vty.c b/src/e1_input_vty.c</span><br><span>index d915c19..64f5f63 100644</span><br><span>--- a/src/e1_input_vty.c</span><br><span>+++ b/src/e1_input_vty.c</span><br><span>@@ -245,33 +245,67 @@</span><br><span>       return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN_ATTR(cfg_e1_pcap, cfg_e1_pcap_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">-       "pcap .FILE",</span><br><span style="color: hsl(0, 100%, 40%);">-         "Setup a pcap recording of all E1 traffic\n"</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN_ATTR(cfg_e1line_pcap, cfg_e1line_pcap_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "e1_line <0-255> pcap .FILE",</span><br><span style="color: hsl(120, 100%, 40%);">+         E1_LINE_HELP "Setup a pcap recording of E1 traffic for line\n"</span><br><span>     "Filename to save the packets to\n", CMD_ATTR_IMMEDIATE)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    struct e1inp_line *line;</span><br><span>     int fd;</span><br><span style="color: hsl(120, 100%, 40%);">+       int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+       int e1_nr = atoi(argv[0]);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  fd = open(argv[0], O_WRONLY | O_CREAT | O_TRUNC, 0660);</span><br><span style="color: hsl(0, 100%, 40%);">- if (fd < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                vty_out(vty, "Failed to setup E1 pcap recording to %s.%s", argv[0], VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+   line = e1inp_line_find(e1_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!line) {</span><br><span style="color: hsl(120, 100%, 40%);">+          vty_out(vty, "%% Line %d doesn't exist%s", e1_nr, VTY_NEWLINE);</span><br><span>                return CMD_WARNING;</span><br><span>  }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   e1_set_pcap_fd(fd);</span><br><span style="color: hsl(120, 100%, 40%);">+   fd = open(argv[1], O_WRONLY | O_CREAT | O_TRUNC, 0660);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (fd < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              vty_out(vty, "Failed to setup E1 pcap recording to %s%s", argv[1], VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+            return CMD_WARNING;</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ rc = e1_set_pcap_fd2(line, fd);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              vty_out(vty, "Failed to write to E1 pcap file %s%s", argv[1], VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+         close(fd);</span><br><span style="color: hsl(120, 100%, 40%);">+            return CMD_WARNING;</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%);">+   osmo_talloc_replace_string(line, &line->pcap_file, argv[1]);</span><br><span>  return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN_ATTR(cfg_e1_no_pcap, cfg_e1_no_pcap_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">-         "no pcap",</span><br><span style="color: hsl(0, 100%, 40%);">-    NO_STR "Disable pcap recording of all E1 traffic\n",</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN_ATTR(cfg_e1line_no_pcap, cfg_e1line_no_pcap_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+        "no e1_line <0-255> pcap",</span><br><span style="color: hsl(120, 100%, 40%);">+    NO_STR E1_LINE_HELP "Disable pcap recording of E1 traffic for line\n",</span><br><span>     CMD_ATTR_IMMEDIATE)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     e1_set_pcap_fd(-1);</span><br><span style="color: hsl(120, 100%, 40%);">+   struct e1inp_line *line;</span><br><span style="color: hsl(120, 100%, 40%);">+      int e1_nr = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+    line = e1inp_line_find(e1_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      e1_set_pcap_fd2(line, -1);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (line->pcap_file) {</span><br><span style="color: hsl(120, 100%, 40%);">+             talloc_free(line->pcap_file);</span><br><span style="color: hsl(120, 100%, 40%);">+              line->pcap_file = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span>    return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN_DEPRECATED(cfg_e1_pcap_deprec, cfg_e1_pcap_deprec_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+         "pcap .FILE", "Legacy")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   vty_out(vty, "%% 'pcap' is deprecated and has no effect: use e1_line <0-255> pcap%s",</span><br><span style="color: hsl(120, 100%, 40%);">+         VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ return CMD_WARNING;</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%);">+ALIAS_DEPRECATED(cfg_e1_pcap_deprec, cfg_e1_pcap_deprec_no_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+          "no pcap", NO_STR);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> DEFUN_ATTR(cfg_e1inp, cfg_e1inp_cmd,</span><br><span>            "e1_input",</span><br><span>        "Configure E1/T1/J1 TDM input\n", CMD_ATTR_IMMEDIATE)</span><br><span>@@ -329,6 +363,9 @@</span><br><span>                     vty_out(vty, " e1_line %u ipa-keepalive %d %d%s", line->num,</span><br><span>                            line->ipa_kap->interval, line->ipa_kap->wait_for_resp,</span><br><span>                           VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+         if (line->pcap_file)</span><br><span style="color: hsl(120, 100%, 40%);">+                       vty_out(vty, " e1_line %u pcap %s%s", line->num,</span><br><span style="color: hsl(120, 100%, 40%);">+                         line->pcap_file, VTY_NEWLINE);</span><br><span>    }</span><br><span> </span><br><span>        const char *ipa_bind = e1inp_ipa_get_bind_addr();</span><br><span>@@ -365,6 +402,8 @@</span><br><span>      vty_out(vty, "E1 Line Number %u, Name %s, Driver %s%s",</span><br><span>            line->num, line->name ? line->name : "",</span><br><span>          line->driver->name, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (line->pcap_file)</span><br><span style="color: hsl(120, 100%, 40%);">+               vty_out(vty, "PCAP %s%s", line->pcap_file, VTY_NEWLINE);</span><br><span>        if (line->driver->vty_show)</span><br><span>            line->driver->vty_show(vty, line);</span><br><span>     if (stats)</span><br><span>@@ -477,8 +516,10 @@</span><br><span>    install_lib_element(CONFIG_NODE, &cfg_e1inp_cmd);</span><br><span>        install_node(&e1inp_node, e1inp_config_write);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  install_lib_element(L_E1INP_NODE, &cfg_e1_pcap_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-        install_lib_element(L_E1INP_NODE, &cfg_e1_no_pcap_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+   install_lib_element(L_E1INP_NODE, &cfg_e1line_pcap_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+  install_lib_element(L_E1INP_NODE, &cfg_e1line_no_pcap_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+       install_lib_element(L_E1INP_NODE, &cfg_e1_pcap_deprec_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+       install_lib_element(L_E1INP_NODE, &cfg_e1_pcap_deprec_no_cmd);</span><br><span> </span><br><span>       install_lib_element(L_E1INP_NODE, &cfg_e1_line_driver_cmd);</span><br><span>      install_lib_element(L_E1INP_NODE, &cfg_e1_line_port_cmd);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmo-abis/+/21118">change 21118</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-abis/+/21118"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmo-abis </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I316c3d6a839e84c2f52a148c6b8dd6f5933cf4bf </div>
<div style="display:none"> Gerrit-Change-Number: 21118 </div>
<div style="display:none"> Gerrit-PatchSet: 9 </div>
<div style="display:none"> Gerrit-Owner: keith <keith@rhizomatica.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: keith <keith@rhizomatica.org> </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>