Просмотр исходного кода

totemknet: Move packet chsum - DO NOT MERGE - BREAKS ONWIRE (part 4)

Move chsum field to the beginning of the structure and check after
sendmsg.

Signed-off-by: Jan Friesse <jfriesse@redhat.com>
Jan Friesse 6 лет назад
Родитель
Сommit
885fabc887
2 измененных файлов с 10 добавлено и 4 удалено
  1. 9 3
      exec/totemknet.c
  2. 1 1
      include/corosync/totem/totem.h

+ 9 - 3
exec/totemknet.c

@@ -397,7 +397,7 @@ static inline void ucast_sendmsg (
 
 
 	header->target_nodeid = system_to->nodeid;
 	header->target_nodeid = system_to->nodeid;
 	header->expected_msg_size = msg_len;
 	header->expected_msg_size = msg_len;
-	header->chsum = compute_chsum((unsigned char *)msg + sizeof(struct totem_message_header), msg_len - sizeof(struct totem_message_header));
+	header->chsum = compute_chsum((unsigned char *)msg + sizeof(header->chsum), msg_len - sizeof(header->chsum));
 
 
 	iovec.iov_base = (void *)msg;
 	iovec.iov_base = (void *)msg;
 	iovec.iov_len = msg_len;
 	iovec.iov_len = msg_len;
@@ -434,6 +434,8 @@ static inline void ucast_sendmsg (
 		KNET_LOGSYS_PERROR (errno, instance->totemknet_log_level_debug,
 		KNET_LOGSYS_PERROR (errno, instance->totemknet_log_level_debug,
 				    "sendmsg(ucast) failed (non-critical)");
 				    "sendmsg(ucast) failed (non-critical)");
 	}
 	}
+
+	assert(header->chsum == compute_chsum((unsigned char *)msg + sizeof(header->chsum), msg_len - sizeof(header->chsum)));
 }
 }
 
 
 static inline void mcast_sendmsg (
 static inline void mcast_sendmsg (
@@ -452,7 +454,7 @@ static inline void mcast_sendmsg (
 
 
 	header->target_nodeid = 0;
 	header->target_nodeid = 0;
 	header->expected_msg_size = msg_len;
 	header->expected_msg_size = msg_len;
-	header->chsum = compute_chsum((unsigned char *)msg + sizeof(struct totem_message_header), msg_len - sizeof(struct totem_message_header));
+	header->chsum = compute_chsum((unsigned char *)msg + sizeof(header->chsum), msg_len - sizeof(header->chsum));
 
 
 	/*
 	/*
 	 * Build multicast message
 	 * Build multicast message
@@ -484,6 +486,8 @@ static inline void mcast_sendmsg (
 		knet_log_printf (LOGSYS_LEVEL_DEBUG, "totemknet: mcast_send sendmsg returned %d", res);
 		knet_log_printf (LOGSYS_LEVEL_DEBUG, "totemknet: mcast_send sendmsg returned %d", res);
 	}
 	}
 
 
+	assert(header->chsum == compute_chsum((unsigned char *)msg + sizeof(header->chsum), msg_len - sizeof(header->chsum)));
+
 	if (!only_active || instance->send_merge_detect_message) {
 	if (!only_active || instance->send_merge_detect_message) {
 		/*
 		/*
 		 * Current message was sent to all nodes
 		 * Current message was sent to all nodes
@@ -491,6 +495,8 @@ static inline void mcast_sendmsg (
 		instance->merge_detect_messages_sent_before_timeout++;
 		instance->merge_detect_messages_sent_before_timeout++;
 		instance->send_merge_detect_message = 0;
 		instance->send_merge_detect_message = 0;
 	}
 	}
+
+	assert(header->chsum == compute_chsum((unsigned char *)msg + sizeof(header->chsum), msg_len - sizeof(header->chsum)));
 }
 }
 
 
 static int node_compare(const void *aptr, const void *bptr)
 static int node_compare(const void *aptr, const void *bptr)
@@ -772,7 +778,7 @@ static int data_deliver_fn (
 		assert(0);
 		assert(0);
 	}
 	}
 
 
-	if (header->chsum != compute_chsum((unsigned char *)instance->iov_buffer + sizeof(struct totem_message_header), msg_len - sizeof(struct totem_message_header))) {
+	if (header->chsum != compute_chsum((unsigned char *)instance->iov_buffer + sizeof(header->chsum), msg_len - sizeof(header->chsum))) {
 		knet_log_printf(instance->totemknet_log_level_error,
 		knet_log_printf(instance->totemknet_log_level_error,
 				"Received message doesn't have expected chsum");
 				"Received message doesn't have expected chsum");
 
 

+ 1 - 1
include/corosync/totem/totem.h

@@ -122,6 +122,7 @@ struct totem_logging_configuration {
 #define TOTEM_MH_VERSION	0x03
 #define TOTEM_MH_VERSION	0x03
 
 
 struct totem_message_header {
 struct totem_message_header {
+	uint32_t chsum;
 	unsigned short magic;
 	unsigned short magic;
 	char version;
 	char version;
 	char type;
 	char type;
@@ -129,7 +130,6 @@ struct totem_message_header {
 	unsigned int nodeid;
 	unsigned int nodeid;
 	unsigned int target_nodeid;
 	unsigned int target_nodeid;
 	unsigned int expected_msg_size;
 	unsigned int expected_msg_size;
-	uint32_t chsum;
 } __attribute__((packed));
 } __attribute__((packed));
 
 
 enum {
 enum {