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);
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;
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
*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;
}
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
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) {
*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;
}
/*
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
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) {
*ack_seq = tcp->ack_seq;
*seq = tcp->seq;
+ if (window != NULL) {
+ *window = tcp->window;
+ }
+ if (rst != NULL) {
+ *rst = tcp->rst;
+ }
return 0;
}
/*
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
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) {
*ack_seq = tcp->ack_seq;
*seq = tcp->seq;
+ if (window != NULL) {
+ *window = tcp->window;
+ }
+ if (rst != NULL) {
+ *rst = tcp->rst;
+ }
return 0;
}
/*
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
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) {
*ack_seq = tcp->ack_seq;
*seq = tcp->seq;
+ if (window != NULL) {
+ *window = tcp->window;
+ }
+ if (rst != NULL) {
+ *rst = tcp->rst;
+ }
return 0;
}
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;
}