From: Martin Schwenke Date: Mon, 21 Mar 2016 00:07:19 +0000 (+1100) Subject: ctdb-system: Return window size and RST bit when reading TCP packets X-Git-Tag: tdb-1.3.9~33 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=bba31152df279ebf6afa6555544a990d64dbe4b1;p=thirdparty%2Fsamba.git ctdb-system: Return window size and RST bit when reading TCP packets Signed-off-by: Martin Schwenke Reviewed-by: Amitay Isaacs --- diff --git a/ctdb/common/system.h b/ctdb/common/system.h index 604b66d9ba7..2b469dc1fee 100644 --- a/ctdb/common/system.h +++ b/ctdb/common/system.h @@ -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); diff --git a/ctdb/common/system_aix.c b/ctdb/common/system_aix.c index 2d35a229aad..9b22ff9edc1 100644 --- a/ctdb/common/system_aix.c +++ b/ctdb/common/system_aix.c @@ -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; } diff --git a/ctdb/common/system_freebsd.c b/ctdb/common/system_freebsd.c index 37e4bae88a1..38450191c0f 100644 --- a/ctdb/common/system_freebsd.c +++ b/ctdb/common/system_freebsd.c @@ -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; } diff --git a/ctdb/common/system_gnu.c b/ctdb/common/system_gnu.c index e5b8e05cfed..70361d737fd 100644 --- a/ctdb/common/system_gnu.c +++ b/ctdb/common/system_gnu.c @@ -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; } diff --git a/ctdb/common/system_kfreebsd.c b/ctdb/common/system_kfreebsd.c index 4be678dcf94..9b5c9ce1ce9 100644 --- a/ctdb/common/system_kfreebsd.c +++ b/ctdb/common/system_kfreebsd.c @@ -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; } diff --git a/ctdb/common/system_linux.c b/ctdb/common/system_linux.c index 6d016993df1..b754e91a920 100644 --- a/ctdb/common/system_linux.c +++ b/ctdb/common/system_linux.c @@ -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; } diff --git a/ctdb/tools/ctdb_killtcp.c b/ctdb/tools/ctdb_killtcp.c index 5347849e0c5..f6b6a0e6dde 100644 --- a/ctdb/tools/ctdb_killtcp.c +++ b/ctdb/tools/ctdb_killtcp.c @@ -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; }