diff options
author | Pau Espin Pedrol <pespin@sysmocom.de> | 2018-10-08 19:15:53 +0200 |
---|---|---|
committer | Pau Espin Pedrol <pespin@sysmocom.de> | 2018-10-08 20:20:43 +0200 |
commit | a82aaef5070e6f5988656cb0767e62d8ea6a7269 (patch) | |
tree | 899c2f60fc4ef0e50c84efe133a4e34bf9315c1d | |
parent | 868a5012131fbcc47dbb45a1cfcc464e49f97b28 (diff) |
server: Add pcap snaplen VTY cmd
Change-Id: I8fdcdc1a58926ec66a1dc5dc7a5e57ed4dceb4b4
-rw-r--r-- | include/osmo-pcap/osmo_pcap_server.h | 4 | ||||
-rw-r--r-- | src/osmo_server_main.c | 1 | ||||
-rw-r--r-- | src/osmo_server_network.c | 14 | ||||
-rw-r--r-- | src/osmo_server_vty.c | 12 |
4 files changed, 23 insertions, 8 deletions
diff --git a/include/osmo-pcap/osmo_pcap_server.h b/include/osmo-pcap/osmo_pcap_server.h index cdcdb70..a983ec5 100644 --- a/include/osmo-pcap/osmo_pcap_server.h +++ b/include/osmo-pcap/osmo_pcap_server.h @@ -48,8 +48,6 @@ struct osmo_pcap_server; #define STATE_INITIAL 0 #define STATE_DATA 1 -#define SERVER_MAX_DATA_SIZE 10000 - enum { PEER_CTR_CONNECT, PEER_CTR_BYTES, @@ -91,7 +89,6 @@ struct osmo_pcap_conn { int state; int pend; int reopen; - char buf[sizeof(struct osmo_pcap_data) + sizeof(struct osmo_pcap_pkthdr) + SERVER_MAX_DATA_SIZE]; struct osmo_pcap_data *data; /* statistics */ @@ -133,6 +130,7 @@ struct osmo_pcap_server { char *base_path; off_t max_size; + int max_snaplen; /* statistics */ struct rate_ctr_group *ctrg; diff --git a/src/osmo_server_main.c b/src/osmo_server_main.c index d95c994..3e399af 100644 --- a/src/osmo_server_main.c +++ b/src/osmo_server_main.c @@ -239,6 +239,7 @@ int main(int argc, char **argv) INIT_LLIST_HEAD(&pcap_server->conn); pcap_server->base_path = talloc_strdup(pcap_server, "./"); pcap_server->max_size = 1073741824; + pcap_server->max_snaplen = DEFAULT_SNAPLEN; vty_server_init(pcap_server); if (vty_read_config_file(config_file, NULL) < 0) { diff --git a/src/osmo_server_network.c b/src/osmo_server_network.c index 8eb7567..55934be 100644 --- a/src/osmo_server_network.c +++ b/src/osmo_server_network.c @@ -194,10 +194,10 @@ static int link_data(struct osmo_pcap_conn *conn, struct osmo_pcap_data *data) hdr = (struct pcap_file_header *) &data->data[0]; - if (hdr->snaplen > SERVER_MAX_DATA_SIZE) { + if (hdr->snaplen > conn->server->max_snaplen) { LOGP(DSERVER, LOGL_ERROR, "The recvd pcap_file_header contains too big snaplen %zu > %zu\n", - (size_t) hdr->snaplen, (size_t) SERVER_MAX_DATA_SIZE); + (size_t) hdr->snaplen, (size_t) conn->server->max_snaplen); return -1; } @@ -266,6 +266,7 @@ struct osmo_pcap_conn *osmo_pcap_server_find(struct osmo_pcap_server *server, { struct rate_ctr_group_desc *desc; struct osmo_pcap_conn *conn; + size_t buf_size; llist_for_each_entry(conn, &server->conn, entry) { if (strcmp(conn->name, name) == 0) @@ -279,6 +280,10 @@ struct osmo_pcap_conn *osmo_pcap_server_find(struct osmo_pcap_server *server, return NULL; } + buf_size = sizeof(struct osmo_pcap_data); + buf_size += OSMO_MAX(sizeof(struct pcap_file_header), + sizeof(struct osmo_pcap_pkthdr) + server->max_snaplen); + conn->data = talloc_zero_size(conn, buf_size); /* a bit nasty. we do not work with ids but names */ desc = talloc_zero(conn, struct rate_ctr_group_desc); if (!desc) { @@ -318,7 +323,6 @@ struct osmo_pcap_conn *osmo_pcap_server_find(struct osmo_pcap_server *server, conn->rem_wq.bfd.fd = -1; conn->local_fd = -1; conn->server = server; - conn->data = (struct osmo_pcap_data *) &conn->buf[0]; llist_add_tail(&conn->entry, &server->conn); return conn; } @@ -352,7 +356,7 @@ static bool pcap_data_valid(struct osmo_pcap_conn *conn) break; case PKT_LINK_DATA: min_len = sizeof(struct osmo_pcap_pkthdr); - max_len = SERVER_MAX_DATA_SIZE + sizeof(struct osmo_pcap_pkthdr); + max_len = conn->server->max_snaplen + sizeof(struct osmo_pcap_pkthdr); if (conn->data->len < min_len || conn->data->len > max_len) { LOGP(DSERVER, LOGL_ERROR, "Implausible data length: %u < %u <= %u\n", @@ -372,7 +376,7 @@ static int read_cb_initial(struct osmo_pcap_conn *conn) { int rc; - rc = do_read(conn, &conn->buf[sizeof(*conn->data) - conn->pend], conn->pend); + rc = do_read(conn, ((uint8_t*)conn->data) + sizeof(*conn->data) - conn->pend, conn->pend); if (rc <= 0) { LOGP(DSERVER, LOGL_ERROR, "Too short packet. Got %d, wanted %d\n", rc, conn->data->len); diff --git a/src/osmo_server_vty.c b/src/osmo_server_vty.c index d10ff51..e9b54b1 100644 --- a/src/osmo_server_vty.c +++ b/src/osmo_server_vty.c @@ -94,6 +94,8 @@ static int config_write_server(struct vty *vty) vty_out(vty, " server port %d%s", pcap_server->port, VTY_NEWLINE); vty_out(vty, " max-file-size %llu%s", (unsigned long long) pcap_server->max_size, VTY_NEWLINE); + if (pcap_server->max_snaplen != DEFAULT_SNAPLEN) + vty_out(vty, " server max-snaplen %d%s", pcap_server->max_snaplen, VTY_NEWLINE); if (pcap_server->zmq_port > 0) vty_out(vty, " zeromq-publisher %s %d%s", pcap_server->zmq_ip, pcap_server->zmq_port, VTY_NEWLINE); @@ -158,6 +160,15 @@ DEFUN(cfg_server_max_size, return CMD_SUCCESS; } +DEFUN(cfg_server_max_snaplen, + cfg_server_max_snaplen_cmd, + "max-snaplen <1-262144>", /* MAXIMUM_SNAPLEN */ + "Maximum pcap snapshot length\n" "Bytes\n") +{ + pcap_server->max_snaplen = atoi(argv[0]); + return CMD_SUCCESS; +} + static int manage_client(struct osmo_pcap_server *pcap_server, struct vty *vty, const char *name, const char *remote_host, @@ -511,6 +522,7 @@ void vty_server_init(struct osmo_pcap_server *server) install_element(SERVER_NODE, &cfg_server_ip_cmd); install_element(SERVER_NODE, &cfg_server_port_cmd); install_element(SERVER_NODE, &cfg_server_max_size_cmd); + install_element(SERVER_NODE, &cfg_server_max_snaplen_cmd); install_element(SERVER_NODE, &cfg_server_zmq_ip_port_cmd); install_element(SERVER_NODE, &cfg_no_server_zmq_ip_port_cmd); |