summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Huesmann <info@patrick-huesmann.de>2021-01-27 13:30:26 +0100
committerAlexander Amelkin <mocbuhtig@amelkin.msk.ru>2021-09-15 16:39:55 +0300
commit15418696eaa4ce2f4b1abe0e705dfa759572084d (patch)
tree7ede8e7a3bcc9fd4eab77e9e12ca9170c354f39c
parent7c47cf75f415df17539e38ec8aac740ae0d05e9d (diff)
downloadipmitool-15418696eaa4ce2f4b1abe0e705dfa759572084d.tar.gz
Refactor bridging level detection to dedicated function
Signed-off-by: Patrick Huesmann <info@patrick-huesmann.de>
-rw-r--r--include/ipmitool/ipmi_intf.h1
-rw-r--r--src/plugins/ipmi_intf.c35
-rw-r--r--src/plugins/serial/serial_basic.c13
-rw-r--r--src/plugins/serial/serial_terminal.c13
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) {