aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2018-10-08 19:15:53 +0200
committerPau Espin Pedrol <pespin@sysmocom.de>2018-10-08 20:20:43 +0200
commita82aaef5070e6f5988656cb0767e62d8ea6a7269 (patch)
tree899c2f60fc4ef0e50c84efe133a4e34bf9315c1d
parent868a5012131fbcc47dbb45a1cfcc464e49f97b28 (diff)
server: Add pcap snaplen VTY cmd
-rw-r--r--include/osmo-pcap/osmo_pcap_server.h4
-rw-r--r--src/osmo_server_main.c1
-rw-r--r--src/osmo_server_network.c14
-rw-r--r--src/osmo_server_vty.c12
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);