ctdb-system: Return window size and RST bit when reading TCP packets
authorMartin Schwenke <martin@meltin.net>
Mon, 21 Mar 2016 00:07:19 +0000 (11:07 +1100)
committerAmitay Isaacs <amitay@samba.org>
Fri, 1 Apr 2016 02:42:12 +0000 (04:42 +0200)
Signed-off-by: Martin Schwenke <martin@meltin.net>
Reviewed-by: Amitay Isaacs <amitay@gmail.com>
ctdb/common/system.h
ctdb/common/system_aix.c
ctdb/common/system_freebsd.c
ctdb/common/system_gnu.c
ctdb/common/system_kfreebsd.c
ctdb/common/system_linux.c
ctdb/tools/ctdb_killtcp.c

index 604b66d9ba787be9b3237fce402d3376df8fd96f..2b469dc1fee154553f1807c6436661156b5effbf 100644 (file)
@@ -37,8 +37,9 @@ int ctdb_sys_send_tcp(const ctdb_sock_addr *dest,
 int ctdb_sys_open_capture_socket(const char *iface, void **private_data);
 int ctdb_sys_close_capture_socket(void *private_data);
 int ctdb_sys_read_tcp_packet(int s, void *private_data,
-                       ctdb_sock_addr *src, ctdb_sock_addr *dst,
-                       uint32_t *ack_seq, uint32_t *seq);
+                            ctdb_sock_addr *src, ctdb_sock_addr *dst,
+                            uint32_t *ack_seq, uint32_t *seq,
+                            int *rst, uint16_t *window);
 bool ctdb_sys_check_iface_exists(const char *iface);
 int ctdb_get_peer_pid(const int fd, pid_t *peer_pid);
 
index 2d35a229aade570aff6f65e92b4f08aa268fca88..9b22ff9edc12e7b2208f29b48dbfe6631238fb8c 100644 (file)
@@ -269,9 +269,10 @@ static int aix_get_mac_addr(const char *device_name, uint8_t mac[6])
        return -1;
 }
 
-int ctdb_sys_read_tcp_packet(int s, void *private_data, 
-                       ctdb_sock_addr *src, ctdb_sock_addr *dst,
-                       uint32_t *ack_seq, uint32_t *seq)
+int ctdb_sys_read_tcp_packet(int s, void *private_data,
+                            ctdb_sock_addr *src, ctdb_sock_addr *dst,
+                            uint32_t *ack_seq, uint32_t *seq,
+                            int *rst, uint16_t *window)
 {
        int ret;
        struct ether_header *eth;
@@ -326,7 +327,12 @@ int ctdb_sys_read_tcp_packet(int s, void *private_data,
                dst->ip.sin_port        = tcp->th_dport;
                *ack_seq                = tcp->th_ack;
                *seq                    = tcp->th_seq;
-
+               if (window != NULL) {
+                       *window = tcp->th_win;
+               }
+               if (rst != NULL) {
+                       *rst = tcp->th_flags & TH_RST;
+               }
 
                return 0;
 #ifndef ETHERTYPE_IP6
@@ -355,6 +361,12 @@ int ctdb_sys_read_tcp_packet(int s, void *private_data,
 
                *ack_seq             = tcp->th_ack;
                *seq                 = tcp->th_seq;
+               if (window != NULL) {
+                       *window = tcp->th_win;
+               }
+               if (rst != NULL) {
+                       *rst = tcp->th_flags & TH_RST;
+               }
 
                return 0;
        }
index 37e4bae88a16dee26e410bbbd706d19f844cc2ec..38450191c0f35e294b99918379ae0056e40157c9 100644 (file)
@@ -278,8 +278,9 @@ int ctdb_sys_close_capture_socket(void *private_data)
   called when the raw socket becomes readable
  */
 int ctdb_sys_read_tcp_packet(int s, void *private_data, 
-                       ctdb_sock_addr *src, ctdb_sock_addr *dst,
-                       uint32_t *ack_seq, uint32_t *seq)
+                            ctdb_sock_addr *src, ctdb_sock_addr *dst,
+                            uint32_t *ack_seq, uint32_t *seq,
+                            int *rst, uint16_t *window)
 {
        int ret;
 #define RCVPKTSIZE 100
@@ -332,6 +333,12 @@ int ctdb_sys_read_tcp_packet(int s, void *private_data,
                dst->ip.sin_port        = tcp->th_dport;
                *ack_seq                = tcp->th_ack;
                *seq                    = tcp->th_seq;
+               if (window != NULL) {
+                       *window = tcp->th_win;
+               }
+               if (rst != NULL) {
+                       *rst = tcp->th_flags & TH_RST;
+               }
 
                return 0;
        } else if (ntohs(eth->ether_type) == ETHERTYPE_IP6) {
@@ -357,6 +364,12 @@ int ctdb_sys_read_tcp_packet(int s, void *private_data,
 
                *ack_seq             = tcp->th_ack;
                *seq                 = tcp->th_seq;
+               if (window != NULL) {
+                       *window = tcp->th_win;
+               }
+               if (rst != NULL) {
+                       *rst = tcp->th_flags & TH_RST;
+               }
 
                return 0;
        }
index e5b8e05cfed47f7c12b7710d53d8ec397712c8d6..70361d737fd9beab35b63e2d71bef6e3f608ab57 100644 (file)
@@ -270,9 +270,10 @@ int ctdb_sys_close_capture_socket(void *private_data)
 /*
   called when the raw socket becomes readable
  */
-int ctdb_sys_read_tcp_packet(int s, void *private_data, 
-                       ctdb_sock_addr *src, ctdb_sock_addr *dst,
-                       uint32_t *ack_seq, uint32_t *seq)
+int ctdb_sys_read_tcp_packet(int s, void *private_data,
+                            ctdb_sock_addr *src, ctdb_sock_addr *dst,
+                            uint32_t *ack_seq, uint32_t *seq,
+                            int *rst, uint16_t *window)
 {
        int ret;
 #define RCVPKTSIZE 100
@@ -325,6 +326,12 @@ int ctdb_sys_read_tcp_packet(int s, void *private_data,
                dst->ip.sin_port        = tcp->dest;
                *ack_seq                = tcp->ack_seq;
                *seq                    = tcp->seq;
+               if (window != NULL) {
+                       *window = tcp->window;
+               }
+               if (rst != NULL) {
+                       *rst = tcp->rst;
+               }
 
                return 0;
        } else if (ntohs(eth->ether_type) == ETHERTYPE_IP6) {
@@ -350,6 +357,12 @@ int ctdb_sys_read_tcp_packet(int s, void *private_data,
 
                *ack_seq             = tcp->ack_seq;
                *seq                 = tcp->seq;
+               if (window != NULL) {
+                       *window = tcp->window;
+               }
+               if (rst != NULL) {
+                       *rst = tcp->rst;
+               }
 
                return 0;
        }
index 4be678dcf9466e5a3e4a831dd3b314fc0d202286..9b5c9ce1ce9d2f069e37bb85829785af7f252848 100644 (file)
@@ -270,9 +270,10 @@ int ctdb_sys_close_capture_socket(void *private_data)
 /*
   called when the raw socket becomes readable
  */
-int ctdb_sys_read_tcp_packet(int s, void *private_data, 
-                       ctdb_sock_addr *src, ctdb_sock_addr *dst,
-                       uint32_t *ack_seq, uint32_t *seq)
+int ctdb_sys_read_tcp_packet(int s, void *private_data,
+                            ctdb_sock_addr *src, ctdb_sock_addr *dst,
+                            uint32_t *ack_seq, uint32_t *seq,
+                            int *rst, uint16_t *window)
 {
        int ret;
 #define RCVPKTSIZE 100
@@ -325,6 +326,12 @@ int ctdb_sys_read_tcp_packet(int s, void *private_data,
                dst->ip.sin_port        = tcp->dest;
                *ack_seq                = tcp->ack_seq;
                *seq                    = tcp->seq;
+               if (window != NULL) {
+                       *window = tcp->window;
+               }
+               if (rst != NULL) {
+                       *rst = tcp->rst;
+               }
 
                return 0;
        } else if (ntohs(eth->ether_type) == ETHERTYPE_IP6) {
@@ -350,6 +357,12 @@ int ctdb_sys_read_tcp_packet(int s, void *private_data,
 
                *ack_seq             = tcp->ack_seq;
                *seq                 = tcp->seq;
+               if (window != NULL) {
+                       *window = tcp->window;
+               }
+               if (rst != NULL) {
+                       *rst = tcp->rst;
+               }
 
                return 0;
        }
index 6d016993df1edbf4956d8527947db5e6a41470c5..b754e91a92035bfc32fab5db7530df6d976b5a40 100644 (file)
@@ -488,9 +488,10 @@ int ctdb_sys_close_capture_socket(void *private_data)
 /*
   called when the raw socket becomes readable
  */
-int ctdb_sys_read_tcp_packet(int s, void *private_data, 
-                       ctdb_sock_addr *src, ctdb_sock_addr *dst,
-                       uint32_t *ack_seq, uint32_t *seq)
+int ctdb_sys_read_tcp_packet(int s, void *private_data,
+                            ctdb_sock_addr *src, ctdb_sock_addr *dst,
+                            uint32_t *ack_seq, uint32_t *seq,
+                            int *rst, uint16_t *window)
 {
        int ret;
 #define RCVPKTSIZE 100
@@ -543,6 +544,12 @@ int ctdb_sys_read_tcp_packet(int s, void *private_data,
                dst->ip.sin_port        = tcp->dest;
                *ack_seq                = tcp->ack_seq;
                *seq                    = tcp->seq;
+               if (window != NULL) {
+                       *window = tcp->window;
+               }
+               if (rst != NULL) {
+                       *rst = tcp->rst;
+               }
 
                return 0;
        } else if (ntohs(eth->ether_type) == ETHERTYPE_IP6) {
@@ -568,6 +575,12 @@ int ctdb_sys_read_tcp_packet(int s, void *private_data,
 
                *ack_seq             = tcp->ack_seq;
                *seq                 = tcp->seq;
+               if (window != NULL) {
+                       *window = tcp->window;
+               }
+               if (rst != NULL) {
+                       *rst = tcp->rst;
+               }
 
                return 0;
        }
index 5347849e0c553f6b54f349e57c17b98e28c21c6e..f6b6a0e6ddec5229e00a641723b3abe379117b9c 100644 (file)
@@ -113,11 +113,13 @@ static void capture_tcp_handler(struct tevent_context *ev,
        struct ctdb_killtcp_con *con;
        ctdb_sock_addr src, dst;
        uint32_t ack_seq, seq;
+       int rst;
+       uint16_t window;
 
        if (ctdb_sys_read_tcp_packet(killtcp->capture_fd,
-                               killtcp->private_data,
-                               &src, &dst,
-                               &ack_seq, &seq) != 0) {
+                                    killtcp->private_data,
+                                    &src, &dst,
+                                    &ack_seq, &seq, &rst, &window) != 0) {
                /* probably a non-tcp ACK packet */
                return;
        }