From 15418696eaa4ce2f4b1abe0e705dfa759572084d Mon Sep 17 00:00:00 2001 From: Patrick Huesmann Date: Wed, 27 Jan 2021 13:30:26 +0100 Subject: [PATCH] Refactor bridging level detection to dedicated function Signed-off-by: Patrick Huesmann --- include/ipmitool/ipmi_intf.h | 1 + src/plugins/ipmi_intf.c | 35 +++++++++++++++++++++------- src/plugins/serial/serial_basic.c | 13 +---------- src/plugins/serial/serial_terminal.c | 13 +---------- 4 files changed, 30 insertions(+), 32 deletions(-) diff --git a/include/ipmitool/ipmi_intf.h b/include/ipmitool/ipmi_intf.h index ed16612..49a9ecd 100644 --- a/include/ipmitool/ipmi_intf.h +++ b/include/ipmitool/ipmi_intf.h @@ -242,6 +242,7 @@ struct ipmi_intf { uint16_t ipmi_intf_get_max_request_data_size(struct ipmi_intf *intf); uint16_t ipmi_intf_get_max_response_data_size(struct ipmi_intf *intf); +uint8_t ipmi_intf_get_bridging_level(const struct ipmi_intf *intf); struct ipmi_intf * ipmi_intf_load(char * name); void ipmi_intf_print(struct ipmi_intf_support * intflist); diff --git a/src/plugins/ipmi_intf.c b/src/plugins/ipmi_intf.c index 501d4b0..e424a64 100644 --- a/src/plugins/ipmi_intf.c +++ b/src/plugins/ipmi_intf.c @@ -502,6 +502,7 @@ uint16_t ipmi_intf_get_max_request_data_size(struct ipmi_intf * intf) { int16_t size; + uint8_t bridging_level = ipmi_intf_get_bridging_level(intf); size = intf->max_request_data_size; @@ -521,14 +522,14 @@ ipmi_intf_get_max_request_data_size(struct ipmi_intf * intf) size = IPMI_DEFAULT_PAYLOAD_SIZE; /* check if message is forwarded */ - if (intf->target_addr && intf->target_addr != intf->my_addr) { + if (bridging_level) { /* add Send Message request size */ size += 8; } } /* check if message is forwarded */ - if (intf->target_addr && intf->target_addr != intf->my_addr) { + if (bridging_level) { /* subtract send message request size */ size -= 8; @@ -541,8 +542,7 @@ ipmi_intf_get_max_request_data_size(struct ipmi_intf * intf) } /* check for double bridging */ - if (intf->transit_addr && - (intf->transit_addr != intf->target_addr || intf->transit_channel != intf->target_channel) { + if (bridging_level == 2) { /* subtract inner send message request size */ size -= 8; } @@ -560,6 +560,7 @@ uint16_t ipmi_intf_get_max_response_data_size(struct ipmi_intf * intf) { int16_t size; + uint8_t bridging_level = ipmi_intf_get_bridging_level(intf); size = intf->max_response_data_size; @@ -579,14 +580,14 @@ ipmi_intf_get_max_response_data_size(struct ipmi_intf * intf) size = IPMI_DEFAULT_PAYLOAD_SIZE; /* response length with subtracted header and checksum byte */ /* check if message is forwarded */ - if (intf->target_addr && intf->target_addr != intf->my_addr) { + if (bridging_level) { /* add Send Message header size */ size += 7; } } /* check if message is forwarded */ - if (intf->target_addr && intf->target_addr != intf->my_addr) { + if (bridging_level) { /* * Some IPMI controllers like PICMG AMC Carriers embed responses * to the forwarded messages into the Send Message response. @@ -604,8 +605,7 @@ ipmi_intf_get_max_response_data_size(struct ipmi_intf * intf) } /* check for double bridging */ - if (intf->transit_addr && - (intf->transit_addr != intf->target_addr || intf->transit_channel != intf->target_channel) { + if (bridging_level == 2) { /* subtract inner send message header size */ size -= 8; } @@ -619,6 +619,25 @@ ipmi_intf_get_max_response_data_size(struct ipmi_intf * intf) return size; } +uint8_t +ipmi_intf_get_bridging_level(const struct ipmi_intf *intf) +{ + uint8_t bridging_level; + + if (intf->target_addr && (intf->target_addr != intf->my_addr)) { + if (intf->transit_addr && + (intf->transit_addr != intf->target_addr || intf->transit_channel != intf->target_channel)) { + bridging_level = 2; + } else { + bridging_level = 1; + } + } else { + bridging_level = 0; + } + + return bridging_level; +} + void ipmi_intf_set_max_request_data_size(struct ipmi_intf * intf, uint16_t size) { diff --git a/src/plugins/serial/serial_basic.c b/src/plugins/serial/serial_basic.c index 69a21ea..e134c9c 100644 --- a/src/plugins/serial/serial_basic.c +++ b/src/plugins/serial/serial_basic.c @@ -612,18 +612,7 @@ serial_bm_build_msg(const struct ipmi_intf * intf, uint8_t * data = msg, seq; struct ipmb_msg_hdr * hdr = (struct ipmb_msg_hdr *) msg; struct ipmi_send_message_rq * inner_rq = NULL, * outer_rq = NULL; - int bridging_level; - - /* acquire bridging level */ - if (intf->target_addr && intf->target_addr != intf->my_addr) { - if (intf->transit_addr != 0) { - bridging_level = 2; - } else { - bridging_level = 1; - } - } else { - bridging_level = 0; - } + int bridging_level = ipmi_intf_get_bridging_level(intf); /* check overall packet length */ if(req->msg.data_len + 7 + bridging_level * 8 > max_len) { diff --git a/src/plugins/serial/serial_terminal.c b/src/plugins/serial/serial_terminal.c index fcc7410..fe8fe38 100644 --- a/src/plugins/serial/serial_terminal.c +++ b/src/plugins/serial/serial_terminal.c @@ -473,18 +473,7 @@ serial_term_build_msg(const struct ipmi_intf * intf, struct serial_term_hdr * term_hdr = (struct serial_term_hdr *) msg; struct ipmi_send_message_rq * outer_rq = NULL; struct ipmi_send_message_rq * inner_rq = NULL; - int bridging_level; - - /* acquire bridging level */ - if (intf->target_addr && intf->target_addr != intf->my_addr) { - if (intf->transit_addr != 0) { - bridging_level = 2; - } else { - bridging_level = 1; - } - } else { - bridging_level = 0; - } + int bridging_level = ipmi_intf_get_bridging_level(intf); /* check overall packet length */ if(req->msg.data_len + 3 + bridging_level * 8 > max_len) {