From 64ce47955778805afceb6ced58b63839763541ad Mon Sep 17 00:00:00 2001 From: Pablo Neira Ayuso Date: Sun, 2 Nov 2008 21:29:04 +0100 Subject: network: add protocol version field (breaks backward compatibility) This patch adds the version field (8-bits long) to the nethdr structure. This fields can be used to indicate the protocol version in case that we detect an incompatibility between two conntrackd daemons working with different protocol versions. Unfortunately, this patch breaks backward compatibility, ie. conntrackd <= 0.9.8 protocol is not compatible with the upcoming conntrackd >= 0.9.9. Better do this now than later. Signed-off-by: Pablo Neira Ayuso --- src/network.c | 4 ++-- src/sync-ftfw.c | 11 ++++------- src/sync-mode.c | 8 +++++++- 3 files changed, 13 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/network.c b/src/network.c index 7d1d9fa..04c9d39 100644 --- a/src/network.c +++ b/src/network.c @@ -32,8 +32,7 @@ static size_t __do_send(struct mcast_sock *m, void *data, size_t len) struct nethdr *net = data; debug("send sq: %u fl:%u len:%u\n", - ntohl(net->seq), ntohs(net->flags), - ntohs(net->len)); + ntohl(net->seq), net->flags, ntohs(net->len)); return mcast_send(m, net, len); } @@ -46,6 +45,7 @@ static size_t __do_prepare(struct mcast_sock *m, void *data, size_t len) seq_set = 1; cur_seq = time(NULL); } + net->version = CONNTRACKD_PROTOCOL_VERSION; net->len = len; net->seq = cur_seq++; HDR_HOST2NETWORK(net); diff --git a/src/sync-ftfw.c b/src/sync-ftfw.c index ed97ceb..598945f 100644 --- a/src/sync-ftfw.c +++ b/src/sync-ftfw.c @@ -477,14 +477,12 @@ static void ftfw_send(struct nethdr *net, struct us_conntrack *u) hello_state = HELLO_SAY; /* fall through */ case HELLO_SAY: - net->flags = ntohs(net->flags) | NET_F_HELLO; - net->flags = htons(net->flags); + net->flags |= NET_F_HELLO; break; } if (say_hello_back) { - net->flags = ntohs(net->flags) | NET_F_HELLO_BACK; - net->flags = htons(net->flags); + net->flags |= NET_F_HELLO_BACK; say_hello_back = 0; } @@ -501,7 +499,7 @@ static int tx_queue_xmit(void *data1, const void *data2) size_t len = prepare_send_netmsg(STATE_SYNC(mcast_client), net); dp("tx_queue sq: %u fl:%u len:%u\n", - ntohl(net->seq), ntohs(net->flags), ntohs(net->len)); + ntohl(net->seq), net->flags, ntohs(net->len)); mcast_buffered_send_netmsg(STATE_SYNC(mcast_client), net, len); HDR_NETWORK2HOST(net); @@ -521,8 +519,7 @@ static int tx_list_xmit(struct list_head *i, struct us_conntrack *u, int type) size_t len = prepare_send_netmsg(STATE_SYNC(mcast_client), net); dp("tx_list sq: %u fl:%u len:%u\n", - ntohl(net->seq), ntohs(net->flags), - ntohs(net->len)); + ntohl(net->seq), net->flags, ntohs(net->len)); list_del_init(i); tx_list_len--; diff --git a/src/sync-mode.c b/src/sync-mode.c index 4c22745..152a8e2 100644 --- a/src/sync-mode.c +++ b/src/sync-mode.c @@ -41,6 +41,12 @@ static void do_mcast_handler_step(struct nethdr *net, size_t remain) struct nf_conntrack *ct = (struct nf_conntrack *)(void*) __ct; struct us_conntrack *u; + if (net->version != CONNTRACKD_PROTOCOL_VERSION) { + STATE(malformed)++; + dlog(LOG_WARNING, "wrong protocol version `%u'", net->version); + return; + } + switch (STATE_SYNC(sync)->recv(net)) { case MSG_DATA: break; @@ -144,7 +150,7 @@ static void mcast_handler(void) } debug("recv sq: %u fl:%u len:%u (rem:%d)\n", - ntohl(net->seq), ntohs(net->flags), + ntohl(net->seq), net->flags, ntohs(net->len), remain); HDR_NETWORK2HOST(net); -- cgit v1.2.3