summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRonnie Sahlberg <sahlberg@ronnie>2007-07-04 13:32:38 +1000
committerRonnie Sahlberg <sahlberg@ronnie>2007-07-04 13:32:38 +1000
commit8f0a00b72b0218245acf23566c2cb03311c5e4fb (patch)
tree51a16b5e66d0537c5bd599e09c8eff7d7a728958
parentedcab7e0681eeaf9e65089698bde432d13afc7ac (diff)
downloadsamba-8f0a00b72b0218245acf23566c2cb03311c5e4fb.tar.gz
samba-8f0a00b72b0218245acf23566c2cb03311c5e4fb.tar.xz
samba-8f0a00b72b0218245acf23566c2cb03311c5e4fb.zip
change the signature for ctdb_sys_send_ack() to ctdb_sys_send_tcp()
to make it possible to provide which seq/ack numbers to use and also whether the RST flag should be set. update all callers to the new signature (This used to be ctdb commit b694d7d4a6f3865a18bea8f484ba690e4ae7546c)
-rw-r--r--ctdb/include/ctdb_private.h5
-rw-r--r--ctdb/takeover/ctdb_takeover.c2
-rw-r--r--ctdb/takeover/system.c15
3 files changed, 16 insertions, 6 deletions
diff --git a/ctdb/include/ctdb_private.h b/ctdb/include/ctdb_private.h
index bce24343af..7f1c5e30c6 100644
--- a/ctdb/include/ctdb_private.h
+++ b/ctdb/include/ctdb_private.h
@@ -981,8 +981,9 @@ int ctdb_ctrl_get_public_ips(struct ctdb_context *ctdb,
/* from takeover/system.c */
int ctdb_sys_send_arp(const struct sockaddr_in *saddr, const char *iface);
bool ctdb_sys_have_ip(const char *ip);
-int ctdb_sys_send_ack(const struct sockaddr_in *dest,
- const struct sockaddr_in *src);
+int ctdb_sys_send_tcp(const struct sockaddr_in *dest,
+ const struct sockaddr_in *src,
+ uint32_t seq, uint32_t ack, int rst);
int ctdb_set_public_addresses(struct ctdb_context *ctdb, const char *alist);
int ctdb_set_event_script(struct ctdb_context *ctdb, const char *script);
diff --git a/ctdb/takeover/ctdb_takeover.c b/ctdb/takeover/ctdb_takeover.c
index 7f84eaedaa..14d4adaae7 100644
--- a/ctdb/takeover/ctdb_takeover.c
+++ b/ctdb/takeover/ctdb_takeover.c
@@ -83,7 +83,7 @@ static void ctdb_control_send_arp(struct event_context *ev, struct timed_event *
(unsigned)ntohs(tcp->daddr.sin_port),
inet_ntoa(tcp->saddr.sin_addr),
(unsigned)ntohs(tcp->saddr.sin_port)));
- ret = ctdb_sys_send_ack(&tcp->saddr, &tcp->daddr);
+ ret = ctdb_sys_send_tcp(&tcp->saddr, &tcp->daddr, 0, 0, 0);
if (ret != 0) {
DEBUG(0,(__location__ " Failed to send tcp tickle ack for %s\n",
inet_ntoa(tcp->saddr.sin_addr)));
diff --git a/ctdb/takeover/system.c b/ctdb/takeover/system.c
index 7cd4dbcc7d..74a860a918 100644
--- a/ctdb/takeover/system.c
+++ b/ctdb/takeover/system.c
@@ -174,15 +174,19 @@ static uint16_t tcp_checksum(uint16_t *data, size_t n, struct iphdr *ip)
}
/*
- send tcp ack packet from the specified IP/port to the specified
+ Send tcp segment from the specified IP/port to the specified
destination IP/port.
This is used to trigger the receiving host into sending its own ACK,
which should trigger early detection of TCP reset by the client
after IP takeover
+
+ This can also be used to send RST segments (if rst is true) and also
+ if correct seq and ack numbers are provided.
*/
-int ctdb_sys_send_ack(const struct sockaddr_in *dest,
- const struct sockaddr_in *src)
+int ctdb_sys_send_tcp(const struct sockaddr_in *dest,
+ const struct sockaddr_in *src,
+ uint32_t seq, uint32_t ack, int rst)
{
int s, ret;
uint32_t one = 1;
@@ -224,7 +228,12 @@ int ctdb_sys_send_ack(const struct sockaddr_in *dest,
pkt.tcp.source = src->sin_port;
pkt.tcp.dest = dest->sin_port;
+ pkt.tcp.seq = seq;
+ pkt.tcp.ack_seq = ack;
pkt.tcp.ack = 1;
+ if (rst) {
+ pkt.tcp.rst = 1;
+ }
pkt.tcp.doff = sizeof(pkt.tcp)/4;
pkt.tcp.window = htons(1234);
pkt.tcp.check = tcp_checksum((uint16_t *)&pkt.tcp, sizeof(pkt.tcp), &pkt.ip);