<p>Pau Espin Pedrol <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/11278">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  Harald Welte: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">client: Add pcap snaplen VTY cmd<br><br>Change-Id: I84fda9f27b725e031c218187ab679392dfa7ec3d<br>---<br>M include/osmo-pcap/common.h<br>M include/osmo-pcap/osmo_pcap_client.h<br>M src/osmo_client_core.c<br>M src/osmo_client_main.c<br>M src/osmo_client_network.c<br>M src/osmo_client_vty.c<br>6 files changed, 41 insertions(+), 10 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmo-pcap/common.h b/include/osmo-pcap/common.h</span><br><span>index 5d977f1..79080a2 100644</span><br><span>--- a/include/osmo-pcap/common.h</span><br><span>+++ b/include/osmo-pcap/common.h</span><br><span>@@ -63,4 +63,6 @@</span><br><span> #define MAXIMUM_SNAPLEN  262144</span><br><span> #endif</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define DEFAULT_SNAPLEN 9000</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #endif</span><br><span>diff --git a/include/osmo-pcap/osmo_pcap_client.h b/include/osmo-pcap/osmo_pcap_client.h</span><br><span>index 7888dfe..70be8db 100644</span><br><span>--- a/include/osmo-pcap/osmo_pcap_client.h</span><br><span>+++ b/include/osmo-pcap/osmo_pcap_client.h</span><br><span>@@ -94,6 +94,7 @@</span><br><span>      char   *filter_string;</span><br><span>       int filter_itself;</span><br><span>   int gprs_filtering;</span><br><span style="color: hsl(120, 100%, 40%);">+   int snaplen;</span><br><span>         struct osmo_fd fd;</span><br><span> </span><br><span>       struct osmo_pcap_client_conn conn;</span><br><span>@@ -105,6 +106,7 @@</span><br><span> </span><br><span> extern struct osmo_pcap_client *pcap_client;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+struct osmo_pcap_client *osmo_pcap_client_alloc(void *tall_ctx);</span><br><span> int vty_client_init(struct osmo_pcap_client *);</span><br><span> </span><br><span> int osmo_client_capture(struct osmo_pcap_client *client, const char *device);</span><br><span>diff --git a/src/osmo_client_core.c b/src/osmo_client_core.c</span><br><span>index e19ae89..6414552 100644</span><br><span>--- a/src/osmo_client_core.c</span><br><span>+++ b/src/osmo_client_core.c</span><br><span>@@ -287,7 +287,9 @@</span><br><span>                return 1;</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   client->handle = pcap_open_live(client->device, 9000, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+        LOGP(DCLIENT, LOGL_INFO, "Opening device %s for capture with snaplen %zu\n",</span><br><span style="color: hsl(120, 100%, 40%);">+             client->device, (size_t) client->snaplen);</span><br><span style="color: hsl(120, 100%, 40%);">+ client->handle = pcap_open_live(client->device, client->snaplen, 0,</span><br><span>                                         1000, client->errbuf);</span><br><span>    if (!client->handle) {</span><br><span>            LOGP(DCLIENT, LOGL_ERROR,</span><br><span>@@ -346,6 +348,16 @@</span><br><span>     conn->wqueue.bfd.fd = -1;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+struct osmo_pcap_client *osmo_pcap_client_alloc(void *tall_ctx)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     struct osmo_pcap_client *client;</span><br><span style="color: hsl(120, 100%, 40%);">+      client = talloc_zero(tall_ctx, struct osmo_pcap_client);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (!client)</span><br><span style="color: hsl(120, 100%, 40%);">+          return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  client->fd.fd = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+        client->snaplen = DEFAULT_SNAPLEN;</span><br><span style="color: hsl(120, 100%, 40%);">+ return client;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span> void osmo_client_free(struct osmo_pcap_client_conn *conn)</span><br><span> {</span><br><span>diff --git a/src/osmo_client_main.c b/src/osmo_client_main.c</span><br><span>index f571b96..a28c4b7 100644</span><br><span>--- a/src/osmo_client_main.c</span><br><span>+++ b/src/osmo_client_main.c</span><br><span>@@ -212,12 +212,11 @@</span><br><span>                 exit(1);</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   pcap_client = talloc_zero(tall_cli_ctx, struct osmo_pcap_client);</span><br><span style="color: hsl(120, 100%, 40%);">+     pcap_client = osmo_pcap_client_alloc(tall_cli_ctx);</span><br><span>  if (!pcap_client) {</span><br><span>          LOGP(DCLIENT, LOGL_ERROR, "Failed to allocate osmo_pcap_client.\n");</span><br><span>               exit(1);</span><br><span>     }</span><br><span style="color: hsl(0, 100%, 40%);">-       pcap_client->fd.fd = -1;</span><br><span>  vty_client_init(pcap_client);</span><br><span> </span><br><span>    /* initialize the queue */</span><br><span>diff --git a/src/osmo_client_network.c b/src/osmo_client_network.c</span><br><span>index e900ef4..7073d6c 100644</span><br><span>--- a/src/osmo_client_network.c</span><br><span>+++ b/src/osmo_client_network.c</span><br><span>@@ -169,14 +169,14 @@</span><br><span>  struct msgb *msg;</span><br><span>    int offset, ip_len;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (in_hdr->caplen > 9000) {</span><br><span style="color: hsl(120, 100%, 40%);">+    if (in_hdr->len > in_hdr->caplen) {</span><br><span>                 LOGP(DCLIENT, LOGL_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">-                       "Capture len too big %zu\n", (size_t) in_hdr->caplen);</span><br><span style="color: hsl(120, 100%, 40%);">+                   "Recording truncated packet, len %zu > snaplen %zu\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                   (size_t) in_hdr->len, (size_t) in_hdr->caplen);</span><br><span>                rate_ctr_inc(&conn->client->ctrg->ctr[CLIENT_CTR_2BIG]);</span><br><span style="color: hsl(0, 100%, 40%);">-           return;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   msg = msgb_alloc(9000 + sizeof(*om_hdr) + sizeof(*hdr), "data-data");</span><br><span style="color: hsl(120, 100%, 40%);">+       msg = msgb_alloc(in_hdr->caplen + sizeof(*om_hdr) + sizeof(*hdr), "data-data");</span><br><span>         if (!msg) {</span><br><span>          LOGP(DCLIENT, LOGL_ERROR, "Failed to allocate.\n");</span><br><span>                rate_ctr_inc(&conn->client->ctrg->ctr[CLIENT_CTR_NOMEM]);</span><br><span>@@ -239,7 +239,7 @@</span><br><span>                 return;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   msg = msgb_alloc(9000 + sizeof(*om_hdr) + sizeof(*hdr), "link-data");</span><br><span style="color: hsl(120, 100%, 40%);">+       msg = msgb_alloc(conn->client->snaplen + sizeof(*om_hdr) + sizeof(*hdr), "link-data");</span><br><span>       if (!msg) {</span><br><span>          LOGP(DCLIENT, LOGL_ERROR, "Failed to allocate data.\n");</span><br><span>           return;</span><br><span>@@ -256,7 +256,7 @@</span><br><span>        hdr->version_minor = 4;</span><br><span>   hdr->thiszone = 0;</span><br><span>        hdr->sigfigs = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-    hdr->snaplen = MAXIMUM_SNAPLEN;</span><br><span style="color: hsl(120, 100%, 40%);">+    hdr->snaplen = conn->client->snaplen;</span><br><span>       hdr->linktype = pcap_datalink(conn->client->handle);</span><br><span> </span><br><span>    write_data(conn, msg);</span><br><span>diff --git a/src/osmo_client_vty.c b/src/osmo_client_vty.c</span><br><span>index e50099f..30158c5 100644</span><br><span>--- a/src/osmo_client_vty.c</span><br><span>+++ b/src/osmo_client_vty.c</span><br><span>@@ -125,7 +125,9 @@</span><br><span>        if (pcap_client->device)</span><br><span>          vty_out(vty, " pcap device %s%s",</span><br><span>                  pcap_client->device, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+ if (pcap_client->snaplen != DEFAULT_SNAPLEN)</span><br><span style="color: hsl(120, 100%, 40%);">+               vty_out(vty, " pcap snaplen %d%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                  pcap_client->snaplen, VTY_NEWLINE);</span><br><span>       if (pcap_client->filter_string)</span><br><span>           vty_out(vty, " pcap filter %s%s",</span><br><span>                  pcap_client->filter_string, VTY_NEWLINE);</span><br><span>@@ -148,6 +150,19 @@</span><br><span>  return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(cfg_client_snaplen,</span><br><span style="color: hsl(120, 100%, 40%);">+      cfg_client_snaplen_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+              "pcap snaplen <1-262144>", /* MAXIMUM_SNAPLEN */</span><br><span style="color: hsl(120, 100%, 40%);">+      PCAP_STRING "snapshot length\n" "Bytes\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       if (pcap_client->handle) {</span><br><span style="color: hsl(120, 100%, 40%);">+         vty_out(vty, "'pcap snaplen' must be set before 'pcap device' to take effect!%s", 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%);">+     pcap_client->snaplen = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+      return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> DEFUN(cfg_client_add_gprs,</span><br><span>       cfg_client_add_gprs_cmd,</span><br><span>       "pcap add-filter gprs",</span><br><span>@@ -512,6 +527,7 @@</span><br><span>    install_node(&server_node, config_write_server);</span><br><span> </span><br><span>     install_element(CLIENT_NODE, &cfg_client_device_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+     install_element(CLIENT_NODE, &cfg_client_snaplen_cmd);</span><br><span>   install_element(CLIENT_NODE, &cfg_client_filter_cmd);</span><br><span>    install_element(CLIENT_NODE, &cfg_client_loop_cmd);</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/11278">change 11278</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/11278"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-pcap </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: I84fda9f27b725e031c218187ab679392dfa7ec3d </div>
<div style="display:none"> Gerrit-Change-Number: 11278 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Pau Espin Pedrol <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>
<div style="display:none"> Gerrit-Reviewer: Pau Espin Pedrol <pespin@sysmocom.de> </div>