From 69634a6f7a0b82c28a229a8939407b7f14ce6561 Mon Sep 17 00:00:00 2001 From: Jeremy Kerr Date: Thu, 26 Jun 2025 11:01:45 +0800 Subject: [PATCH 1/3] Add .clang-format, prepare for a tree-wide reformat Add a .clang-format, heavily based on the Linux kernel definitions. We only include src/, as lib/ contains imported sources, and we would prefer minimal divergence from their upstream. Signed-off-by: Jeremy Kerr --- .clang-format | 113 ++++++++++++++++++++++++++++++++++++++++++ .clang-format-include | 1 + src/mctp.c | 2 + src/mctpd.c | 4 ++ 4 files changed, 120 insertions(+) create mode 100644 .clang-format create mode 100644 .clang-format-include diff --git a/.clang-format b/.clang-format new file mode 100644 index 00000000..e73430e1 --- /dev/null +++ b/.clang-format @@ -0,0 +1,113 @@ +# SPDX-License-Identifier: GPL-2.0 +# +# clang-format configuration file. Intended for clang-format >= 11. +# +# Based on Linux kernel .clang-format definitions. +--- +AccessModifierOffset: -4 +AlignAfterOpenBracket: Align +AlignConsecutiveAssignments: false +AlignConsecutiveDeclarations: false +AlignEscapedNewlines: Left +AlignOperands: true +AlignTrailingComments: false +AllowAllParametersOfDeclarationOnNextLine: false +AllowShortBlocksOnASingleLine: false +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: None +AllowShortIfStatementsOnASingleLine: false +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: false +BinPackArguments: true +BinPackParameters: true +BraceWrapping: + AfterClass: false + AfterControlStatement: false + AfterEnum: false + AfterFunction: true + AfterNamespace: true + AfterObjCDeclaration: false + AfterStruct: false + AfterUnion: false + AfterExternBlock: false + BeforeCatch: false + BeforeElse: false + IndentBraces: false + SplitEmptyFunction: true + SplitEmptyRecord: true + SplitEmptyNamespace: true +BreakBeforeBinaryOperators: None +BreakBeforeBraces: Custom +BreakBeforeInheritanceComma: false +BreakBeforeTernaryOperators: false +BreakConstructorInitializersBeforeComma: false +BreakConstructorInitializers: BeforeComma +BreakAfterJavaFieldAnnotations: false +BreakStringLiterals: false +ColumnLimit: 80 +CommentPragmas: '^ IWYU pragma:' +CompactNamespaces: false +ConstructorInitializerAllOnOneLineOrOnePerLine: false +ConstructorInitializerIndentWidth: 8 +ContinuationIndentWidth: 8 +Cpp11BracedListStyle: false +DerivePointerAlignment: false +DisableFormat: false +ExperimentalAutoDetectBinPacking: false +FixNamespaceComments: false +IncludeBlocks: Preserve +IncludeCategories: + - Regex: '.*' + Priority: 1 +IncludeIsMainRegex: '(Test)?$' +IndentCaseLabels: false +IndentGotoLabels: false +IndentPPDirectives: None +IndentWidth: 8 +IndentWrappedFunctionNames: false +JavaScriptQuotes: Leave +JavaScriptWrapImports: true +KeepEmptyLinesAtTheStartOfBlocks: false +MacroBlockBegin: '' +MacroBlockEnd: '' +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: None +ObjCBinPackProtocolList: Auto +ObjCBlockIndentWidth: 8 +ObjCSpaceAfterProperty: true +ObjCSpaceBeforeProtocolList: true + +# Taken from git's rules +PenaltyBreakAssignment: 10 +PenaltyBreakBeforeFirstCallParameter: 30 +PenaltyBreakComment: 10 +PenaltyBreakFirstLessLess: 0 +PenaltyBreakString: 10 +PenaltyExcessCharacter: 100 +PenaltyReturnTypeOnItsOwnLine: 60 + +PointerAlignment: Right +ReflowComments: false +SortIncludes: false +SortUsingDeclarations: false +SpaceAfterCStyleCast: false +SpaceAfterTemplateKeyword: true +SpaceBeforeAssignmentOperators: true +SpaceBeforeCtorInitializerColon: true +SpaceBeforeInheritanceColon: true +SpaceBeforeParens: ControlStatementsExceptForEachMacros +SpaceBeforeRangeBasedForLoopColon: true +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: false +SpacesInContainerLiterals: false +SpacesInCStyleCastParentheses: false +SpacesInParentheses: false +SpacesInSquareBrackets: false +Standard: Cpp03 +TabWidth: 8 +UseTab: Always +... diff --git a/.clang-format-include b/.clang-format-include new file mode 100644 index 00000000..cc4c348e --- /dev/null +++ b/.clang-format-include @@ -0,0 +1 @@ +src/**/* diff --git a/src/mctp.c b/src/mctp.c index 76f9e016..8eb5f59c 100644 --- a/src/mctp.c +++ b/src/mctp.c @@ -1208,12 +1208,14 @@ struct command { int (*fn)(struct ctx *, int, const char **); bool hidden; } commands[] = { + // clang-format off { "link", cmd_link, 0 }, { "address", cmd_addr, 0 }, { "route", cmd_route, 0 }, { "neighbour", cmd_neigh, 0 }, { "monitor", cmd_monitor, 0 }, { "help", cmd_help, 0 }, + // clang-format on }; static int cmd_help(struct ctx * ctx, int argc, const char** argv) diff --git a/src/mctpd.c b/src/mctpd.c index a2478e49..d6e3c422 100644 --- a/src/mctpd.c +++ b/src/mctpd.c @@ -2758,6 +2758,7 @@ static int method_net_learn_endpoint(sd_bus_message *call, void *data, return rc; } +// clang-format off static const sd_bus_vtable bus_link_owner_vtable[] = { SD_BUS_VTABLE_START(0), @@ -2808,6 +2809,7 @@ static const sd_bus_vtable bus_link_owner_vtable[] = { SD_BUS_VTABLE_END, }; +// clang-format on static int bus_endpoint_get_prop(sd_bus *bus, const char *path, const char *interface, const char *property, @@ -2966,6 +2968,7 @@ static int bus_endpoint_set_prop(sd_bus *bus, const char *path, return rc; } +// clang-format off static const sd_bus_vtable bus_endpoint_obmc_vtable[] = { SD_BUS_VTABLE_START(0), SD_BUS_PROPERTY("NetworkId", @@ -3063,6 +3066,7 @@ static const sd_bus_vtable bus_network_vtable[] = { SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_VTABLE_END }; +// clang-format on static int emit_endpoint_added(const struct peer *peer) { const char *path = NULL; From 36047b362bfb85deb10d65f04110c5bbb15158f4 Mon Sep 17 00:00:00 2001 From: Jeremy Kerr Date: Thu, 26 Jun 2025 13:55:49 +0800 Subject: [PATCH 2/3] Apply clang-format ninja -C obj clang-format, with clang-format-19. No other changes Signed-off-by: Jeremy Kerr --- src/mctp-bench.c | 742 ++++++++++++++++---------------- src/mctp-client.c | 43 +- src/mctp-control-spec.h | 41 +- src/mctp-echo.c | 33 +- src/mctp-netlink.c | 315 +++++++------- src/mctp-netlink.h | 39 +- src/mctp-ops.c | 12 +- src/mctp-ops.h | 2 +- src/mctp-req.c | 72 ++-- src/mctp-util.c | 192 ++++----- src/mctp-util.h | 9 +- src/mctp.c | 255 ++++++----- src/mctp.h | 32 +- src/mctpd.c | 928 +++++++++++++++++++++------------------- 14 files changed, 1401 insertions(+), 1314 deletions(-) diff --git a/src/mctp-bench.c b/src/mctp-bench.c index 1e5e86e0..6a3a8c8b 100644 --- a/src/mctp-bench.c +++ b/src/mctp-bench.c @@ -20,30 +20,30 @@ static const uint8_t VENDOR_TYPE_BENCH[3] = { 0xcc, 0xde, 0xf1 }; static const uint8_t MCTP_TYPE_VENDOR_PCIE = 0x7e; struct mctp_bench_send_args { - mctp_eid_t eid; - size_t len; - int net; + mctp_eid_t eid; + size_t len; + int net; }; struct msg_header { - uint8_t vendor_prefix[sizeof(VENDOR_TYPE_BENCH)]; - uint16_t magic; - uint32_t seq_no; + uint8_t vendor_prefix[sizeof(VENDOR_TYPE_BENCH)]; + uint16_t magic; + uint32_t seq_no; } __attribute__((packed)); struct mctp_stats { - size_t total_received_len, curr_packet_len; - uint32_t prev_seq_no; - float elapsed_time; - unsigned long msgs_dropped, msg_count, invalid_payloads; + size_t total_received_len, curr_packet_len; + uint32_t prev_seq_no; + float elapsed_time; + unsigned long msgs_dropped, msg_count, invalid_payloads; }; struct recv_ctx { - struct mctp_stats stats; - struct timespec start_time, current_time; - unsigned char *buf; - bool started_recv_flag; - int sd; + struct mctp_stats stats; + struct timespec start_time, current_time; + unsigned char *buf; + bool started_recv_flag; + int sd; }; static const size_t MSG_HEADER_LEN = sizeof(struct msg_header); @@ -55,434 +55,434 @@ static const int DEFAULT_SECONDS_INTERVAL = 10; static float get_throughput(float total_len, float elapsed_time) { - return total_len / (elapsed_time * 1024); + return total_len / (elapsed_time * 1024); } static void print_stats(struct recv_ctx *recv_ctx) { - float throughput = get_throughput(recv_ctx->stats.total_received_len, - recv_ctx->stats.elapsed_time); - printf("Throughput: %.2f kB/s | Recevied: %lu msgs | " - "Dropped: %lu msgs | " - "Invalid: %lu msgs\n", - throughput, recv_ctx->stats.msg_count, - recv_ctx->stats.msgs_dropped, recv_ctx->stats.invalid_payloads); + float throughput = get_throughput(recv_ctx->stats.total_received_len, + recv_ctx->stats.elapsed_time); + printf("Throughput: %.2f kB/s | Recevied: %lu msgs | " + "Dropped: %lu msgs | " + "Invalid: %lu msgs\n", + throughput, recv_ctx->stats.msg_count, + recv_ctx->stats.msgs_dropped, recv_ctx->stats.invalid_payloads); } static float get_elapsed_time(struct recv_ctx *recv_ctx) { - return (recv_ctx->current_time.tv_sec - recv_ctx->start_time.tv_sec) + - (recv_ctx->current_time.tv_nsec - recv_ctx->start_time.tv_nsec) / - 1.0e9; + return (recv_ctx->current_time.tv_sec - recv_ctx->start_time.tv_sec) + + (recv_ctx->current_time.tv_nsec - recv_ctx->start_time.tv_nsec) / + 1.0e9; } static int get_timeout(struct recv_ctx *recv_ctx) { - int time_to_print_sec = - (DEFAULT_SECONDS_INTERVAL) - - (recv_ctx->current_time.tv_sec - recv_ctx->start_time.tv_sec); - return (time_to_print_sec > 0) ? time_to_print_sec * 1000 : 0; + int time_to_print_sec = + (DEFAULT_SECONDS_INTERVAL) - + (recv_ctx->current_time.tv_sec - recv_ctx->start_time.tv_sec); + return (time_to_print_sec > 0) ? time_to_print_sec * 1000 : 0; } static bool valid_payload(unsigned char *buf, size_t buflen) { - for (size_t i = MSG_HEADER_LEN; i < buflen; i++) { - if (buf[i] != (i & 0xff)) - return false; - } - return true; + for (size_t i = MSG_HEADER_LEN; i < buflen; i++) { + if (buf[i] != (i & 0xff)) + return false; + } + return true; } static uint32_t get_packets_dropped(uint32_t curr, uint32_t prev) { - if (prev < curr) { - return curr - prev - 1; - } else if (curr == prev) { - return 0; - } - return UINT32_MAX - prev + curr; + if (prev < curr) { + return curr - prev - 1; + } else if (curr == prev) { + return 0; + } + return UINT32_MAX - prev + curr; } static int handle_incoming_msg(struct recv_ctx *recv_ctx) { - struct msg_header *hdr; - - ssize_t len = recv(recv_ctx->sd, recv_ctx->buf, MAX_LEN, MSG_TRUNC); - if (len < 0) { - warn("recv: recvfrom"); - return -1; - } - - recv_ctx->stats.curr_packet_len = len; - if (recv_ctx->stats.curr_packet_len > MAX_LEN) { - warn("recv: expected max len:%zd bytes, got:%zd bytes", MAX_LEN, - recv_ctx->stats.curr_packet_len); - return -1; - } - if (recv_ctx->stats.curr_packet_len < sizeof(VENDOR_TYPE_BENCH)) { - warn("recv: short vendor prefix, got:%zd bytes", - recv_ctx->stats.curr_packet_len); - return -1; - } - - hdr = (struct msg_header *)recv_ctx->buf; - if (memcmp(hdr->vendor_prefix, VENDOR_TYPE_BENCH, - sizeof(VENDOR_TYPE_BENCH)) != 0) { - warnx("recv: unexpected vendor prefix %02x %02x %02x", - hdr->vendor_prefix[0], hdr->vendor_prefix[1], - hdr->vendor_prefix[2] - ); - return -1; - } - if (recv_ctx->stats.curr_packet_len < sizeof(*hdr)) { - warn("recv: short message, got:%zd bytes", - recv_ctx->stats.curr_packet_len); - return -1; - } - - if (hdr->magic != MAGIC_VAL) { - warnx("recv: expected magic:\"%x\", got:\"%x\"\n", MAGIC_VAL, - hdr->magic); - return -1; - } - - recv_ctx->stats.total_received_len += recv_ctx->stats.curr_packet_len; - recv_ctx->stats.msg_count++; - - if (!valid_payload(recv_ctx->buf, recv_ctx->stats.curr_packet_len)) - recv_ctx->stats.invalid_payloads++; - - if (!recv_ctx->started_recv_flag) { - printf("recv: first msg received\n"); - recv_ctx->started_recv_flag = true; - clock_gettime(CLOCK_MONOTONIC, &recv_ctx->start_time); - recv_ctx->stats.prev_seq_no = hdr->seq_no; - recv_ctx->stats.msgs_dropped += - get_packets_dropped(hdr->seq_no, SEQ_START); - return -1; - } - - recv_ctx->stats.msgs_dropped += - get_packets_dropped(hdr->seq_no, recv_ctx->stats.prev_seq_no); - - recv_ctx->stats.prev_seq_no = hdr->seq_no; - return 0; + struct msg_header *hdr; + + ssize_t len = recv(recv_ctx->sd, recv_ctx->buf, MAX_LEN, MSG_TRUNC); + if (len < 0) { + warn("recv: recvfrom"); + return -1; + } + + recv_ctx->stats.curr_packet_len = len; + if (recv_ctx->stats.curr_packet_len > MAX_LEN) { + warn("recv: expected max len:%zd bytes, got:%zd bytes", MAX_LEN, + recv_ctx->stats.curr_packet_len); + return -1; + } + if (recv_ctx->stats.curr_packet_len < sizeof(VENDOR_TYPE_BENCH)) { + warn("recv: short vendor prefix, got:%zd bytes", + recv_ctx->stats.curr_packet_len); + return -1; + } + + hdr = (struct msg_header *)recv_ctx->buf; + if (memcmp(hdr->vendor_prefix, VENDOR_TYPE_BENCH, + sizeof(VENDOR_TYPE_BENCH)) != 0) { + warnx("recv: unexpected vendor prefix %02x %02x %02x", + hdr->vendor_prefix[0], hdr->vendor_prefix[1], + hdr->vendor_prefix[2]); + return -1; + } + if (recv_ctx->stats.curr_packet_len < sizeof(*hdr)) { + warn("recv: short message, got:%zd bytes", + recv_ctx->stats.curr_packet_len); + return -1; + } + + if (hdr->magic != MAGIC_VAL) { + warnx("recv: expected magic:\"%x\", got:\"%x\"\n", MAGIC_VAL, + hdr->magic); + return -1; + } + + recv_ctx->stats.total_received_len += recv_ctx->stats.curr_packet_len; + recv_ctx->stats.msg_count++; + + if (!valid_payload(recv_ctx->buf, recv_ctx->stats.curr_packet_len)) + recv_ctx->stats.invalid_payloads++; + + if (!recv_ctx->started_recv_flag) { + printf("recv: first msg received\n"); + recv_ctx->started_recv_flag = true; + clock_gettime(CLOCK_MONOTONIC, &recv_ctx->start_time); + recv_ctx->stats.prev_seq_no = hdr->seq_no; + recv_ctx->stats.msgs_dropped += + get_packets_dropped(hdr->seq_no, SEQ_START); + return -1; + } + + recv_ctx->stats.msgs_dropped += + get_packets_dropped(hdr->seq_no, recv_ctx->stats.prev_seq_no); + + recv_ctx->stats.prev_seq_no = hdr->seq_no; + return 0; } static int mctp_bench_recv() { - struct recv_ctx recv_ctx = {0}; - struct sockaddr_mctp addr = {0}; - int rc; - - recv_ctx.sd = socket(AF_MCTP, SOCK_DGRAM, 0); - if (recv_ctx.sd < 0) - err(EXIT_FAILURE, "recv: socket"); - - addr.smctp_family = AF_MCTP; - addr.smctp_network = MCTP_NET_ANY; - addr.smctp_addr.s_addr = MCTP_ADDR_ANY; - addr.smctp_type = MCTP_TYPE_VENDOR_PCIE; - addr.smctp_tag = MCTP_TAG_OWNER; - - recv_ctx.buf = malloc(MAX_LEN); - if (!recv_ctx.buf) { - err(EXIT_FAILURE, "recv: malloc failed"); - } - - rc = bind(recv_ctx.sd, (struct sockaddr *)&addr, sizeof(addr)); - if (rc) { - close(recv_ctx.sd); - err(EXIT_FAILURE, "recv: bind failed"); - } - - recv_ctx.started_recv_flag = false; - - printf("recv: waiting for first msg\n"); - while (1) { - int timeout; - struct pollfd pollfd; - pollfd.fd = recv_ctx.sd; - pollfd.events = POLLIN; - - if (recv_ctx.started_recv_flag) { - clock_gettime(CLOCK_MONOTONIC, &recv_ctx.current_time); - timeout = get_timeout(&recv_ctx); - } else - timeout = -1; - - rc = poll(&pollfd, 1, timeout); - if (rc < 0) { - warn("recv: poll failed"); - break; - } - - if (rc == 1 && pollfd.revents & POLLIN) { - rc = handle_incoming_msg(&recv_ctx); - if (rc) - continue; - } - - clock_gettime(CLOCK_MONOTONIC, &recv_ctx.current_time); - - recv_ctx.stats.elapsed_time = get_elapsed_time(&recv_ctx); - if (recv_ctx.stats.elapsed_time >= DEFAULT_SECONDS_INTERVAL) { - print_stats(&recv_ctx); - recv_ctx.stats.total_received_len = 0; - recv_ctx.stats.msg_count = 0l; - recv_ctx.stats.msgs_dropped = 0l; - recv_ctx.stats.invalid_payloads = 0l; - clock_gettime(CLOCK_MONOTONIC, &recv_ctx.start_time); - } - } - free(recv_ctx.buf); - close(recv_ctx.sd); - return 0; + struct recv_ctx recv_ctx = { 0 }; + struct sockaddr_mctp addr = { 0 }; + int rc; + + recv_ctx.sd = socket(AF_MCTP, SOCK_DGRAM, 0); + if (recv_ctx.sd < 0) + err(EXIT_FAILURE, "recv: socket"); + + addr.smctp_family = AF_MCTP; + addr.smctp_network = MCTP_NET_ANY; + addr.smctp_addr.s_addr = MCTP_ADDR_ANY; + addr.smctp_type = MCTP_TYPE_VENDOR_PCIE; + addr.smctp_tag = MCTP_TAG_OWNER; + + recv_ctx.buf = malloc(MAX_LEN); + if (!recv_ctx.buf) { + err(EXIT_FAILURE, "recv: malloc failed"); + } + + rc = bind(recv_ctx.sd, (struct sockaddr *)&addr, sizeof(addr)); + if (rc) { + close(recv_ctx.sd); + err(EXIT_FAILURE, "recv: bind failed"); + } + + recv_ctx.started_recv_flag = false; + + printf("recv: waiting for first msg\n"); + while (1) { + int timeout; + struct pollfd pollfd; + pollfd.fd = recv_ctx.sd; + pollfd.events = POLLIN; + + if (recv_ctx.started_recv_flag) { + clock_gettime(CLOCK_MONOTONIC, &recv_ctx.current_time); + timeout = get_timeout(&recv_ctx); + } else + timeout = -1; + + rc = poll(&pollfd, 1, timeout); + if (rc < 0) { + warn("recv: poll failed"); + break; + } + + if (rc == 1 && pollfd.revents & POLLIN) { + rc = handle_incoming_msg(&recv_ctx); + if (rc) + continue; + } + + clock_gettime(CLOCK_MONOTONIC, &recv_ctx.current_time); + + recv_ctx.stats.elapsed_time = get_elapsed_time(&recv_ctx); + if (recv_ctx.stats.elapsed_time >= DEFAULT_SECONDS_INTERVAL) { + print_stats(&recv_ctx); + recv_ctx.stats.total_received_len = 0; + recv_ctx.stats.msg_count = 0l; + recv_ctx.stats.msgs_dropped = 0l; + recv_ctx.stats.invalid_payloads = 0l; + clock_gettime(CLOCK_MONOTONIC, &recv_ctx.start_time); + } + } + free(recv_ctx.buf); + close(recv_ctx.sd); + return 0; } static int allocate_tag(int sd, mctp_eid_t eid, int net, uint8_t *tag) { - int rc = -1; + int rc = -1; #if !defined(SIOCMCTPALLOCTAG2) && !defined(SIOCMCTPALLOCTAG) #error No ALLOCTAG ioctl available #endif #if defined(SIOCMCTPALLOCTAG2) - struct mctp_ioc_tag_ctl2 ctl2 = { - .peer_addr = eid, - .net = net, - }; - - errno = 0; - rc = ioctl(sd, SIOCMCTPALLOCTAG2, &ctl2); - if (!rc) { - *tag = ctl2.tag; - return 0; - } - - /* + struct mctp_ioc_tag_ctl2 ctl2 = { + .peer_addr = eid, + .net = net, + }; + + errno = 0; + rc = ioctl(sd, SIOCMCTPALLOCTAG2, &ctl2); + if (!rc) { + *tag = ctl2.tag; + return 0; + } + + /* * If Alloctag V2 does not exist, we would get EINVAL. * In that case we want to fallback to Alloctag V1. * All other cases we return the error. */ - if (errno != EINVAL) { - return rc; - } + if (errno != EINVAL) { + return rc; + } #endif #if defined(SIOCMCTPALLOCTAG) - struct mctp_ioc_tag_ctl ctl = { - .peer_addr = eid, - }; - - /* Alloctag V1 only works with default net. */ - if (net != DEFAULT_NET) { - warnx("Can't use ALLOCTAG V1 for non-default net:%d", net); - return -1; - } - - rc = ioctl(sd, SIOCMCTPALLOCTAG, &ctl); - if (!rc) { - *tag = ctl.tag; - return 0; - } + struct mctp_ioc_tag_ctl ctl = { + .peer_addr = eid, + }; + + /* Alloctag V1 only works with default net. */ + if (net != DEFAULT_NET) { + warnx("Can't use ALLOCTAG V1 for non-default net:%d", net); + return -1; + } + + rc = ioctl(sd, SIOCMCTPALLOCTAG, &ctl); + if (!rc) { + *tag = ctl.tag; + return 0; + } #endif - return rc; + return rc; } static int mctp_bench_send(struct mctp_bench_send_args send_args) { - struct sockaddr_mctp addr = {0}; - struct msg_header *hdr; - unsigned char *buf; - uint32_t sequence = SEQ_START; - uint8_t tag; - int rc, sd, last_rc; - - sd = socket(AF_MCTP, SOCK_DGRAM, 0); - if (sd < 0) - err(EXIT_FAILURE, "send: socket"); - - addr.smctp_family = AF_MCTP; - addr.smctp_network = send_args.net; - addr.smctp_addr.s_addr = send_args.eid; - addr.smctp_type = MCTP_TYPE_VENDOR_PCIE; - printf("send: eid = %d, net = %d, type = %d, msg_len = %zu bytes\n", - send_args.eid, send_args.net, addr.smctp_type, send_args.len); - - buf = malloc(send_args.len); - if (!buf) - err(EXIT_FAILURE, "send: malloc"); - - rc = allocate_tag(sd, send_args.eid, send_args.net, &tag); - if (rc) - err(EXIT_FAILURE, "send: alloc tag failed"); - - for (size_t i = MSG_HEADER_LEN; i < send_args.len; i++) - buf[i] = i & 0xff; - - hdr = (struct msg_header *)buf; - memcpy(hdr->vendor_prefix, VENDOR_TYPE_BENCH, sizeof(VENDOR_TYPE_BENCH)); - hdr->magic = MAGIC_VAL; + struct sockaddr_mctp addr = { 0 }; + struct msg_header *hdr; + unsigned char *buf; + uint32_t sequence = SEQ_START; + uint8_t tag; + int rc, sd, last_rc; + + sd = socket(AF_MCTP, SOCK_DGRAM, 0); + if (sd < 0) + err(EXIT_FAILURE, "send: socket"); + + addr.smctp_family = AF_MCTP; + addr.smctp_network = send_args.net; + addr.smctp_addr.s_addr = send_args.eid; + addr.smctp_type = MCTP_TYPE_VENDOR_PCIE; + printf("send: eid = %d, net = %d, type = %d, msg_len = %zu bytes\n", + send_args.eid, send_args.net, addr.smctp_type, send_args.len); + + buf = malloc(send_args.len); + if (!buf) + err(EXIT_FAILURE, "send: malloc"); + + rc = allocate_tag(sd, send_args.eid, send_args.net, &tag); + if (rc) + err(EXIT_FAILURE, "send: alloc tag failed"); + + for (size_t i = MSG_HEADER_LEN; i < send_args.len; i++) + buf[i] = i & 0xff; + + hdr = (struct msg_header *)buf; + memcpy(hdr->vendor_prefix, VENDOR_TYPE_BENCH, + sizeof(VENDOR_TYPE_BENCH)); + hdr->magic = MAGIC_VAL; /* will not match a sensible sendto() return value */ last_rc = 0; - while (1) { - addr.smctp_tag = tag; - hdr->seq_no = sequence; - - rc = sendto(sd, buf, send_args.len, 0, (struct sockaddr *)&addr, - sizeof(addr)); - if (rc != (int)send_args.len && rc != last_rc) { - last_rc = rc; - warn("send: sendto(%zd bytes)", send_args.len); - } - - sequence++; - } - free(buf); - close(sd); - return 0; + while (1) { + addr.smctp_tag = tag; + hdr->seq_no = sequence; + + rc = sendto(sd, buf, send_args.len, 0, (struct sockaddr *)&addr, + sizeof(addr)); + if (rc != (int)send_args.len && rc != last_rc) { + last_rc = rc; + warn("send: sendto(%zd bytes)", send_args.len); + } + + sequence++; + } + free(buf); + close(sd); + return 0; } static void usage(void) { - fprintf(stderr, "'mctp-bench send' [len ] eid [,]\n"); - fprintf(stderr, "'mctp-bench recv'\n"); + fprintf(stderr, "'mctp-bench send' [len ] eid [,]\n"); + fprintf(stderr, "'mctp-bench recv'\n"); } static int parse_int(char *opt, unsigned int *out) { - char *endptr; - - errno = 0; - *out = strtoul(opt, &endptr, 0); - if (endptr == opt || errno == ERANGE) { - return -1; - } - return 0; + char *endptr; + + errno = 0; + *out = strtoul(opt, &endptr, 0); + if (endptr == opt || errno == ERANGE) { + return -1; + } + return 0; } static int parse_net_and_eid(struct mctp_bench_send_args *send_args, char *opt) { - char *comma; - unsigned int tmp, rc; - - for (size_t i = 0; i < strlen(opt); i++) { - if ((opt[i] < '0' || opt[i] > '9') && opt[i] != ',') { - warnx("send: invalid eid or net value:\"%s\"", opt); - return -1; - } - } - comma = strchr(opt, ','); - - rc = parse_int(opt, &tmp); - if (rc) { - warn("send: invalid eid or net value:\"%s\"", opt); - return -1; - } - - if (comma) { - if (!tmp) { - warnx("send: eid cannot be set to 0\n"); - return -1; - } - - send_args->net = tmp; - comma++; - - rc = parse_int(comma, &tmp); - if (rc) { - warn("send: invalid eid or net value:\"%s\"", opt); - return -1; - } - } - send_args->eid = tmp; - return 0; + char *comma; + unsigned int tmp, rc; + + for (size_t i = 0; i < strlen(opt); i++) { + if ((opt[i] < '0' || opt[i] > '9') && opt[i] != ',') { + warnx("send: invalid eid or net value:\"%s\"", opt); + return -1; + } + } + comma = strchr(opt, ','); + + rc = parse_int(opt, &tmp); + if (rc) { + warn("send: invalid eid or net value:\"%s\"", opt); + return -1; + } + + if (comma) { + if (!tmp) { + warnx("send: eid cannot be set to 0\n"); + return -1; + } + + send_args->net = tmp; + comma++; + + rc = parse_int(comma, &tmp); + if (rc) { + warn("send: invalid eid or net value:\"%s\"", opt); + return -1; + } + } + send_args->eid = tmp; + return 0; } static int parse_len(struct mctp_bench_send_args *send_args, char *opt) { - unsigned int tmp = 0; - int rc = 0; - - rc = parse_int(opt, &tmp); - if (rc || tmp > MAX_LEN) { - warnx("send: invalid len value:\"%s\", max len:%zd bytes", opt, - MAX_LEN); - return -1; - } - - if (tmp >= MSG_HEADER_LEN) { - send_args->len = tmp; - } else { - printf("send: min len is %zd bytes, len set to %zd bytes\n", - MSG_HEADER_LEN, MSG_HEADER_LEN); - send_args->len = MSG_HEADER_LEN; - } - return 0; + unsigned int tmp = 0; + int rc = 0; + + rc = parse_int(opt, &tmp); + if (rc || tmp > MAX_LEN) { + warnx("send: invalid len value:\"%s\", max len:%zd bytes", opt, + MAX_LEN); + return -1; + } + + if (tmp >= MSG_HEADER_LEN) { + send_args->len = tmp; + } else { + printf("send: min len is %zd bytes, len set to %zd bytes\n", + MSG_HEADER_LEN, MSG_HEADER_LEN); + send_args->len = MSG_HEADER_LEN; + } + return 0; } int main(int argc, char **argv) { - char *optname, *optval; - int rc = 0; - - if (argc < 2 || argc > 6) { - warnx("%s\n", (argc < 2) ? "error: missing command" - : "error: too many arguments"); - usage(); - return EXIT_FAILURE; - } - - if (!strcmp(argv[1], "send")) { - struct mctp_bench_send_args send_args = { - .eid = 0, - .len = MSG_HEADER_LEN, - .net = DEFAULT_NET, - }; - for (int i = 2; i < argc; i += 2) { - optname = argv[i]; - optval = argv[i + 1]; - if (!strcmp(optname, "eid")) { - rc = parse_net_and_eid(&send_args, optval); - if (rc) { - usage(); - return EXIT_FAILURE; - } - } else if (!strcmp(optname, "len")) { - rc = parse_len(&send_args, optval); - if (rc) { - usage(); - return EXIT_FAILURE; - } - } else { - warnx("send: unknown argument:\"%s\"\n", - optname); - usage(); - return EXIT_FAILURE; - } - } - - if (!send_args.eid) { - warnx("send: missing eid\n"); - usage(); - return EXIT_FAILURE; - } - return mctp_bench_send(send_args); - } else if (!strcmp(argv[1], "recv")) { - if (argc > 2) { - warnx("recv: does not take extra arguments\n"); - usage(); - return EXIT_FAILURE; - } - return mctp_bench_recv(); - } else { - warnx("error: unknown command:\"%s\"\n", argv[1]); - usage(); - return EXIT_FAILURE; - } - return EXIT_FAILURE; + char *optname, *optval; + int rc = 0; + + if (argc < 2 || argc > 6) { + warnx("%s\n", (argc < 2) ? "error: missing command" : + "error: too many arguments"); + usage(); + return EXIT_FAILURE; + } + + if (!strcmp(argv[1], "send")) { + struct mctp_bench_send_args send_args = { + .eid = 0, + .len = MSG_HEADER_LEN, + .net = DEFAULT_NET, + }; + for (int i = 2; i < argc; i += 2) { + optname = argv[i]; + optval = argv[i + 1]; + if (!strcmp(optname, "eid")) { + rc = parse_net_and_eid(&send_args, optval); + if (rc) { + usage(); + return EXIT_FAILURE; + } + } else if (!strcmp(optname, "len")) { + rc = parse_len(&send_args, optval); + if (rc) { + usage(); + return EXIT_FAILURE; + } + } else { + warnx("send: unknown argument:\"%s\"\n", + optname); + usage(); + return EXIT_FAILURE; + } + } + + if (!send_args.eid) { + warnx("send: missing eid\n"); + usage(); + return EXIT_FAILURE; + } + return mctp_bench_send(send_args); + } else if (!strcmp(argv[1], "recv")) { + if (argc > 2) { + warnx("recv: does not take extra arguments\n"); + usage(); + return EXIT_FAILURE; + } + return mctp_bench_recv(); + } else { + warnx("error: unknown command:\"%s\"\n", argv[1]); + usage(); + return EXIT_FAILURE; + } + return EXIT_FAILURE; } diff --git a/src/mctp-client.c b/src/mctp-client.c index fe5f7fd9..662eebba 100644 --- a/src/mctp-client.c +++ b/src/mctp-client.c @@ -63,7 +63,8 @@ static struct type_lookup_t { { .name = "secured", .type = 6, - .description = "secured messages using spdm over mctp per DSP0276", + .description = + "secured messages using spdm over mctp per DSP0276", }, { .name = "pci", @@ -77,7 +78,8 @@ static struct type_lookup_t { }, }; -static int do_type_lookup(char *type_str) { +static int do_type_lookup(char *type_str) +{ int ctr; for (ctr = 0; ctr < ARRAY_SIZE(type_lookup); ++ctr) { @@ -88,8 +90,8 @@ static int do_type_lookup(char *type_str) { return -ENOENT; }; -static int do_send_recv(unsigned int net, mctp_eid_t eid, - uint8_t type, struct data_t *data) +static int do_send_recv(unsigned int net, mctp_eid_t eid, uint8_t type, + struct data_t *data) { int sd, rc, recvlen, ctr; struct sockaddr_mctp addr; @@ -100,7 +102,6 @@ static int do_send_recv(unsigned int net, mctp_eid_t eid, if (sd < 0) err(EXIT_FAILURE, "socket"); - memset(&addr, 0, sizeof(addr)); addr.smctp_tag = MCTP_TAG_OWNER; addr.smctp_family = AF_MCTP; @@ -108,14 +109,14 @@ static int do_send_recv(unsigned int net, mctp_eid_t eid, addr.smctp_type = type; addr.smctp_addr.s_addr = eid; - rc = sendto(sd, data->data, data->len, 0, - (struct sockaddr *) &addr, sizeof(addr)); + rc = sendto(sd, data->data, data->len, 0, (struct sockaddr *)&addr, + sizeof(addr)); if (rc != data->len) err(EXIT_FAILURE, "sendto(%zd)", data->len); recvlen = recvfrom(sd, NULL, 0, MSG_TRUNC | MSG_PEEK, - (struct sockaddr *) &addr, &addrlen); + (struct sockaddr *)&addr, &addrlen); if (recvlen < 0) err(EXIT_FAILURE, "receive failed %d", recvlen); @@ -125,13 +126,14 @@ static int do_send_recv(unsigned int net, mctp_eid_t eid, errx(EXIT_FAILURE, "malloc failed for recv"); rc = recvfrom(sd, recv_buffer, recvlen, MSG_TRUNC, - (struct sockaddr *) &addr, &addrlen); + (struct sockaddr *)&addr, &addrlen); if (rc < 0) err(EXIT_FAILURE, "receive failed %d", recvlen); if (recvlen != rc) - errx(EXIT_FAILURE, "invalid bytes received: %d, expected %d", rc, recvlen); + errx(EXIT_FAILURE, "invalid bytes received: %d, expected %d", + rc, recvlen); for (ctr = 0; ctr < rc; ++ctr) { printf("%02X", recv_buffer[ctr]); @@ -144,19 +146,22 @@ static int do_send_recv(unsigned int net, mctp_eid_t eid, return 0; } -static void print_usage() { +static void print_usage() +{ int ctr; printf("usage:\n\tmctp-client [net ] eid type data \n"); printf("net defaults to MCTP_NET_ANY, data is space delimited hexadecimal. "); printf("data must be the last parameter\n"); printf("possible types:\n"); for (ctr = 0; ctr < ARRAY_SIZE(type_lookup); ++ctr) { - printf("\t%s: %s\n", type_lookup[ctr].name, type_lookup[ctr].description); + printf("\t%s: %s\n", type_lookup[ctr].name, + type_lookup[ctr].description); } printf("return data is always output as space delimited hexadecimal\n"); } -static struct data_t create_data(char **data_start, size_t count) { +static struct data_t create_data(char **data_start, size_t count) +{ unsigned long int tmp; struct data_t data; char *endp; @@ -176,16 +181,19 @@ static struct data_t create_data(char **data_start, size_t count) { if (endp == data_start[ctr]) errx(EXIT_FAILURE, "data must be the last parameter"); if (tmp == ULONG_MAX) - errx(EXIT_FAILURE, "failed to parse: %s", data_start[ctr]); + errx(EXIT_FAILURE, "failed to parse: %s", + data_start[ctr]); if (tmp > 0xff) - errx(EXIT_FAILURE, "data parsed is invalid: %s", data_start[ctr]); + errx(EXIT_FAILURE, "data parsed is invalid: %s", + data_start[ctr]); data.data[ctr] = tmp; } return data; } -static int find_data(int argc, char **argv) { +static int find_data(int argc, char **argv) +{ int ctr; for (ctr = argc - 1; ctr > 0; --ctr) { @@ -196,7 +204,8 @@ static int find_data(int argc, char **argv) { return -ENOENT; } -int main(int argc, char **argv) { +int main(int argc, char **argv) +{ bool valid_parse, valid_eid, valid_type; int ctr, data_idx, net = MCTP_NET_ANY; struct data_t send_data; diff --git a/src/mctp-control-spec.h b/src/mctp-control-spec.h index 4a7acefc..33df8ba7 100644 --- a/src/mctp-control-spec.h +++ b/src/mctp-control-spec.h @@ -177,7 +177,6 @@ struct mctp_ctrl_resp_resolve_endpoint_id { // ... uint8_t physical_address[N] } __attribute__((__packed__)); - #define MCTP_CTRL_HDR_MSG_TYPE 0 #define MCTP_CTRL_HDR_FLAG_REQUEST (1 << 7) #define MCTP_CTRL_HDR_FLAG_DGRAM (1 << 6) @@ -233,8 +232,8 @@ struct mctp_ctrl_resp_resolve_endpoint_id { #define MCTP_EID_ASSIGNMENT_STATUS_SHIFT 0x4 #define MCTP_EID_ASSIGNMENT_STATUS_MASK 0x3 -#define SET_MCTP_EID_ASSIGNMENT_STATUS(field, status) \ - ((field) |= (((status)&MCTP_EID_ASSIGNMENT_STATUS_MASK) \ +#define SET_MCTP_EID_ASSIGNMENT_STATUS(field, status) \ + ((field) |= (((status) & MCTP_EID_ASSIGNMENT_STATUS_MASK) \ << MCTP_EID_ASSIGNMENT_STATUS_SHIFT)) #define MCTP_SET_EID_ACCEPTED 0x0 #define MCTP_SET_EID_REJECTED 0x1 @@ -258,39 +257,39 @@ struct mctp_ctrl_resp_resolve_endpoint_id { #define MCTP_ENDPOINT_TYPE_MASK 0x3 #define MCTP_SIMPLE_ENDPOINT 0 #define MCTP_BUS_OWNER_BRIDGE 1 -#define SET_ENDPOINT_TYPE(field, type) \ - ((field) |= \ - (((type)&MCTP_ENDPOINT_TYPE_MASK) << MCTP_ENDPOINT_TYPE_SHIFT)) +#define SET_ENDPOINT_TYPE(field, type) \ + ((field) |= \ + (((type) & MCTP_ENDPOINT_TYPE_MASK) << MCTP_ENDPOINT_TYPE_SHIFT)) #define MCTP_ENDPOINT_ID_TYPE_SHIFT 0 #define MCTP_ENDPOINT_ID_TYPE_MASK 0x3 #define MCTP_DYNAMIC_EID 0 #define MCTP_STATIC_EID 1 -#define SET_ENDPOINT_ID_TYPE(field, type) \ - ((field) |= \ - (((type)&MCTP_ENDPOINT_ID_TYPE_MASK) << MCTP_ENDPOINT_ID_TYPE_SHIFT)) +#define SET_ENDPOINT_ID_TYPE(field, type) \ + ((field) |= (((type) & MCTP_ENDPOINT_ID_TYPE_MASK) \ + << MCTP_ENDPOINT_ID_TYPE_SHIFT)) /* MCTP Routing Table entry types * See DSP0236 v1.3.0 Table 27. */ #define MCTP_ROUTING_ENTRY_PORT_SHIFT 0 #define MCTP_ROUTING_ENTRY_PORT_MASK 0x1F -#define SET_ROUTING_ENTRY_PORT(field, port) \ - ((field) |= (((port)&MCTP_ROUTING_ENTRY_PORT_MASK) \ +#define SET_ROUTING_ENTRY_PORT(field, port) \ + ((field) |= (((port) & MCTP_ROUTING_ENTRY_PORT_MASK) \ << MCTP_ROUTING_ENTRY_PORT_SHIFT)) -#define GET_ROUTING_ENTRY_PORT(field) \ - (((field) >> MCTP_ROUTING_ENTRY_PORT_SHIFT) & \ +#define GET_ROUTING_ENTRY_PORT(field) \ + (((field) >> MCTP_ROUTING_ENTRY_PORT_SHIFT) & \ MCTP_ROUTING_ENTRY_PORT_MASK) #define MCTP_ROUTING_ENTRY_ASSIGNMENT_TYPE_SHIFT 5 #define MCTP_ROUTING_ENTRY_ASSIGNMENT_TYPE_MASK 0x1 #define MCTP_DYNAMIC_ASSIGNMENT 0 #define MCTP_STATIC_ASSIGNMENT 1 -#define SET_ROUTING_ENTRY_ASSIGNMENT_TYPE(field, type) \ - ((field) |= (((type)&MCTP_ROUTING_ENTRY_ASSIGNMENT_TYPE_MASK) \ +#define SET_ROUTING_ENTRY_ASSIGNMENT_TYPE(field, type) \ + ((field) |= (((type) & MCTP_ROUTING_ENTRY_ASSIGNMENT_TYPE_MASK) \ << MCTP_ROUTING_ENTRY_ASSIGNMENT_TYPE_SHIFT)) -#define GET_ROUTING_ENTRY_ASSIGNMENT_TYPE(field) \ - (((field) >> MCTP_ROUTING_ENTRY_ASSIGNMENT_TYPE_SHIFT) & \ +#define GET_ROUTING_ENTRY_ASSIGNMENT_TYPE(field) \ + (((field) >> MCTP_ROUTING_ENTRY_ASSIGNMENT_TYPE_SHIFT) & \ MCTP_ROUTING_ENTRY_ASSIGNMENT_TYPE_MASK) #define MCTP_ROUTING_ENTRY_TYPE_SHIFT 6 @@ -299,9 +298,9 @@ struct mctp_ctrl_resp_resolve_endpoint_id { #define MCTP_ROUTING_ENTRY_BRIDGE_AND_ENDPOINTS 0x01 #define MCTP_ROUTING_ENTRY_BRIDGE 0x02 #define MCTP_ROUTING_ENTRY_ENDPOINTS 0x03 -#define SET_ROUTING_ENTRY_TYPE(field, type) \ - ((field) |= (((type)&MCTP_ROUTING_ENTRY_TYPE_MASK) \ +#define SET_ROUTING_ENTRY_TYPE(field, type) \ + ((field) |= (((type) & MCTP_ROUTING_ENTRY_TYPE_MASK) \ << MCTP_ROUTING_ENTRY_TYPE_SHIFT)) -#define GET_ROUTING_ENTRY_TYPE(field) \ - (((field) >> MCTP_ROUTING_ENTRY_TYPE_SHIFT) & \ +#define GET_ROUTING_ENTRY_TYPE(field) \ + (((field) >> MCTP_ROUTING_ENTRY_TYPE_SHIFT) & \ MCTP_ROUTING_ENTRY_TYPE_MASK) diff --git a/src/mctp-echo.c b/src/mctp-echo.c index 3646bb8e..b1e4ab04 100644 --- a/src/mctp-echo.c +++ b/src/mctp-echo.c @@ -61,47 +61,42 @@ int main(void) } addrlen = sizeof(addr); - len = recvfrom(sd, buf, buflen, 0, - (struct sockaddr *)&addr, &addrlen); + len = recvfrom(sd, buf, buflen, 0, (struct sockaddr *)&addr, + &addrlen); if (len < 0) { warn("recvfrom"); continue; } if (addrlen != sizeof(addr)) { - warnx("unknown address length %d, exp %zd", - addrlen, sizeof(addr)); + warnx("unknown address length %d, exp %zd", addrlen, + sizeof(addr)); continue; } if (len < (ssize_t)sizeof(VENDOR_TYPE_ECHO)) { warnx("echo: short message from (net %d, eid %d), tag %d, type 0x%x: len %zd.\n", - addr.smctp_network, addr.smctp_addr.s_addr, - addr.smctp_tag, - addr.smctp_type, - len); + addr.smctp_network, addr.smctp_addr.s_addr, + addr.smctp_tag, addr.smctp_type, len); continue; } - if (memcmp(buf, VENDOR_TYPE_ECHO, sizeof(VENDOR_TYPE_ECHO)) != 0) { + if (memcmp(buf, VENDOR_TYPE_ECHO, sizeof(VENDOR_TYPE_ECHO)) != + 0) { warnx("echo: unexpected vendor ID from (net %d, eid %d), tag %d, type 0x%x, len %zd.\n", - addr.smctp_network, addr.smctp_addr.s_addr, - addr.smctp_tag, - addr.smctp_type, - len); + addr.smctp_network, addr.smctp_addr.s_addr, + addr.smctp_tag, addr.smctp_type, len); continue; } printf("echo: message from (net %d, eid %d), tag %d, type 0x%x: len %zd, responding\n", - addr.smctp_network, addr.smctp_addr.s_addr, - addr.smctp_tag, - addr.smctp_type, - len); + addr.smctp_network, addr.smctp_addr.s_addr, + addr.smctp_tag, addr.smctp_type, len); addr.smctp_tag &= ~MCTP_TAG_OWNER; - rc = sendto(sd, buf, len, 0, - (struct sockaddr *)&addr, sizeof(addr)); + rc = sendto(sd, buf, len, 0, (struct sockaddr *)&addr, + sizeof(addr)); if (rc != (int)len) { warn("sendto"); diff --git a/src/mctp-netlink.c b/src/mctp-netlink.c index 92871aad..36fab6f0 100644 --- a/src/mctp-netlink.c +++ b/src/mctp-netlink.c @@ -21,10 +21,10 @@ #include "mctp-ops.h" struct linkmap_entry { - int ifindex; - char ifname[IFNAMSIZ+1]; + int ifindex; + char ifname[IFNAMSIZ + 1]; uint32_t net; - bool up; + bool up; uint32_t min_mtu; uint32_t max_mtu; @@ -33,19 +33,19 @@ struct linkmap_entry { mctp_eid_t *local_eids; size_t num_local; - void *userdata; + void *userdata; }; struct mctp_nl { // socket for queries - int sd; + int sd; // socket for monitor - int sd_monitor; + int sd_monitor; struct linkmap_entry *linkmap; - size_t linkmap_count; - size_t linkmap_alloc; - bool verbose; + size_t linkmap_count; + size_t linkmap_alloc; + bool verbose; // allows callers to silence printf of EEXIST returns. // TODO: this is a workaround, if more are required we should @@ -57,10 +57,10 @@ static int fill_local_addrs(mctp_nl *nl); static int fill_linkmap(mctp_nl *nl); static void sort_linkmap(mctp_nl *nl); static int linkmap_add_entry(mctp_nl *nl, struct ifinfomsg *info, - const char *ifname, size_t ifname_len, uint32_t net, - bool up, uint32_t min_mtu, uint32_t max_mtu, size_t hwaddr_len); -static struct linkmap_entry *entry_byindex(const mctp_nl *nl, - int index); + const char *ifname, size_t ifname_len, + uint32_t net, bool up, uint32_t min_mtu, + uint32_t max_mtu, size_t hwaddr_len); +static struct linkmap_entry *entry_byindex(const mctp_nl *nl, int index); static int open_nl_socket(void) { @@ -88,8 +88,7 @@ static int open_nl_socket(void) opt = 1; rc = mctp_ops.nl.setsockopt(sd, SOL_NETLINK, NETLINK_EXT_ACK, &opt, sizeof(opt)); - if (rc) - { + if (rc) { rc = -errno; goto err; } @@ -101,7 +100,7 @@ static int open_nl_socket(void) return rc; } -mctp_nl * mctp_nl_new(bool verbose) +mctp_nl *mctp_nl_new(bool verbose) { int rc; mctp_nl *nl; @@ -132,7 +131,8 @@ mctp_nl * mctp_nl_new(bool verbose) } /* Avoids printing warnings for EEXIST */ -void mctp_nl_warn_eexist(mctp_nl *nl, bool warn) { +void mctp_nl_warn_eexist(mctp_nl *nl, bool warn) +{ nl->quiet_eexist = !warn; } @@ -168,8 +168,8 @@ int mctp_nl_monitor(mctp_nl *nl, bool enable) opt = RTNLGRP_LINK; rc = mctp_ops.nl.setsockopt(nl->sd_monitor, SOL_NETLINK, - NETLINK_ADD_MEMBERSHIP, - &opt, sizeof(opt)); + NETLINK_ADD_MEMBERSHIP, &opt, + sizeof(opt)); if (rc < 0) { rc = -errno; goto err; @@ -177,8 +177,8 @@ int mctp_nl_monitor(mctp_nl *nl, bool enable) opt = RTNLGRP_MCTP_IFADDR; rc = mctp_ops.nl.setsockopt(nl->sd_monitor, SOL_NETLINK, - NETLINK_ADD_MEMBERSHIP, - &opt, sizeof(opt)); + NETLINK_ADD_MEMBERSHIP, &opt, + sizeof(opt)); if (rc < 0) { rc = -errno; if (errno == EINVAL) { @@ -200,21 +200,22 @@ int mctp_nl_monitor(mctp_nl *nl, bool enable) return rc; } -mctp_nl_change *push_change(mctp_nl_change **changes, size_t *psize) { +mctp_nl_change *push_change(mctp_nl_change **changes, size_t *psize) +{ size_t siz = *psize; siz++; *changes = realloc(*changes, siz * sizeof(**changes)); *psize = siz; - return &(*changes)[siz-1]; + return &(*changes)[siz - 1]; } static void fill_eid_changes(const struct linkmap_entry *oe, - const mctp_eid_t *old_eids, size_t num_old, - const mctp_eid_t *new_eids, size_t num_new, - mctp_nl_change **changes, size_t *psize) { - + const mctp_eid_t *old_eids, size_t num_old, + const mctp_eid_t *new_eids, size_t num_new, + mctp_nl_change **changes, size_t *psize) +{ // Iterate and match old/new eid lists - for (size_t o = 0, n = 0; o < num_old || n < num_new; ) { + for (size_t o = 0, n = 0; o < num_old || n < num_new;) { mctp_nl_change *ch = NULL; // "beyond end of list" value @@ -248,13 +249,13 @@ static void fill_eid_changes(const struct linkmap_entry *oe, } static void fill_link_changes(const struct linkmap_entry *old, size_t old_count, - struct linkmap_entry *new, size_t new_count, - mctp_nl_change **changes, size_t *num_changes) { - + struct linkmap_entry *new, size_t new_count, + mctp_nl_change **changes, size_t *num_changes) +{ size_t siz = 0; // iterate and match old/new interface lists - for (size_t o = 0, n = 0; o < old_count || n < new_count; ) { + for (size_t o = 0, n = 0; o < old_count || n < new_count;) { const struct linkmap_entry *oe = &old[o]; struct linkmap_entry *ne = &new[n]; mctp_nl_change *ch = NULL; @@ -270,18 +271,16 @@ static void fill_link_changes(const struct linkmap_entry *old, size_t old_count, ne->userdata = oe->userdata; if (oe->net == ne->net) { // Same net. Check for eid changes. - fill_eid_changes(oe, - oe->local_eids, oe->num_local, - ne->local_eids, ne->num_local, - changes, &siz); + fill_eid_changes(oe, oe->local_eids, + oe->num_local, ne->local_eids, + ne->num_local, changes, &siz); } else { // Net changed // First remove all old local EIDs. They can be re-added // in response to the later CHANGE_NET - fill_eid_changes(oe, - oe->local_eids, oe->num_local, - NULL, 0, - changes, &siz); + fill_eid_changes(oe, oe->local_eids, + oe->num_local, NULL, 0, + changes, &siz); ch = push_change(changes, &siz); ch->op = MCTP_NL_CHANGE_NET; @@ -311,8 +310,7 @@ static void fill_link_changes(const struct linkmap_entry *old, size_t old_count, // Record each EID deletion as a change, since the old // EID list is deleted before this change list is returned fill_eid_changes(oe, oe->local_eids, oe->num_local, - NULL, 0, - changes, &siz); + NULL, 0, changes, &siz); // Delete the link itself ch = push_change(changes, &siz); ch->op = MCTP_NL_DEL_LINK; @@ -325,26 +323,29 @@ static void fill_link_changes(const struct linkmap_entry *old, size_t old_count, *num_changes = siz; } -void mctp_nl_changes_dump(mctp_nl *nl, mctp_nl_change *changes, size_t num_changes) { - const char* ops[MCTP_NL_OP_COUNT] = { - "ADD_LINK", "DEL_LINK", "CHANGE_NET", "CHANGE_UP", - "ADD_EID", "DEL_EID", +void mctp_nl_changes_dump(mctp_nl *nl, mctp_nl_change *changes, + size_t num_changes) +{ + const char *ops[MCTP_NL_OP_COUNT] = { + "ADD_LINK", "DEL_LINK", "CHANGE_NET", + "CHANGE_UP", "ADD_EID", "DEL_EID", }; fprintf(stderr, "%zu changes:\n", num_changes); for (size_t i = 0; i < num_changes; i++) { mctp_nl_change *ch = &changes[i]; - const char* ifname = mctp_nl_if_byindex(nl, ch->ifindex); + const char *ifname = mctp_nl_if_byindex(nl, ch->ifindex); if (!ifname) ifname = "deleted"; - fprintf(stderr, "%3zd %-12s ifindex %3d (%-20s) eid %3d old_net %4d old_up %d\n", + fprintf(stderr, + "%3zd %-12s ifindex %3d (%-20s) eid %3d old_net %4d old_up %d\n", i, ops[ch->op], ch->ifindex, ifname, ch->eid, ch->old_net, ch->old_up); } - } -int mctp_nl_handle_monitor(mctp_nl *nl, mctp_nl_change **changes, size_t *num_changes) +int mctp_nl_handle_monitor(mctp_nl *nl, mctp_nl_change **changes, + size_t *num_changes) { int rc; struct linkmap_entry *old_linkmap; @@ -360,7 +361,8 @@ int mctp_nl_handle_monitor(mctp_nl *nl, mctp_nl_change **changes, size_t *num_ch } // Drain the socket - while (recv(nl->sd_monitor, NULL, 0, MSG_TRUNC|MSG_DONTWAIT) > 0) {} + while (recv(nl->sd_monitor, NULL, 0, MSG_TRUNC | MSG_DONTWAIT) > 0) { + } old_linkmap = nl->linkmap; old_count = nl->linkmap_count; @@ -373,9 +375,8 @@ int mctp_nl_handle_monitor(mctp_nl *nl, mctp_nl_change **changes, size_t *num_ch if (rc) goto err; - fill_link_changes(old_linkmap, old_count, - nl->linkmap, nl->linkmap_count, - changes, num_changes); + fill_link_changes(old_linkmap, old_count, nl->linkmap, + nl->linkmap_count, changes, num_changes); free_linkmap(old_linkmap, old_count); return 0; @@ -391,8 +392,8 @@ int mctp_nl_handle_monitor(mctp_nl *nl, mctp_nl_change **changes, size_t *num_ch } /* Pointer returned on match, optionally returns ret_len */ -void* mctp_get_rtnlmsg_attr(int rta_type, struct rtattr *rta, size_t len, - size_t *ret_len) +void *mctp_get_rtnlmsg_attr(int rta_type, struct rtattr *rta, size_t len, + size_t *ret_len) { for (; RTA_OK(rta, len); rta = RTA_NEXT(rta, len)) { if (rta->rta_type == rta_type) { @@ -409,7 +410,8 @@ void* mctp_get_rtnlmsg_attr(int rta_type, struct rtattr *rta, size_t len, } bool mctp_get_rtnlmsg_attr_u32(int rta_type, struct rtattr *rta, size_t len, - uint32_t *ret_value) { + uint32_t *ret_value) +{ size_t plen; uint32_t *p = mctp_get_rtnlmsg_attr(rta_type, rta, len, &plen); if (p) { @@ -418,14 +420,15 @@ bool mctp_get_rtnlmsg_attr_u32(int rta_type, struct rtattr *rta, size_t len, return true; } else { warnx("Unexpected attribute length %zu for type %d", - plen, rta_type); + plen, rta_type); } } return false; } bool mctp_get_rtnlmsg_attr_u8(int rta_type, struct rtattr *rta, size_t len, - uint8_t *ret_value) { + uint8_t *ret_value) +{ size_t plen; uint8_t *p = mctp_get_rtnlmsg_attr(rta_type, rta, len, &plen); if (p) { @@ -434,7 +437,7 @@ bool mctp_get_rtnlmsg_attr_u8(int rta_type, struct rtattr *rta, size_t len, return true; } else { warnx("Unexpected attribute length %zu for type %d", - plen, rta_type); + plen, rta_type); } } return false; @@ -442,7 +445,8 @@ bool mctp_get_rtnlmsg_attr_u8(int rta_type, struct rtattr *rta, size_t len, /* Returns the space used */ size_t mctp_put_rtnlmsg_attr(struct rtattr **prta, size_t *rta_len, - unsigned short type, const void* value, size_t val_len) + unsigned short type, const void *value, + size_t val_len) { struct rtattr *rta = *prta; rta->rta_type = type; @@ -452,7 +456,6 @@ size_t mctp_put_rtnlmsg_attr(struct rtattr **prta, size_t *rta_len, return RTA_SPACE(val_len); } - static void dump_nlmsg_hdr(struct nlmsghdr *hdr, const char *indent) { printf("%slen: %d\n", indent, hdr->nlmsg_len); @@ -462,30 +465,35 @@ static void dump_nlmsg_hdr(struct nlmsghdr *hdr, const char *indent) printf("%spid: %d\n", indent, hdr->nlmsg_pid); } -void mctp_display_nlmsg_error(const mctp_nl *nl, struct nlmsgerr *errmsg, size_t errlen) +void mctp_display_nlmsg_error(const mctp_nl *nl, struct nlmsgerr *errmsg, + size_t errlen) { size_t rta_len, errstrlen; struct rtattr *rta; - char* errstr; + char *errstr; if (errlen < sizeof(*errmsg)) { printf("short error message (%zu bytes)\n", errlen); return; } // skip the whole errmsg->msg and following payload - rta = (void *)errmsg + offsetof(struct nlmsgerr, msg) + errmsg->msg.nlmsg_len; - rta_len = (void*)errmsg + errlen - (void*)rta; + rta = (void *)errmsg + offsetof(struct nlmsgerr, msg) + + errmsg->msg.nlmsg_len; + rta_len = (void *)errmsg + errlen - (void *)rta; if (!(nl->quiet_eexist && errmsg->error == -EEXIST)) - printf("Error from kernel: %s (%d)\n", strerror(-errmsg->error), errmsg->error); - errstr = mctp_get_rtnlmsg_attr(NLMSGERR_ATTR_MSG, rta, rta_len, &errstrlen); + printf("Error from kernel: %s (%d)\n", strerror(-errmsg->error), + errmsg->error); + errstr = mctp_get_rtnlmsg_attr(NLMSGERR_ATTR_MSG, rta, rta_len, + &errstrlen); if (errstr) { errstrlen = strnlen(errstr, errstrlen); printf(" %*s\n", (int)errstrlen, errstr); } } -void mctp_dump_nlmsg_error(const mctp_nl *nl, struct nlmsgerr *errmsg, size_t errlen) +void mctp_dump_nlmsg_error(const mctp_nl *nl, struct nlmsgerr *errmsg, + size_t errlen) { printf("error:\n"); mctp_display_nlmsg_error(nl, errmsg, errlen); @@ -507,7 +515,7 @@ static int handle_nlmsg_ack(mctp_nl *nl) if (rc < 0) return rc; len = rc; - msg = (void*)resp; + msg = (void *)resp; rc = 0; for (; NLMSG_OK(msg, len); msg = NLMSG_NEXT(msg, len)) { @@ -516,14 +524,16 @@ static int handle_nlmsg_ack(mctp_nl *nl) size_t errlen = NLMSG_PAYLOAD(msg, 0); if (errmsg->error) { if (nl->verbose) - mctp_dump_nlmsg_error(nl, errmsg, errlen); + mctp_dump_nlmsg_error(nl, errmsg, + errlen); else - mctp_display_nlmsg_error(nl, errmsg, errlen); + mctp_display_nlmsg_error(nl, errmsg, + errlen); rc = errmsg->error; } } else { warnx("Received unexpected message type %d instead of status", - msg->nlmsg_type); + msg->nlmsg_type); if (nl->verbose) { mctp_hexdump(msg, msg->nlmsg_len, " "); } @@ -552,8 +562,8 @@ int mctp_nl_send(mctp_nl *nl, struct nlmsghdr *msg) return rc; if (rc != (int)msg->nlmsg_len) - warnx("sendto: short send (%d, expected %d)", - rc, msg->nlmsg_len); + warnx("sendto: short send (%d, expected %d)", rc, + msg->nlmsg_len); if (msg->nlmsg_flags & NLM_F_ACK) { return handle_nlmsg_ack(nl); @@ -568,15 +578,15 @@ static bool nlmsgs_are_done(struct nlmsghdr *msg, size_t len) for (; NLMSG_OK(msg, len); msg = NLMSG_NEXT(msg, len)) { if (done) warnx("received message after NLMSG_DONE"); - done = (msg->nlmsg_type == NLMSG_DONE) - || !(msg->nlmsg_flags & NLM_F_MULTI); + done = (msg->nlmsg_type == NLMSG_DONE) || + !(msg->nlmsg_flags & NLM_F_MULTI); } return done; } /* respp is optional for returned buffer, length is set in resp+lenp */ -int mctp_nl_recv_all(mctp_nl *nl, int sd, - struct nlmsghdr **respp, size_t *resp_lenp) +int mctp_nl_recv_all(mctp_nl *nl, int sd, struct nlmsghdr **respp, + size_t *resp_lenp) { void *respbuf = NULL; struct nlmsghdr *resp = NULL; @@ -596,7 +606,7 @@ int mctp_nl_recv_all(mctp_nl *nl, int sd, // read all the responses into a single buffer while (!done) { - rc = mctp_ops.nl.recvfrom(sd, NULL, 0, MSG_PEEK|MSG_TRUNC, + rc = mctp_ops.nl.recvfrom(sd, NULL, 0, MSG_PEEK | MSG_TRUNC, NULL, 0); if (rc < 0) { warnx("recvfrom(MSG_PEEK)"); @@ -617,8 +627,7 @@ int mctp_nl_recv_all(mctp_nl *nl, int sd, readlen = rc; newlen = pos + readlen; respbuf = realloc(respbuf, newlen); - if (!respbuf) - { + if (!respbuf) { warnx("allocation of %zu failed", newlen); rc = -ENOMEM; goto out; @@ -636,15 +645,15 @@ int mctp_nl_recv_all(mctp_nl *nl, int sd, if ((size_t)rc > readlen) warnx("recvfrom: extra message data? (got %d, exp %zd)", - rc, readlen); + rc, readlen); if (addrlen != sizeof(addr)) { - warn("recvfrom: weird addrlen? (%d, expecting %zd)", addrlen, - sizeof(addr)); + warn("recvfrom: weird addrlen? (%d, expecting %zd)", + addrlen, sizeof(addr)); } done = nlmsgs_are_done(resp, rc); - pos = min(newlen, pos+rc); + pos = min(newlen, pos + rc); } rc = 0; @@ -660,8 +669,8 @@ int mctp_nl_recv_all(mctp_nl *nl, int sd, } /* respp is optional for returned buffer, length is set in resp+lenp */ -int mctp_nl_query(mctp_nl *nl, struct nlmsghdr *msg, - struct nlmsghdr **respp, size_t *resp_lenp) +int mctp_nl_query(mctp_nl *nl, struct nlmsghdr *msg, struct nlmsghdr **respp, + size_t *resp_lenp) { int rc; @@ -706,31 +715,36 @@ static int parse_getlink_dump(mctp_nl *nl, struct nlmsghdr *nlh, uint32_t len) rt_nest = mctp_get_rtnlmsg_attr(IFLA_AF_SPEC, rta, rlen, &nlen); if (rt_nest) { - rt_mctp = mctp_get_rtnlmsg_attr(AF_MCTP, rt_nest, nlen, &mlen); + rt_mctp = mctp_get_rtnlmsg_attr(AF_MCTP, rt_nest, nlen, + &mlen); } if (!rt_mctp) { /* Skip non-MCTP interfaces */ continue; } - ifname = mctp_get_rtnlmsg_attr(IFLA_IFNAME, rta, rlen, &ifname_len); + ifname = mctp_get_rtnlmsg_attr(IFLA_IFNAME, rta, rlen, + &ifname_len); if (!ifname) { warnx("no ifname?"); continue; } ifname_len = strnlen(ifname, ifname_len); - if (!mctp_get_rtnlmsg_attr_u32(IFLA_MCTP_NET, rt_mctp, mlen, &net)) { + if (!mctp_get_rtnlmsg_attr_u32(IFLA_MCTP_NET, rt_mctp, mlen, + &net)) { warnx("Missing IFLA_MCTP_NET for %s", ifname); continue; } - if (!mctp_get_rtnlmsg_attr_u32(IFLA_MIN_MTU, rta, rlen, &min_mtu)) { + if (!mctp_get_rtnlmsg_attr_u32(IFLA_MIN_MTU, rta, rlen, + &min_mtu)) { warnx("Missing IFLA_MIN_MTU for %s", ifname); continue; } - if (!mctp_get_rtnlmsg_attr_u32(IFLA_MAX_MTU, rta, rlen, &max_mtu)) { + if (!mctp_get_rtnlmsg_attr_u32(IFLA_MAX_MTU, rta, rlen, + &max_mtu)) { warnx("Missing IFLA_MAX_MTU for %s", ifname); continue; } @@ -743,7 +757,7 @@ static int parse_getlink_dump(mctp_nl *nl, struct nlmsghdr *nlh, uint32_t len) up = info->ifi_flags & IFF_UP; linkmap_add_entry(nl, info, ifname, ifname_len, net, up, - min_mtu, max_mtu, hwaddr_len); + min_mtu, max_mtu, hwaddr_len); } // Not done. return 1; @@ -752,8 +766,8 @@ static int parse_getlink_dump(mctp_nl *nl, struct nlmsghdr *nlh, uint32_t len) static int fill_linkmap(mctp_nl *nl) { struct { - struct nlmsghdr nh; - struct ifinfomsg ifmsg; + struct nlmsghdr nh; + struct ifinfomsg ifmsg; } msg = { 0 }; struct sockaddr_nl addr; socklen_t addrlen; @@ -823,11 +837,11 @@ static int fill_local_addrs(mctp_nl *nl) struct nlmsghdr *resp = NULL, *rp = NULL; size_t len; struct { - struct nlmsghdr nh; - struct ifaddrmsg ifmsg; - struct rtattr rta; - char ifname[16]; - } msg = {0}; + struct nlmsghdr nh; + struct ifaddrmsg ifmsg; + struct rtattr rta; + char ifname[16]; + } msg = { 0 }; msg.nh.nlmsg_len = NLMSG_LENGTH(sizeof(msg.ifmsg)); @@ -844,8 +858,8 @@ static int fill_local_addrs(mctp_nl *nl) struct ifaddrmsg *ifa = NULL; size_t rta_len, ifalen; struct rtattr *rta = NULL; - void* tmp; - struct linkmap_entry* entry = NULL; + void *tmp; + struct linkmap_entry *entry = NULL; mctp_eid_t eid; if (rp->nlmsg_type != RTM_NEWADDR) @@ -865,11 +879,13 @@ static int fill_local_addrs(mctp_nl *nl) entry = entry_byindex(nl, ifa->ifa_index); if (!entry) { - warnx("kernel returned address for unknown if %d", ifa->ifa_index); + warnx("kernel returned address for unknown if %d", + ifa->ifa_index); continue; } tmp = realloc(entry->local_eids, - (entry->num_local+1) * sizeof(*entry->local_eids)); + (entry->num_local + 1) * + sizeof(*entry->local_eids)); if (!tmp) continue; entry->local_eids = tmp; @@ -881,13 +897,13 @@ static int fill_local_addrs(mctp_nl *nl) return rc; } -static int cmp_eid(const void* a, const void* b) +static int cmp_eid(const void *a, const void *b) { const mctp_eid_t *ea = a, *eb = b; return (int)(*ea) - (int)(*eb); } -static int cmp_ifindex(const void* a, const void* b) +static int cmp_ifindex(const void *a, const void *b) { const struct linkmap_entry *ea = a, *eb = b; return ea->ifindex - eb->ifindex; @@ -897,12 +913,13 @@ static void sort_linkmap(mctp_nl *nl) { size_t i; - qsort(nl->linkmap, nl->linkmap_count, sizeof(*nl->linkmap), cmp_ifindex); + qsort(nl->linkmap, nl->linkmap_count, sizeof(*nl->linkmap), + cmp_ifindex); for (i = 0; i < nl->linkmap_count; i++) { struct linkmap_entry *entry = &nl->linkmap[i]; - qsort(entry->local_eids, entry->num_local, - sizeof(mctp_eid_t), cmp_eid); + qsort(entry->local_eids, entry->num_local, sizeof(mctp_eid_t), + cmp_eid); } } @@ -913,10 +930,9 @@ void mctp_nl_linkmap_dump(const mctp_nl *nl) fprintf(stderr, "linkmap\n"); for (i = 0; i < nl->linkmap_count; i++) { struct linkmap_entry *entry = &nl->linkmap[i]; - const char* updown = entry->up ? "up" : "DOWN"; + const char *updown = entry->up ? "up" : "DOWN"; fprintf(stderr, " %2d: %s, net %d %s local addrs [", - entry->ifindex, entry->ifname, - entry->net, updown); + entry->ifindex, entry->ifname, entry->net, updown); for (j = 0; j < entry->num_local; j++) { if (j != 0) fprintf(stderr, ", "); @@ -939,7 +955,7 @@ int mctp_nl_ifindex_byname(const mctp_nl *nl, const char *ifname) return 0; } -const char* mctp_nl_if_byindex(const mctp_nl *nl, int index) +const char *mctp_nl_if_byindex(const mctp_nl *nl, int index) { struct linkmap_entry *entry = entry_byindex(nl, index); if (entry) @@ -974,15 +990,15 @@ void *mctp_nl_get_link_userdata(const mctp_nl *nl, int ifindex) void *mctp_nl_get_link_userdata_byname(const mctp_nl *nl, const char *ifname) { - size_t i; + size_t i; - for (i = 0; i < nl->linkmap_count; i++) { - struct linkmap_entry *entry = &nl->linkmap[i]; - if (!strcmp(entry->ifname, ifname)) - return entry->userdata; - } + for (i = 0; i < nl->linkmap_count; i++) { + struct linkmap_entry *entry = &nl->linkmap[i]; + if (!strcmp(entry->ifname, ifname)) + return entry->userdata; + } - return NULL; + return NULL; } bool mctp_nl_up_byindex(const mctp_nl *nl, int index) @@ -1009,7 +1025,8 @@ uint32_t mctp_nl_max_mtu_byindex(const mctp_nl *nl, int index) return 0; } -int mctp_nl_hwaddr_len_byindex(const mctp_nl *nl, int index, size_t *ret_hwaddr_len) +int mctp_nl_hwaddr_len_byindex(const mctp_nl *nl, int index, + size_t *ret_hwaddr_len) { struct linkmap_entry *entry = entry_byindex(nl, index); if (!entry) { @@ -1019,8 +1036,7 @@ int mctp_nl_hwaddr_len_byindex(const mctp_nl *nl, int index, size_t *ret_hwaddr_ return 0; } -mctp_eid_t *mctp_nl_addrs_byindex(const mctp_nl *nl, int index, - size_t *ret_num) +mctp_eid_t *mctp_nl_addrs_byindex(const mctp_nl *nl, int index, size_t *ret_num) { struct linkmap_entry *entry = entry_byindex(nl, index); mctp_eid_t *ret; @@ -1036,8 +1052,7 @@ mctp_eid_t *mctp_nl_addrs_byindex(const mctp_nl *nl, int index, return ret; } -static struct linkmap_entry *entry_byindex(const mctp_nl *nl, - int index) +static struct linkmap_entry *entry_byindex(const mctp_nl *nl, int index) { size_t i; @@ -1102,8 +1117,9 @@ bool mctp_nl_if_exists(const mctp_nl *nl, int ifindex) } static int linkmap_add_entry(mctp_nl *nl, struct ifinfomsg *info, - const char *ifname, size_t ifname_len, uint32_t net, - bool up, uint32_t min_mtu, uint32_t max_mtu, size_t hwaddr_len) + const char *ifname, size_t ifname_len, + uint32_t net, bool up, uint32_t min_mtu, + uint32_t max_mtu, size_t hwaddr_len) { struct linkmap_entry *entry; size_t newsz; @@ -1111,12 +1127,14 @@ static int linkmap_add_entry(mctp_nl *nl, struct ifinfomsg *info, int idx; if (ifname_len > IFNAMSIZ) { - warnx("linkmap, too long ifname '%*s'", (int)ifname_len, ifname); + warnx("linkmap, too long ifname '%*s'", (int)ifname_len, + ifname); return -1; } if (net <= 0) { - warnx("Bad network ID %d for %*s", net, (int)ifname_len, ifname); + warnx("Bad network ID %d for %*s", net, (int)ifname_len, + ifname); return -1; } @@ -1179,7 +1197,8 @@ static int fill_addralter_args(struct mctp_nl *nl, return 0; } -int mctp_nl_addr(struct mctp_nl *nl, mctp_eid_t eid, int ifindex, int rtm_command) +int mctp_nl_addr(struct mctp_nl *nl, mctp_eid_t eid, int ifindex, + int rtm_command) { struct mctp_addralter_msg msg; int rc; @@ -1205,13 +1224,12 @@ int mctp_nl_addr_del(struct mctp_nl *nl, mctp_eid_t eid, int ifindex) /* Common parts of RTM_NEWROUTE and RTM_DELROUTE */ struct mctp_rtalter_msg { - struct nlmsghdr nh; - struct rtmsg rtmsg; - uint8_t rta_buff[ - RTA_SPACE(sizeof(mctp_eid_t)) + // eid - RTA_SPACE(sizeof(int)) + // ifindex - 100 // space for MTU, nexthop etc - ]; + struct nlmsghdr nh; + struct rtmsg rtmsg; + uint8_t rta_buff[RTA_SPACE(sizeof(mctp_eid_t)) + // eid + RTA_SPACE(sizeof(int)) + // ifindex + 100 // space for MTU, nexthop etc + ]; }; static int fill_rtalter_args(struct mctp_nl *nl, struct mctp_rtalter_msg *msg, struct rtattr **prta, size_t *prta_len, @@ -1231,12 +1249,12 @@ static int fill_rtalter_args(struct mctp_nl *nl, struct mctp_rtalter_msg *msg, msg->nh.nlmsg_len = NLMSG_LENGTH(sizeof(msg->rtmsg)); rta_len = sizeof(msg->rta_buff); - rta = (void*)msg->rta_buff; + rta = (void *)msg->rta_buff; - msg->nh.nlmsg_len += mctp_put_rtnlmsg_attr(&rta, &rta_len, - RTA_DST, &eid, sizeof(eid)); - msg->nh.nlmsg_len += mctp_put_rtnlmsg_attr(&rta, &rta_len, - RTA_OIF, &ifindex, sizeof(ifindex)); + msg->nh.nlmsg_len += mctp_put_rtnlmsg_attr(&rta, &rta_len, RTA_DST, + &eid, sizeof(eid)); + msg->nh.nlmsg_len += mctp_put_rtnlmsg_attr(&rta, &rta_len, RTA_OIF, + &ifindex, sizeof(ifindex)); if (prta) *prta = rta; @@ -1269,14 +1287,15 @@ int mctp_nl_route_add(struct mctp_nl *nl, uint8_t eid, int ifindex, size_t rta_len1, space1; uint8_t buff1[100]; - rta1 = (void*)buff1; + rta1 = (void *)buff1; rta_len1 = sizeof(buff1); space1 = 0; - space1 += mctp_put_rtnlmsg_attr(&rta1, &rta_len1, - RTAX_MTU, &mtu, sizeof(mtu)); + space1 += mctp_put_rtnlmsg_attr(&rta1, &rta_len1, RTAX_MTU, + &mtu, sizeof(mtu)); // TODO add metric - msg.nh.nlmsg_len += mctp_put_rtnlmsg_attr(&rta, &rta_len, - RTA_METRICS|NLA_F_NESTED, buff1, space1); + msg.nh.nlmsg_len += mctp_put_rtnlmsg_attr( + &rta, &rta_len, RTA_METRICS | NLA_F_NESTED, buff1, + space1); } return mctp_nl_send(nl, &msg.nh); diff --git a/src/mctp-netlink.h b/src/mctp-netlink.h index 5b3a9465..693f2017 100644 --- a/src/mctp-netlink.h +++ b/src/mctp-netlink.h @@ -41,7 +41,7 @@ typedef struct mctp_nl_change mctp_nl_change; /* Allocates the structure, connects to netlink, and populates the list of interfaces */ // verbose flag controls dumping error response packets -mctp_nl * mctp_nl_new(bool verbose); +mctp_nl *mctp_nl_new(bool verbose); /* Cleans and deallocates nl */ void mctp_nl_close(mctp_nl *nl); @@ -53,15 +53,15 @@ void mctp_nl_warn_eexist(mctp_nl *nl, bool warn); int mctp_nl_send(mctp_nl *nl, struct nlmsghdr *msg); /* Sends a message and returns the responses. respp is optional, should be freed by the caller */ -int mctp_nl_query(mctp_nl *nl, struct nlmsghdr *msg, - struct nlmsghdr **respp, size_t *resp_lenp); +int mctp_nl_query(mctp_nl *nl, struct nlmsghdr *msg, struct nlmsghdr **respp, + size_t *resp_lenp); -int mctp_nl_recv_all(mctp_nl *nl, int sd, - struct nlmsghdr **respp, size_t *resp_lenp); +int mctp_nl_recv_all(mctp_nl *nl, int sd, struct nlmsghdr **respp, + size_t *resp_lenp); /* Lookup MCTP interfaces */ int mctp_nl_ifindex_byname(const mctp_nl *nl, const char *ifname); -const char* mctp_nl_if_byindex(const mctp_nl *nl, int index); +const char *mctp_nl_if_byindex(const mctp_nl *nl, int index); uint32_t mctp_nl_net_byindex(const mctp_nl *nl, int index); bool mctp_nl_up_byindex(const mctp_nl *nl, int index); /* Returns interface min_mtu, or 0 if bad index */ @@ -69,10 +69,11 @@ uint32_t mctp_nl_min_mtu_byindex(const mctp_nl *nl, int index); /* Returns interface max_mtu, or 0 if bad index */ uint32_t mctp_nl_max_mtu_byindex(const mctp_nl *nl, int index); /* Returns negative errno on failure */ -int mctp_nl_hwaddr_len_byindex(const mctp_nl *nl, int index, size_t *ret_hwaddr_len); +int mctp_nl_hwaddr_len_byindex(const mctp_nl *nl, int index, + size_t *ret_hwaddr_len); /* Caller to free */ mctp_eid_t *mctp_nl_addrs_byindex(const mctp_nl *nl, int index, - size_t *ret_num); + size_t *ret_num); void mctp_nl_linkmap_dump(const mctp_nl *nl); /* Returns an allocated list of nets, caller to free */ uint32_t *mctp_nl_net_list(const mctp_nl *nl, size_t *ret_num_nets); @@ -106,18 +107,21 @@ int mctp_nl_route_del(struct mctp_nl *nl, uint8_t eid, int ifindex); /* Helpers */ -void* mctp_get_rtnlmsg_attr(int rta_type, struct rtattr *rta, size_t len, - size_t *ret_len); +void *mctp_get_rtnlmsg_attr(int rta_type, struct rtattr *rta, size_t len, + size_t *ret_len); bool mctp_get_rtnlmsg_attr_u32(int rta_type, struct rtattr *rta, size_t len, - uint32_t *ret_value); + uint32_t *ret_value); bool mctp_get_rtnlmsg_attr_u8(int rta_type, struct rtattr *rta, size_t len, - uint8_t *ret_value); + uint8_t *ret_value); /* Returns the space used */ size_t mctp_put_rtnlmsg_attr(struct rtattr **prta, size_t *rta_len, - unsigned short type, const void* value, size_t val_len); + unsigned short type, const void *value, + size_t val_len); -void mctp_dump_nlmsg_error(const mctp_nl *nl, struct nlmsgerr *errmsg, size_t errlen); -void mctp_display_nlmsg_error(const mctp_nl *nl, struct nlmsgerr *errmsg, size_t errlen); +void mctp_dump_nlmsg_error(const mctp_nl *nl, struct nlmsgerr *errmsg, + size_t errlen); +void mctp_display_nlmsg_error(const mctp_nl *nl, struct nlmsgerr *errmsg, + size_t errlen); /* enable=true will return the socket listening for netlink messages. enable=false stops receiving @@ -128,8 +132,7 @@ int mctp_nl_monitor(mctp_nl *nl, bool enable); Updates are returned in 'changes', with the new state reflected in the nl struct */ int mctp_nl_handle_monitor(mctp_nl *nl, mctp_nl_change **changes, - size_t *num_changes); + size_t *num_changes); void mctp_nl_changes_dump(mctp_nl *nl, mctp_nl_change *changes, - size_t num_changes); - + size_t num_changes); diff --git a/src/mctp-ops.c b/src/mctp-ops.c index ecd0ada4..0088dd31 100644 --- a/src/mctp-ops.c +++ b/src/mctp-ops.c @@ -30,19 +30,19 @@ static int mctp_op_bind(int sd, struct sockaddr *addr, socklen_t addrlen) } static int mctp_op_setsockopt(int sd, int level, int optname, void *optval, - socklen_t optlen) + socklen_t optlen) { return setsockopt(sd, level, optname, optval, optlen); } static ssize_t mctp_op_sendto(int sd, const void *buf, size_t len, int flags, - const struct sockaddr *dest, socklen_t addrlen) + const struct sockaddr *dest, socklen_t addrlen) { return sendto(sd, buf, len, flags, dest, addrlen); } static ssize_t mctp_op_recvfrom(int sd, void *buf, size_t len, int flags, - struct sockaddr *src, socklen_t *addrlen) + struct sockaddr *src, socklen_t *addrlen) { return recvfrom(sd, buf, len, flags, src, addrlen); } @@ -52,7 +52,7 @@ static int mctp_op_close(int sd) return close(sd); } -static void mctp_bug_warn(const char* fmt, va_list args) +static void mctp_bug_warn(const char *fmt, va_list args) { vwarnx(fmt, args); } @@ -77,4 +77,6 @@ const struct mctp_ops mctp_ops = { .bug_warn = mctp_bug_warn, }; -void mctp_ops_init(void) { } +void mctp_ops_init(void) +{ +} diff --git a/src/mctp-ops.h b/src/mctp-ops.h index 7f8a815a..105072ba 100644 --- a/src/mctp-ops.h +++ b/src/mctp-ops.h @@ -27,7 +27,7 @@ struct socket_ops { struct mctp_ops { struct socket_ops mctp; struct socket_ops nl; - void (*bug_warn)(const char* fmt, va_list args); + void (*bug_warn)(const char *fmt, va_list args); }; extern const struct mctp_ops mctp_ops; diff --git a/src/mctp-req.c b/src/mctp-req.c index d6cf9612..6904c1b5 100644 --- a/src/mctp-req.c +++ b/src/mctp-req.c @@ -27,9 +27,8 @@ static const uint8_t VENDOR_TYPE_ECHO[3] = { 0xcc, 0xde, 0xf0 }; static const uint8_t MCTP_TYPE_VENDOR_PCIE = 0x7e; /* lladdrlen != -1 to ignore ifindex/lladdr */ -static int mctp_req(unsigned int net, mctp_eid_t eid, - unsigned int ifindex, uint8_t *lladdr, int lladdrlen, - uint8_t *data, size_t len) +static int mctp_req(unsigned int net, mctp_eid_t eid, unsigned int ifindex, + uint8_t *lladdr, int lladdrlen, uint8_t *data, size_t len) { struct sockaddr_mctp_ext addr; unsigned char *payload, *buf; @@ -48,8 +47,8 @@ static int mctp_req(unsigned int net, mctp_eid_t eid, addr.smctp_base.smctp_addr.s_addr = eid; addr.smctp_base.smctp_type = MCTP_TYPE_VENDOR_PCIE; addr.smctp_base.smctp_tag = MCTP_TAG_OWNER; - printf("req: sending to (net %d, eid %d), type 0x%x\n", - net, eid, addr.smctp_base.smctp_type); + printf("req: sending to (net %d, eid %d), type 0x%x\n", net, eid, + addr.smctp_base.smctp_type); buf_len = len + sizeof(VENDOR_TYPE_ECHO); buf = malloc(buf_len); @@ -72,47 +71,45 @@ static int mctp_req(unsigned int net, mctp_eid_t eid, memcpy(addr.smctp_haddr, lladdr, lladdrlen); addr.smctp_ifindex = ifindex; printf(" ext ifindex %d ha[0]=0x%02x len %hhu\n", - addr.smctp_ifindex, - addr.smctp_haddr[0], addr.smctp_halen); + addr.smctp_ifindex, addr.smctp_haddr[0], + addr.smctp_halen); val = 1; - rc = setsockopt(sd, SOL_MCTP, MCTP_OPT_ADDR_EXT, &val, sizeof(val)); + rc = setsockopt(sd, SOL_MCTP, MCTP_OPT_ADDR_EXT, &val, + sizeof(val)); if (rc < 0) errx(EXIT_FAILURE, - "Kernel does not support MCTP extended addressing"); + "Kernel does not support MCTP extended addressing"); } - /* send data */ - rc = sendto(sd, buf, buf_len, 0, - (struct sockaddr *)&addr, addrlen); + rc = sendto(sd, buf, buf_len, 0, (struct sockaddr *)&addr, addrlen); if (rc != (int)buf_len) err(EXIT_FAILURE, "sendto(%zd)", buf_len); /* receive response */ addrlen = sizeof(addr); - rc = recvfrom(sd, buf, buf_len, MSG_TRUNC, - (struct sockaddr *)&addr, &addrlen); + rc = recvfrom(sd, buf, buf_len, MSG_TRUNC, (struct sockaddr *)&addr, + &addrlen); if (rc < 0) err(EXIT_FAILURE, "recvfrom"); else if ((size_t)rc != buf_len) - errx(EXIT_FAILURE, "unexpected length: got %d, exp %zd", - rc, buf_len); + errx(EXIT_FAILURE, "unexpected length: got %d, exp %zd", rc, + buf_len); if (!(addrlen == sizeof(struct sockaddr_mctp_ext) || - addrlen == sizeof(struct sockaddr_mctp))) - errx(EXIT_FAILURE, "unknown recv address length %d, exp %zu or %zu)", - addrlen, sizeof(struct sockaddr_mctp_ext), - sizeof(struct sockaddr_mctp)); - + addrlen == sizeof(struct sockaddr_mctp))) + errx(EXIT_FAILURE, + "unknown recv address length %d, exp %zu or %zu)", addrlen, + sizeof(struct sockaddr_mctp_ext), + sizeof(struct sockaddr_mctp)); printf("req: message from (net %d, eid %d) type 0x%x len %zd\n", - addr.smctp_base.smctp_network, addr.smctp_base.smctp_addr.s_addr, - addr.smctp_base.smctp_type, - len); + addr.smctp_base.smctp_network, addr.smctp_base.smctp_addr.s_addr, + addr.smctp_base.smctp_type, len); if (addrlen == sizeof(struct sockaddr_mctp_ext)) { printf(" ext ifindex %d ha[0]=0x%02x len %hhu\n", - addr.smctp_ifindex, - addr.smctp_haddr[0], addr.smctp_halen); + addr.smctp_ifindex, addr.smctp_haddr[0], + addr.smctp_halen); } if (memcmp(buf, VENDOR_TYPE_ECHO, sizeof(VENDOR_TYPE_ECHO)) != 0) { @@ -123,9 +120,9 @@ static int mctp_req(unsigned int net, mctp_eid_t eid, uint8_t exp = data ? data[i] : i & 0xff; if (payload[i] != exp) errx(EXIT_FAILURE, - "payload mismatch at byte 0x%zx; " - "sent 0x%02x, received 0x%02x", - i, exp, buf[i]); + "payload mismatch at byte 0x%zx; " + "sent 0x%02x, received 0x%02x", + i, exp, buf[i]); } return 0; @@ -133,12 +130,13 @@ static int mctp_req(unsigned int net, mctp_eid_t eid, static void usage(void) { - fprintf(stderr, "mctp-req [eid ] [net ] [ifindex lladdr ] [len ]\n"); - fprintf(stderr, "default eid %d net %d len %zd\n", - DEFAULT_EID, DEFAULT_NET, DEFAULT_LEN); + fprintf(stderr, + "mctp-req [eid ] [net ] [ifindex lladdr ] [len ]\n"); + fprintf(stderr, "default eid %d net %d len %zd\n", DEFAULT_EID, + DEFAULT_NET, DEFAULT_LEN); } -int main(int argc, char ** argv) +int main(int argc, char **argv) { uint8_t *data, lladdr[MAX_ADDR_LEN]; int lladdrlen = -1, datalen = -1; @@ -151,7 +149,7 @@ int main(int argc, char ** argv) int i; if (!(argc % 2)) { - warnx("extra argument %s", argv[argc-1]); + warnx("extra argument %s", argv[argc - 1]); usage(); return 255; } @@ -161,7 +159,7 @@ int main(int argc, char ** argv) for (i = 1; i < argc; i += 2) { optname = argv[i]; - optval = argv[i+1]; + optval = argv[i + 1]; tmp = strtoul(optval, &endp, 0); valid_parse = (endp != optval); @@ -202,8 +200,8 @@ int main(int argc, char ** argv) // Handle bad integer etc. if (!valid_parse) { - errx(EXIT_FAILURE, "invalid %s value %s", - optname, optval); + errx(EXIT_FAILURE, "invalid %s value %s", optname, + optval); } } diff --git a/src/mctp-util.c b/src/mctp-util.c index ed003cb9..05b26972 100644 --- a/src/mctp-util.c +++ b/src/mctp-util.c @@ -5,108 +5,108 @@ #include #include "mctp-util.h" -void mctp_hexdump(const void *b, int len, const char *indent) { - const char* buf = b; - const int row_len = 16; - int i, j; +void mctp_hexdump(const void *b, int len, const char *indent) +{ + const char *buf = b; + const int row_len = 16; + int i, j; - for (i = 0; i < len; i += row_len) { - char hbuf[row_len * strlen("00 ") + 1]; - char cbuf[row_len + strlen("|") + 1]; + for (i = 0; i < len; i += row_len) { + char hbuf[row_len * strlen("00 ") + 1]; + char cbuf[row_len + strlen("|") + 1]; - for (j = 0; (j < row_len) && ((i+j) < len); j++) { - unsigned char c = buf[i + j]; + for (j = 0; (j < row_len) && ((i + j) < len); j++) { + unsigned char c = buf[i + j]; - sprintf(hbuf + j * 3, "%02x ", c); + sprintf(hbuf + j * 3, "%02x ", c); - if (!isprint(c)) - c = '.'; + if (!isprint(c)) + c = '.'; - sprintf(cbuf + j, "%c", c); - } + sprintf(cbuf + j, "%c", c); + } - strcat(cbuf, "|"); + strcat(cbuf, "|"); - printf("%s%08x %*s |%s\n", indent, i, - (int)(0 - sizeof(hbuf) + 1), hbuf, cbuf); - } + printf("%s%08x %*s |%s\n", indent, i, + (int)(0 - sizeof(hbuf) + 1), hbuf, cbuf); + } } void print_hex_addr(const uint8_t *data, size_t len) { - for (size_t i = 0; i < len; i++) { - if (i > 0) { - putchar(':'); - } - printf("%02x", data[i]); - } + for (size_t i = 0; i < len; i++) { + if (i > 0) { + putchar(':'); + } + printf("%02x", data[i]); + } } -int write_hex_addr(const uint8_t *data, size_t len, char* dest, size_t dest_len) +int write_hex_addr(const uint8_t *data, size_t len, char *dest, size_t dest_len) { - size_t l; - if (dest_len < len*3) { - snprintf(dest, dest_len, "XXXX"); - return -EINVAL; - } - - dest[0] = '\0'; - for (size_t i = 0; i < len; i++) { - if (i > 0) { - l = snprintf(dest, dest_len, ":"); - if (l >= dest_len) - return -EPROTO; - dest_len -= l; - dest += l; - } - l = snprintf(dest, dest_len, "%02x", data[i]); - if (l >= dest_len) - return -EPROTO; - dest_len -= l; - dest += l; - } - return 0; + size_t l; + if (dest_len < len * 3) { + snprintf(dest, dest_len, "XXXX"); + return -EINVAL; + } + + dest[0] = '\0'; + for (size_t i = 0; i < len; i++) { + if (i > 0) { + l = snprintf(dest, dest_len, ":"); + if (l >= dest_len) + return -EPROTO; + dest_len -= l; + dest += l; + } + l = snprintf(dest, dest_len, "%02x", data[i]); + if (l >= dest_len) + return -EPROTO; + dest_len -= l; + dest += l; + } + return 0; } // Accepts colon separated hex bytes -int parse_hex_addr(const char* in, uint8_t *out, size_t *out_len) +int parse_hex_addr(const char *in, uint8_t *out, size_t *out_len) { - int rc = -1; - size_t out_pos = 0; - while (1) { - if (*in == '\0') { - rc = 0; - break; - } - else if (*in == ':') { - in++; - if (*in == ':' || *in == '\0' || out_pos == 0) { - // can't have repeated ':' or ':' at start or end. - break; - } - } else { - char* endp; - int tmp; - tmp = strtoul(in, &endp, 16); - if (endp == in || tmp > 0xff) { - break; - } - if (out_pos >= *out_len) { - break; - } - *out = tmp & 0xff; - out++; - out_pos++; - in = endp; - } - } - - if (rc) { - *out_len = 0; - } else { - *out_len = out_pos; - } - return rc; + int rc = -1; + size_t out_pos = 0; + while (1) { + if (*in == '\0') { + rc = 0; + break; + } else if (*in == ':') { + in++; + if (*in == ':' || *in == '\0' || out_pos == 0) { + // can't have repeated ':' or ':' at start or end. + break; + } + } else { + char *endp; + int tmp; + tmp = strtoul(in, &endp, 16); + if (endp == in || tmp > 0xff) { + break; + } + if (out_pos >= *out_len) { + break; + } + *out = tmp & 0xff; + out++; + out_pos++; + in = endp; + } + } + + if (rc) { + *out_len = 0; + } else { + *out_len = out_pos; + } + return rc; } int parse_uint32(const char *str, uint32_t *out) @@ -136,24 +136,24 @@ int parse_int32(const char *str, int32_t *out) } /* Returns a malloced pointer */ -char* bytes_to_uuid(const uint8_t u[16]) +char *bytes_to_uuid(const uint8_t u[16]) { char *buf = malloc(37); if (!buf) { return NULL; } snprintf(buf, 37, - "%02x%02x%02x%02x" - "-" - "%02x%02x" - "-" - "%02x%02x" - "-" - "%02x%02x" - "-" - "%02x%02x%02x%02x%02x%02x", - u[0], u[1], u[2], u[3], u[4], u[5], u[6], u[7], - u[8], u[9], u[10], u[11], u[12], u[13], u[14], u[15]); + "%02x%02x%02x%02x" + "-" + "%02x%02x" + "-" + "%02x%02x" + "-" + "%02x%02x" + "-" + "%02x%02x%02x%02x%02x%02x", + u[0], u[1], u[2], u[3], u[4], u[5], u[6], u[7], u[8], u[9], + u[10], u[11], u[12], u[13], u[14], u[15]); return buf; } diff --git a/src/mctp-util.h b/src/mctp-util.h index a4bb0087..0c0ff13b 100644 --- a/src/mctp-util.h +++ b/src/mctp-util.h @@ -6,14 +6,15 @@ #define max(a, b) ((a) > (b) ? (a) : (b)) #define min(a, b) ((a) < (b) ? (a) : (b)) -#define ARRAY_SIZE(a) (sizeof(a)/sizeof((a)[0])) +#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) void mctp_hexdump(const void *b, int len, const char *indent); void print_hex_addr(const uint8_t *data, size_t len); -int write_hex_addr(const uint8_t *data, size_t len, char* dest, size_t dest_len); -int parse_hex_addr(const char* in, uint8_t *out, size_t *out_len); +int write_hex_addr(const uint8_t *data, size_t len, char *dest, + size_t dest_len); +int parse_hex_addr(const char *in, uint8_t *out, size_t *out_len); int parse_uint32(const char *str, uint32_t *out); int parse_int32(const char *str, int32_t *out); /* Returns a malloced pointer */ -char* bytes_to_uuid(const uint8_t u[16]); +char *bytes_to_uuid(const uint8_t u[16]); bool mctp_eid_is_valid_unicast(mctp_eid_t eid); diff --git a/src/mctp.c b/src/mctp.c index 8eb5f59c..ad5b50d9 100644 --- a/src/mctp.c +++ b/src/mctp.c @@ -36,12 +36,12 @@ #include "mctp-ops.h" struct ctx { - mctp_nl *nl; - bool verbose; - const char* top_cmd; // main() argv[0] + mctp_nl *nl; + bool verbose; + const char *top_cmd; // main() argv[0] }; -typedef int (*display_fn_t)(struct ctx *ctx, void* msg, size_t len); +typedef int (*display_fn_t)(struct ctx *ctx, void *msg, size_t len); enum attrgroup { RTA_GROUP_IFLA, @@ -145,8 +145,8 @@ static struct { const char **names; } attrnames[] = { [RTA_GROUP_IFLA] = { ARRAY_SIZE(ifla_attrnames), ifla_attrnames }, - [RTA_GROUP_IFA] = { ARRAY_SIZE(ifa_attrnames), ifa_attrnames }, - [RTA_GROUP_NDA] = { ARRAY_SIZE(nda_attrnames), nda_attrnames }, + [RTA_GROUP_IFA] = { ARRAY_SIZE(ifa_attrnames), ifa_attrnames }, + [RTA_GROUP_NDA] = { ARRAY_SIZE(nda_attrnames), nda_attrnames }, }; static const char *rtattr_name(enum attrgroup group, unsigned int type) @@ -158,22 +158,23 @@ static const char *rtattr_name(enum attrgroup group, unsigned int type) return attrnames[group].names[type]; } -static void dump_rtnlmsg_attrs(enum attrgroup group, - struct rtattr *rta, size_t len) +static void dump_rtnlmsg_attrs(enum attrgroup group, struct rtattr *rta, + size_t len) { for (; RTA_OK(rta, len); rta = RTA_NEXT(rta, len)) { printf("attr %s (0x%x)\n", rtattr_name(group, rta->rta_type), - rta->rta_type); + rta->rta_type); mctp_hexdump(RTA_DATA(rta), RTA_PAYLOAD(rta), " "); } } -static int display_ifinfo(struct ctx *ctx, void *p, size_t len) { +static int display_ifinfo(struct ctx *ctx, void *p, size_t len) +{ struct ifinfomsg *msg = p; size_t rta_len, nest_len, mctp_len; struct rtattr *rta, *rt_nest, *rt_mctp; - char* name; - const char* updown; + char *name; + const char *updown; uint8_t *addr; size_t name_len, addr_len; uint32_t mtu = 0; @@ -200,21 +201,23 @@ static int display_ifinfo(struct ctx *ctx, void *p, size_t len) { rt_mctp = NULL; rt_nest = mctp_get_rtnlmsg_attr(IFLA_AF_SPEC, rta, rta_len, &nest_len); if (rt_nest) { - rt_mctp = mctp_get_rtnlmsg_attr(AF_MCTP, rt_nest, nest_len, &mctp_len); + rt_mctp = mctp_get_rtnlmsg_attr(AF_MCTP, rt_nest, nest_len, + &mctp_len); } if (!rt_mctp) { // Ignore other interfaces return 0; } - if (!mctp_get_rtnlmsg_attr_u32(IFLA_MCTP_NET, rt_mctp, mctp_len, &net)) { + if (!mctp_get_rtnlmsg_attr_u32(IFLA_MCTP_NET, rt_mctp, mctp_len, + &net)) { warnx("No network attribute from %*s", (int)name_len, name); } updown = msg->ifi_flags & IFF_UP ? "up" : "down"; // not sure if will be NULL terminated, handle either name_len = strnlen(name, name_len); - printf("dev %*s index %d address ", - (int)name_len, name, msg->ifi_index); + printf("dev %*s index %d address ", (int)name_len, name, + msg->ifi_index); if (addr_len == 1) { // make it clear that it is hex not decimal printf("0x"); @@ -227,7 +230,8 @@ static int display_ifinfo(struct ctx *ctx, void *p, size_t len) { return 0; } -static void dump_rtnlmsg_ifinfo(struct ctx *ctx, struct ifinfomsg *msg, size_t len) +static void dump_rtnlmsg_ifinfo(struct ctx *ctx, struct ifinfomsg *msg, + size_t len) { if (len < sizeof(*msg)) { printf("not enough data for an ifinfomsg\n"); @@ -241,11 +245,12 @@ static void dump_rtnlmsg_ifinfo(struct ctx *ctx, struct ifinfomsg *msg, size_t l printf(" index: %d\n", msg->ifi_index); printf(" flags: 0x%08x\n", msg->ifi_flags); - dump_rtnlmsg_attrs(RTA_GROUP_IFLA, - (void *)(msg + 1), len - sizeof(*msg)); + dump_rtnlmsg_attrs(RTA_GROUP_IFLA, (void *)(msg + 1), + len - sizeof(*msg)); } -static int display_ifaddr(struct ctx *ctx, void *p, size_t len) { +static int display_ifaddr(struct ctx *ctx, void *p, size_t len) +{ struct ifaddrmsg *msg = p; size_t rta_len; struct rtattr *rta; @@ -261,13 +266,14 @@ static int display_ifaddr(struct ctx *ctx, void *p, size_t len) { eid = 0; mctp_get_rtnlmsg_attr_u8(IFA_LOCAL, rta, rta_len, &eid); printf("eid %d net %u dev %s\n", eid, - mctp_nl_net_byindex(ctx->nl, msg->ifa_index), - mctp_nl_if_byindex(ctx->nl, msg->ifa_index)); + mctp_nl_net_byindex(ctx->nl, msg->ifa_index), + mctp_nl_if_byindex(ctx->nl, msg->ifa_index)); return 0; } -static void dump_rtnlmsg_ifaddr(struct ctx *ctx, struct ifaddrmsg *msg, size_t len) +static void dump_rtnlmsg_ifaddr(struct ctx *ctx, struct ifaddrmsg *msg, + size_t len) { if (len < sizeof(*msg)) { printf("not enough data for an ifaddrmsg\n"); @@ -282,8 +288,8 @@ static void dump_rtnlmsg_ifaddr(struct ctx *ctx, struct ifaddrmsg *msg, size_t l printf(" scope: %d\n", msg->ifa_scope); printf(" index: %d\n", msg->ifa_index); - dump_rtnlmsg_attrs(RTA_GROUP_IFA, - (void *)(msg + 1), len - sizeof(*msg)); + dump_rtnlmsg_attrs(RTA_GROUP_IFA, (void *)(msg + 1), + len - sizeof(*msg)); } static int display_neighbour(struct ctx *ctx, void *p, size_t len) @@ -306,8 +312,8 @@ static int display_neighbour(struct ctx *ctx, void *p, size_t len) mctp_get_rtnlmsg_attr_u8(NDA_DST, rta, rta_len, &eid); lladdr = mctp_get_rtnlmsg_attr(NDA_LLADDR, rta, rta_len, &lladdr_len); printf("eid %d net %u dev %s lladdr 0x", eid, - mctp_nl_net_byindex(ctx->nl, msg->ndm_ifindex), - mctp_nl_if_byindex(ctx->nl, msg->ndm_ifindex)); + mctp_nl_net_byindex(ctx->nl, msg->ndm_ifindex), + mctp_nl_if_byindex(ctx->nl, msg->ndm_ifindex)); if (lladdr && lladdr_len) print_hex_addr(lladdr, lladdr_len); else @@ -316,7 +322,8 @@ static int display_neighbour(struct ctx *ctx, void *p, size_t len) return 0; } -static void dump_rtnlmsg_neighbour(struct ctx *ctx, struct ndmsg *msg, size_t len) +static void dump_rtnlmsg_neighbour(struct ctx *ctx, struct ndmsg *msg, + size_t len) { if (len < sizeof(*msg)) { printf("not enough data for a ndmsg\n"); @@ -331,8 +338,8 @@ static void dump_rtnlmsg_neighbour(struct ctx *ctx, struct ndmsg *msg, size_t le printf(" flags: 0x%08x\n", msg->ndm_flags); printf(" type: %d\n", msg->ndm_type); - dump_rtnlmsg_attrs(RTA_GROUP_NDA, - (void *)(msg + 1), len - sizeof(*msg)); + dump_rtnlmsg_attrs(RTA_GROUP_NDA, (void *)(msg + 1), + len - sizeof(*msg)); } static int display_route(struct ctx *ctx, void *p, size_t len) @@ -362,9 +369,9 @@ static int display_route(struct ctx *ctx, void *p, size_t len) } net = mctp_nl_net_byindex(ctx->nl, ifindex); - printf("eid min %d max %d net %d dev %s mtu %d\n", - dst, dst + msg->rtm_dst_len, - net, mctp_nl_if_byindex(ctx->nl, ifindex), mtu); + printf("eid min %d max %d net %d dev %s mtu %d\n", dst, + dst + msg->rtm_dst_len, net, + mctp_nl_if_byindex(ctx->nl, ifindex), mtu); return 0; } @@ -447,7 +454,7 @@ static void dump_rtnlmsgs(struct ctx *ctx, struct nlmsghdr *msg, size_t len) // Calls pretty printing display_ function for wanted message type void display_rtnlmsgs(struct ctx *ctx, struct nlmsghdr *msg, size_t len, - int want_type, display_fn_t display_fn) + int want_type, display_fn_t display_fn) { if (ctx->verbose) { @@ -459,17 +466,20 @@ void display_rtnlmsgs(struct ctx *ctx, struct nlmsghdr *msg, size_t len, for (; NLMSG_OK(msg, len); msg = NLMSG_NEXT(msg, len)) { if (msg->nlmsg_type == want_type) { display_fn(ctx, NLMSG_DATA(msg), NLMSG_PAYLOAD(msg, 0)); - } else switch (msg->nlmsg_type) { + } else + switch (msg->nlmsg_type) { case NLMSG_NOOP: case NLMSG_DONE: break; case NLMSG_ERROR: - mctp_display_nlmsg_error(ctx->nl, NLMSG_DATA(msg), NLMSG_PAYLOAD(msg, 0)); + mctp_display_nlmsg_error(ctx->nl, + NLMSG_DATA(msg), + NLMSG_PAYLOAD(msg, 0)); break; default: printf("unknown nlmsg type\n"); mctp_hexdump(msg, sizeof(msg), " "); - } + } } } @@ -477,9 +487,9 @@ static int cmd_link_show(struct ctx *ctx, int argc, const char **argv) { struct nlmsghdr *resp; struct { - struct nlmsghdr nh; - struct ifinfomsg ifmsg; - } msg = {0}; + struct nlmsghdr nh; + struct ifinfomsg ifmsg; + } msg = { 0 }; const char *linkstr = NULL; int ifindex; size_t len; @@ -519,13 +529,14 @@ static int cmd_link_show(struct ctx *ctx, int argc, const char **argv) } static int do_link_set(struct ctx *ctx, int ifindex, bool have_updown, bool up, - uint32_t mtu, bool have_net, uint32_t net) { + uint32_t mtu, bool have_net, uint32_t net) +{ struct { - struct nlmsghdr nh; - struct ifinfomsg ifmsg; + struct nlmsghdr nh; + struct ifinfomsg ifmsg; /* Space for all attributes */ - uint8_t rta_buff[200]; - } msg = {0}; + uint8_t rta_buff[200]; + } msg = { 0 }; struct rtattr *rta; size_t rta_len; @@ -535,7 +546,7 @@ static int do_link_set(struct ctx *ctx, int ifindex, bool have_updown, bool up, msg.nh.nlmsg_len = NLMSG_LENGTH(sizeof(msg.ifmsg)); rta_len = sizeof(msg.rta_buff); - rta = (void*)msg.rta_buff; + rta = (void *)msg.rta_buff; if (have_updown) { msg.ifmsg.ifi_change |= IFF_UP; @@ -544,8 +555,8 @@ static int do_link_set(struct ctx *ctx, int ifindex, bool have_updown, bool up, } if (mtu) - msg.nh.nlmsg_len += mctp_put_rtnlmsg_attr(&rta, &rta_len, - IFLA_MTU, &mtu, sizeof(mtu)); + msg.nh.nlmsg_len += mctp_put_rtnlmsg_attr( + &rta, &rta_len, IFLA_MTU, &mtu, sizeof(mtu)); if (have_net) { /* Nested @@ -558,24 +569,28 @@ static int do_link_set(struct ctx *ctx, int ifindex, bool have_updown, bool up, size_t rta_len1, rta_len2, space1, space2; uint8_t buff1[100], buff2[100]; - rta2 = (void*)buff2; + rta2 = (void *)buff2; rta_len2 = sizeof(buff2); space2 = 0; if (have_net) space2 += mctp_put_rtnlmsg_attr(&rta2, &rta_len2, - IFLA_MCTP_NET, &net, sizeof(net)); - rta1 = (void*)buff1; + IFLA_MCTP_NET, &net, + sizeof(net)); + rta1 = (void *)buff1; rta_len1 = sizeof(buff1); space1 = mctp_put_rtnlmsg_attr(&rta1, &rta_len1, - AF_MCTP|NLA_F_NESTED, buff2, space2); - msg.nh.nlmsg_len += mctp_put_rtnlmsg_attr(&rta, &rta_len, - IFLA_AF_SPEC|NLA_F_NESTED, buff1, space1); + AF_MCTP | NLA_F_NESTED, buff2, + space2); + msg.nh.nlmsg_len += mctp_put_rtnlmsg_attr( + &rta, &rta_len, IFLA_AF_SPEC | NLA_F_NESTED, buff1, + space1); } return mctp_nl_send(ctx->nl, &msg.nh); } -static int cmd_link_set(struct ctx *ctx, int argc, const char **argv) { +static int cmd_link_set(struct ctx *ctx, int argc, const char **argv) +{ bool have_updown = false, up = false, have_net = false; int i; int ifindex; @@ -638,7 +653,6 @@ static int cmd_link_set(struct ctx *ctx, int argc, const char **argv) { } return do_link_set(ctx, ifindex, have_updown, up, mtu, have_net, net); - } static int cmd_link_serial(struct ctx *ctx, int argc, const char **argv) @@ -648,7 +662,7 @@ static int cmd_link_serial(struct ctx *ctx, int argc, const char **argv) if (argc != 2) { fprintf(stderr, "%s link serial: no device specified\n", - ctx->top_cmd); + ctx->top_cmd); return 255; } @@ -666,17 +680,19 @@ static int cmd_link_serial(struct ctx *ctx, int argc, const char **argv) pause(); - return 0; + return 0; } static int cmd_link(struct ctx *ctx, int argc, const char **argv) { - const char* subcmd; + const char *subcmd; if (argc == 2 && !strcmp(argv[1], "help")) { fprintf(stderr, "%s link\n", ctx->top_cmd); fprintf(stderr, "%s link show [ifname]\n", ctx->top_cmd); - fprintf(stderr, "%s link set [up|down] [mtu ] [network ] [bus-owner ]\n", ctx->top_cmd); + fprintf(stderr, + "%s link set [up|down] [mtu ] [network ] [bus-owner ]\n", + ctx->top_cmd); fprintf(stderr, "%s link serial \n", ctx->top_cmd); return 255; } @@ -706,11 +722,11 @@ static int cmd_addr_show(struct ctx *ctx, int argc, const char **argv) { struct nlmsghdr *resp; struct { - struct nlmsghdr nh; - struct ifaddrmsg ifmsg; - struct rtattr rta; - char ifname[16]; - } msg = {0}; + struct nlmsghdr nh; + struct ifaddrmsg ifmsg; + struct rtattr rta; + char ifname[16]; + } msg = { 0 }; const char *ifname = NULL; int ifindex = 0; size_t len; @@ -741,12 +757,10 @@ static int cmd_addr_show(struct ctx *ctx, int argc, const char **argv) return 0; } - // cmdname is for error messages. // rtm_command is RTM_NEWADDR or RTM_DELADDR -static int cmd_addr_addremove(struct ctx *ctx, - const char* cmdname, int rtm_command, - int argc, const char **argv) +static int cmd_addr_addremove(struct ctx *ctx, const char *cmdname, + int rtm_command, int argc, const char **argv) { const char *eidstr, *linkstr; uint32_t tmp; @@ -795,12 +809,14 @@ static int cmd_addr_remove(struct ctx *ctx, int argc, const char **argv) static int cmd_addr(struct ctx *ctx, int argc, const char **argv) { - const char* subcmd; + const char *subcmd; if (argc == 2 && !strcmp(argv[1], "help")) { fprintf(stderr, "%s address\n", ctx->top_cmd); fprintf(stderr, "%s address show [IFNAME]\n", ctx->top_cmd); - fprintf(stderr, "%s address add dev \n", ctx->top_cmd); - fprintf(stderr, "%s address del dev \n", ctx->top_cmd); + fprintf(stderr, "%s address add dev \n", + ctx->top_cmd); + fprintf(stderr, "%s address del dev \n", + ctx->top_cmd); return 255; } @@ -826,10 +842,10 @@ static int cmd_route_show(struct ctx *ctx, int argc, const char **argv) { struct nlmsghdr *resp; struct { - struct nlmsghdr nh; - struct rtmsg rtmsg; + struct nlmsghdr nh; + struct rtmsg rtmsg; // struct rtattr rta; - } msg = {0}; + } msg = { 0 }; size_t len; int rc; @@ -849,7 +865,6 @@ static int cmd_route_show(struct ctx *ctx, int argc, const char **argv) return 0; } - static int cmd_route_add(struct ctx *ctx, int argc, const char **argv) { const char *eidstr = NULL, *linkstr = NULL, *mtustr = NULL; @@ -939,11 +954,13 @@ static int cmd_route_del(struct ctx *ctx, int argc, const char **argv) static int cmd_route(struct ctx *ctx, int argc, const char **argv) { - const char* subcmd; + const char *subcmd; if (argc == 2 && !strcmp(argv[1], "help")) { fprintf(stderr, "%s route\n", ctx->top_cmd); - fprintf(stderr, "%s route show [net ]\n", ctx->top_cmd); - fprintf(stderr, "%s route add via [mtu ]\n", ctx->top_cmd); + fprintf(stderr, "%s route show [net ]\n", + ctx->top_cmd); + fprintf(stderr, "%s route add via [mtu ]\n", + ctx->top_cmd); fprintf(stderr, "%s route del via \n", ctx->top_cmd); return 255; } @@ -970,10 +987,10 @@ static int cmd_neigh_show(struct ctx *ctx, int argc, const char **argv) { struct nlmsghdr *resp; struct { - struct nlmsghdr nh; - struct ndmsg ndmsg; - } msg = {0}; - const char* linkstr = NULL; + struct nlmsghdr nh; + struct ndmsg ndmsg; + } msg = { 0 }; + const char *linkstr = NULL; int ifindex = 0; size_t len; int rc; @@ -1014,15 +1031,16 @@ static int cmd_neigh_show(struct ctx *ctx, int argc, const char **argv) } struct mctp_neighalter_msg { - struct nlmsghdr nh; - struct ndmsg ndmsg; - uint8_t rta_buff[RTA_SPACE(1) + RTA_SPACE(MAX_ADDR_LEN)]; + struct nlmsghdr nh; + struct ndmsg ndmsg; + uint8_t rta_buff[RTA_SPACE(1) + RTA_SPACE(MAX_ADDR_LEN)]; }; static int fill_neighalter_args(struct ctx *ctx, - struct mctp_neighalter_msg *msg, - struct rtattr **prta, size_t *prta_len, - const char *eidstr, const char *linkstr) { + struct mctp_neighalter_msg *msg, + struct rtattr **prta, size_t *prta_len, + const char *eidstr, const char *linkstr) +{ struct rtattr *rta; uint32_t tmp; uint8_t eid; @@ -1048,11 +1066,10 @@ static int fill_neighalter_args(struct ctx *ctx, msg->nh.nlmsg_len = NLMSG_LENGTH(sizeof(msg->ndmsg)); rta_len = sizeof(msg->rta_buff); - rta = (void*)msg->rta_buff; - - msg->nh.nlmsg_len += mctp_put_rtnlmsg_attr(&rta, &rta_len, - NDA_DST, &eid, sizeof(eid)); + rta = (void *)msg->rta_buff; + msg->nh.nlmsg_len += mctp_put_rtnlmsg_attr(&rta, &rta_len, NDA_DST, + &eid, sizeof(eid)); if (prta) *prta = rta; @@ -1097,15 +1114,14 @@ static int cmd_neigh_add(struct ctx *ctx, int argc, const char **argv) return rc; } - rc = fill_neighalter_args(ctx, &msg, &rta, &rta_len, - eidstr, linkstr); + rc = fill_neighalter_args(ctx, &msg, &rta, &rta_len, eidstr, linkstr); if (rc) { return -1; } msg.nh.nlmsg_type = RTM_NEWNEIGH; - msg.nh.nlmsg_len += mctp_put_rtnlmsg_attr(&rta, &rta_len, - NDA_LLADDR, llbuf, llbuf_len); + msg.nh.nlmsg_len += mctp_put_rtnlmsg_attr(&rta, &rta_len, NDA_LLADDR, + llbuf, llbuf_len); return mctp_nl_send(ctx->nl, &msg.nh); } @@ -1131,8 +1147,7 @@ static int cmd_neigh_del(struct ctx *ctx, int argc, const char **argv) eidstr = argv[1]; linkstr = argv[3]; - rc = fill_neighalter_args(ctx, &msg, NULL, NULL, - eidstr, linkstr); + rc = fill_neighalter_args(ctx, &msg, NULL, NULL, eidstr, linkstr); if (rc) { return -1; } @@ -1141,14 +1156,20 @@ static int cmd_neigh_del(struct ctx *ctx, int argc, const char **argv) return mctp_nl_send(ctx->nl, &msg.nh); } -static int cmd_neigh(struct ctx *ctx, int argc, const char **argv) { - const char* subcmd; +static int cmd_neigh(struct ctx *ctx, int argc, const char **argv) +{ + const char *subcmd; if (argc == 2 && !strcmp(argv[1], "help")) { fprintf(stderr, "%s neigh\n", ctx->top_cmd); - fprintf(stderr, "%s neigh show [dev ]\n", ctx->top_cmd); - fprintf(stderr, "%s neigh add dev lladdr \n", ctx->top_cmd); - fprintf(stderr, " syntax is for example \"1d\" or \"aa:bb:cc:11:22:33\"\n"); - fprintf(stderr, "%s neigh del dev \n", ctx->top_cmd); + fprintf(stderr, "%s neigh show [dev ]\n", + ctx->top_cmd); + fprintf(stderr, + "%s neigh add dev lladdr \n", + ctx->top_cmd); + fprintf(stderr, + " syntax is for example \"1d\" or \"aa:bb:cc:11:22:33\"\n"); + fprintf(stderr, "%s neigh del dev \n", + ctx->top_cmd); return 255; } @@ -1162,7 +1183,7 @@ static int cmd_neigh(struct ctx *ctx, int argc, const char **argv) { if (!strcmp(subcmd, "show")) return cmd_neigh_show(ctx, argc, argv); else if (!strcmp(subcmd, "add")) - return cmd_neigh_add(ctx, argc, argv); + return cmd_neigh_add(ctx, argc, argv); else if (!strcmp(subcmd, "del")) return cmd_neigh_del(ctx, argc, argv); @@ -1170,7 +1191,8 @@ static int cmd_neigh(struct ctx *ctx, int argc, const char **argv) { return -1; } -static int cmd_monitor(struct ctx *ctx, int argc, const char **argv) { +static int cmd_monitor(struct ctx *ctx, int argc, const char **argv) +{ int rc, sd; if (argc == 2 && !strcmp(argv[1], "help")) { @@ -1201,7 +1223,7 @@ static int cmd_monitor(struct ctx *ctx, int argc, const char **argv) { return 0; } -static int cmd_help(struct ctx * ctx, int argc, const char** argv); +static int cmd_help(struct ctx *ctx, int argc, const char **argv); struct command { const char *name; @@ -1218,13 +1240,13 @@ struct command { // clang-format on }; -static int cmd_help(struct ctx * ctx, int argc, const char** argv) +static int cmd_help(struct ctx *ctx, int argc, const char **argv) { struct command *cm; size_t i; for (i = 0, cm = commands; i < ARRAY_SIZE(commands); i++, cm++) { if (!cm->hidden && cm->fn != cmd_help) { - const char * help_args[] = { cm->name, "help" }; + const char *help_args[] = { cm->name, "help" }; cm->fn(ctx, 2, help_args); fprintf(stderr, "\n"); } @@ -1233,12 +1255,14 @@ static int cmd_help(struct ctx * ctx, int argc, const char** argv) return 255; } -static void print_usage(const char* top_cmd) { +static void print_usage(const char *top_cmd) +{ fprintf(stderr, "usage: %s [args]\n", top_cmd); fprintf(stderr, "Commands: "); for (size_t i = 0; i < ARRAY_SIZE(commands); i++) { if (!commands[i].hidden) { - fprintf(stderr, "%s%s", (i>0 ? ", " : ""), commands[i].name); + fprintf(stderr, "%s%s", (i > 0 ? ", " : ""), + commands[i].name); } } fprintf(stderr, "\n"); @@ -1252,7 +1276,7 @@ struct option options[] = { int main(int argc, char **argv) { - struct ctx _ctx = {0}, *ctx = &_ctx; + struct ctx _ctx = { 0 }, *ctx = &_ctx; const char *cmdname = NULL; struct command *cmd = NULL; unsigned int i; @@ -1284,7 +1308,7 @@ int main(int argc, char **argv) argc -= optind - 1; argv += optind - 1; - if (argc < 2 || !strcmp(argv[1], "") ) { + if (argc < 2 || !strcmp(argv[1], "")) { print_usage(ctx->top_cmd); return 255; } @@ -1311,10 +1335,9 @@ int main(int argc, char **argv) argc--; argv++; - rc = cmd->fn(ctx, argc, (const char**)argv); + rc = cmd->fn(ctx, argc, (const char **)argv); mctp_nl_close(ctx->nl); return rc ? EXIT_FAILURE : EXIT_SUCCESS; } - diff --git a/src/mctp.h b/src/mctp.h index 6d5a6747..e7627dfe 100644 --- a/src/mctp.h +++ b/src/mctp.h @@ -28,27 +28,27 @@ /* MCTP serial line discipline */ #ifndef N_MCTP -#define N_MCTP 28 +#define N_MCTP 28 #endif #include #ifndef MCTP_NET_ANY -typedef uint8_t mctp_eid_t; +typedef uint8_t mctp_eid_t; struct mctp_addr { - mctp_eid_t s_addr; + mctp_eid_t s_addr; }; struct sockaddr_mctp { - unsigned short int smctp_family; - unsigned short __smctp_pad0; - int smctp_network; - struct mctp_addr smctp_addr; - uint8_t smctp_type; - uint8_t smctp_tag; - uint8_t __smctp_pad1; + unsigned short int smctp_family; + unsigned short __smctp_pad0; + int smctp_network; + struct mctp_addr smctp_addr; + uint8_t smctp_type; + uint8_t smctp_tag; + uint8_t __smctp_pad1; }; #define MCTP_NET_ANY 0 @@ -64,14 +64,14 @@ struct sockaddr_mctp { /* Added in v5.16 */ #ifndef MCTP_OPT_ADDR_EXT -#define MCTP_OPT_ADDR_EXT 1 +#define MCTP_OPT_ADDR_EXT 1 struct sockaddr_mctp_ext { - struct sockaddr_mctp smctp_base; - int smctp_ifindex; - uint8_t smctp_halen; - uint8_t __smctp_pad0[3]; - unsigned char smctp_haddr[MAX_ADDR_LEN]; + struct sockaddr_mctp smctp_base; + int smctp_ifindex; + uint8_t smctp_halen; + uint8_t __smctp_pad0[3]; + unsigned char smctp_haddr[MAX_ADDR_LEN]; }; #endif /* MCTP_OPT_ADDR_EXT */ diff --git a/src/mctpd.c b/src/mctpd.c index d6e3c422..eae63466 100644 --- a/src/mctpd.c +++ b/src/mctpd.c @@ -53,7 +53,7 @@ #define CC_MCTP_DBUS_NETWORK_INTERFACE "au.com.codeconstruct.MCTP.Network1" // an arbitrary constant for use with sd_id128_get_machine_app_specific() -static const char* mctpd_appid = "67369c05-4b97-4b7e-be72-65cfd8639f10"; +static const char *mctpd_appid = "67369c05-4b97-4b7e-be72-65cfd8639f10"; static const char *conf_file_default = MCTPD_CONF_FILE_DEFAULT; @@ -63,7 +63,7 @@ static mctp_eid_t eid_alloc_max = 0xfe; // arbitrary sanity static size_t MAX_PEER_SIZE = 1000000; -static const uint8_t RQDI_REQ = 1<<7; +static const uint8_t RQDI_REQ = 1 << 7; static const uint8_t RQDI_RESP = 0x0; static const uint8_t RQDI_IID_MASK = 0x1f; @@ -238,8 +238,7 @@ static int peer_neigh_update(struct peer *peer, uint16_t type); static int add_interface_local(struct ctx *ctx, int ifindex); static int del_interface(struct link *link); -static int change_net_interface(struct ctx *ctx, int ifindex, - uint32_t old_net); +static int change_net_interface(struct ctx *ctx, int ifindex, uint32_t old_net); static int add_local_eid(struct ctx *ctx, uint32_t net, int eid); static int del_local_eid(struct ctx *ctx, uint32_t net, int eid); static int add_net(struct ctx *ctx, uint32_t net); @@ -250,8 +249,8 @@ static const sd_bus_vtable bus_endpoint_obmc_vtable[]; static const sd_bus_vtable bus_endpoint_cc_vtable[]; static const sd_bus_vtable bus_endpoint_uuid_vtable[]; -__attribute__((format(printf, 1, 2))) -static void bug_warn(const char* fmt, ...) { +__attribute__((format(printf, 1, 2))) static void bug_warn(const char *fmt, ...) +{ char *bug_fmt = NULL; va_list ap; int rc; @@ -267,7 +266,8 @@ static void bug_warn(const char* fmt, ...) { free(bug_fmt); } -mctp_eid_t local_addr(const struct ctx *ctx, int ifindex) { +mctp_eid_t local_addr(const struct ctx *ctx, int ifindex) +{ mctp_eid_t *eids, ret = 0; size_t num; @@ -278,7 +278,7 @@ mctp_eid_t local_addr(const struct ctx *ctx, int ifindex) { return ret; } -static void* dfree(void* ptr); +static void *dfree(void *ptr); static struct net *lookup_net(struct ctx *ctx, uint32_t net) { @@ -289,11 +289,11 @@ static struct net *lookup_net(struct ctx *ctx, uint32_t net) return NULL; } -static bool match_phys(const dest_phys *d1, const dest_phys *d2) { - return d1->ifindex == d2->ifindex && - d1->hwaddr_len == d2->hwaddr_len && - (d2->hwaddr_len == 0 - || !memcmp(d1->hwaddr, d2->hwaddr, d1->hwaddr_len)); +static bool match_phys(const dest_phys *d1, const dest_phys *d2) +{ + return d1->ifindex == d2->ifindex && d1->hwaddr_len == d2->hwaddr_len && + (d2->hwaddr_len == 0 || + !memcmp(d1->hwaddr, d2->hwaddr, d1->hwaddr_len)); } static struct peer *find_peer_by_phys(struct ctx *ctx, const dest_phys *dest) @@ -318,9 +318,8 @@ static struct peer *find_peer_by_addr(struct ctx *ctx, mctp_eid_t eid, return NULL; } -static int find_local_eids_by_net(struct net *net, - size_t* local_eid_cnt, - mctp_eid_t *ret_eids) +static int find_local_eids_by_net(struct net *net, size_t *local_eid_cnt, + mctp_eid_t *ret_eids) { size_t local_count = 0; struct peer *peer; @@ -341,24 +340,25 @@ static int find_local_eids_by_net(struct net *net, } /* Returns a deferred free pointer */ -static const char* dest_phys_tostr(const dest_phys *dest) +static const char *dest_phys_tostr(const dest_phys *dest) { - char hex[MAX_ADDR_LEN*4]; - char* buf; + char hex[MAX_ADDR_LEN * 4]; + char *buf; size_t l = 50 + sizeof(hex); buf = malloc(l); if (!buf) { return "Out of memory"; } write_hex_addr(dest->hwaddr, dest->hwaddr_len, hex, sizeof(hex)); - snprintf(buf, l, "physaddr if %d hw len %zu 0x%s", dest->ifindex, dest->hwaddr_len, hex); + snprintf(buf, l, "physaddr if %d hw len %zu 0x%s", dest->ifindex, + dest->hwaddr_len, hex); return dfree(buf); } -static const char* ext_addr_tostr(const struct sockaddr_mctp_ext *addr) +static const char *ext_addr_tostr(const struct sockaddr_mctp_ext *addr) { - char hex[MAX_ADDR_LEN*4]; - char* buf; + char hex[MAX_ADDR_LEN * 4]; + char *buf; size_t l = 256; buf = malloc(l); if (!buf) { @@ -366,17 +366,16 @@ static const char* ext_addr_tostr(const struct sockaddr_mctp_ext *addr) } write_hex_addr(addr->smctp_haddr, addr->smctp_halen, hex, sizeof(hex)); - snprintf(buf, l, - "sockaddr_mctp_ext eid %d net %u type 0x%02x if %d hw len %hhu 0x%s", + snprintf( + buf, l, + "sockaddr_mctp_ext eid %d net %u type 0x%02x if %d hw len %hhu 0x%s", addr->smctp_base.smctp_addr.s_addr, - addr->smctp_base.smctp_network, - addr->smctp_base.smctp_type, - addr->smctp_ifindex, - addr->smctp_halen, hex); + addr->smctp_base.smctp_network, addr->smctp_base.smctp_type, + addr->smctp_ifindex, addr->smctp_halen, hex); return dfree(buf); } -static const char* peer_tostr(const struct peer *peer) +static const char *peer_tostr(const struct peer *peer) { size_t l = 300; char *str = NULL; @@ -385,13 +384,12 @@ static const char* peer_tostr(const struct peer *peer) if (!str) { return "Out of memory"; } - snprintf(str, l, "peer eid %d net %u phys %s state %d", - peer->eid, peer->net, dest_phys_tostr(&peer->phys), - peer->state); + snprintf(str, l, "peer eid %d net %u phys %s state %d", peer->eid, + peer->net, dest_phys_tostr(&peer->phys), peer->state); return dfree(str); } -static const char* peer_tostr_short(const struct peer *peer) +static const char *peer_tostr_short(const struct peer *peer) { size_t l = 30; char *str = NULL; @@ -412,7 +410,7 @@ static int defer_free_handler(sd_event_source *s, void *userdata) } /* Returns ptr, frees it on the next default event loop cycle (defer)*/ -static void* dfree(void* ptr) +static void *dfree(void *ptr) { sd_event *e = NULL; int rc; @@ -436,13 +434,15 @@ static void* dfree(void* ptr) return ptr; } -static int cb_exit_loop_io(sd_event_source *s, int fd, uint32_t revents, void *userdata) +static int cb_exit_loop_io(sd_event_source *s, int fd, uint32_t revents, + void *userdata) { sd_event_exit(sd_event_source_get_event(s), 0); return 0; } -static int cb_exit_loop_timeout(sd_event_source *s, uint64_t usec, void *userdata) +static int cb_exit_loop_timeout(sd_event_source *s, uint64_t usec, + void *userdata) { sd_event_exit(sd_event_source_get_event(s), -ETIMEDOUT); return 0; @@ -460,8 +460,8 @@ static int wait_fd_timeout(int fd, short events, uint64_t timeout_usec) if (rc < 0) goto out; - rc = sd_event_add_time_relative(ev, NULL, CLOCK_MONOTONIC, - timeout_usec, 0, cb_exit_loop_timeout, NULL); + rc = sd_event_add_time_relative(ev, NULL, CLOCK_MONOTONIC, timeout_usec, + 0, cb_exit_loop_timeout, NULL); if (rc < 0) goto out; @@ -480,7 +480,6 @@ static int wait_fd_timeout(int fd, short events, uint64_t timeout_usec) static const char *path_from_peer(const struct peer *peer) { - if (!peer->published) { bug_warn("%s on peer %s", __func__, peer_tostr(peer)); return NULL; @@ -493,7 +492,8 @@ static int get_role(const char *mode, struct role *role) unsigned int i; for (i = 0; i < ARRAY_SIZE(roles); i++) { - if (roles[i].dbus_val && (strcmp(roles[i].dbus_val, mode) == 0)) { + if (roles[i].dbus_val && + (strcmp(roles[i].dbus_val, mode) == 0)) { memcpy(role, &roles[i], sizeof(struct role)); return 0; } @@ -504,17 +504,18 @@ static int get_role(const char *mode, struct role *role) /* Returns the message from a socket. ret_buf is allocated, should be freed by the caller */ -static int read_message(struct ctx *ctx, int sd, uint8_t **ret_buf, size_t *ret_buf_size, - struct sockaddr_mctp_ext *ret_addr) +static int read_message(struct ctx *ctx, int sd, uint8_t **ret_buf, + size_t *ret_buf_size, + struct sockaddr_mctp_ext *ret_addr) { int rc; socklen_t addrlen; ssize_t len; - uint8_t* buf = NULL; + uint8_t *buf = NULL; size_t buf_size; - len = mctp_ops.mctp.recvfrom(sd, NULL, 0, MSG_PEEK | MSG_TRUNC, - NULL, 0); + len = mctp_ops.mctp.recvfrom(sd, NULL, 0, MSG_PEEK | MSG_TRUNC, NULL, + 0); if (len < 0) { rc = -errno; goto out; @@ -537,8 +538,7 @@ static int read_message(struct ctx *ctx, int sd, uint8_t **ret_buf, size_t *ret_ addrlen = sizeof(struct sockaddr_mctp_ext); memset(ret_addr, 0x0, addrlen); len = mctp_ops.mctp.recvfrom(sd, buf, buf_size, MSG_TRUNC, - (struct sockaddr *)ret_addr, - &addrlen); + (struct sockaddr *)ret_addr, &addrlen); if (len < 0) { rc = -errno; goto out; @@ -556,8 +556,7 @@ static int read_message(struct ctx *ctx, int sd, uint8_t **ret_buf, size_t *ret_ if (ctx->verbose) { warnx("read_message got from %s len %zu", - ext_addr_tostr(ret_addr), - buf_size); + ext_addr_tostr(ret_addr), buf_size); } *ret_buf = buf; @@ -574,8 +573,9 @@ static int read_message(struct ctx *ctx, int sd, uint8_t **ret_buf, size_t *ret_ } /* Replies to a physical address */ -static int reply_message_phys(struct ctx *ctx, int sd, const void *resp, size_t resp_len, - const struct sockaddr_mctp_ext *addr) +static int reply_message_phys(struct ctx *ctx, int sd, const void *resp, + size_t resp_len, + const struct sockaddr_mctp_ext *addr) { ssize_t len; struct sockaddr_mctp_ext reply_addr = *addr; @@ -597,8 +597,8 @@ static int reply_message_phys(struct ctx *ctx, int sd, const void *resp, size_t } /* Replies to a real EID, not physical addressing */ -static int reply_message(struct ctx *ctx, int sd, const void *resp, size_t resp_len, - const struct sockaddr_mctp_ext *addr) +static int reply_message(struct ctx *ctx, int sd, const void *resp, + size_t resp_len, const struct sockaddr_mctp_ext *addr) { ssize_t len; struct sockaddr_mctp reply_addr; @@ -607,9 +607,9 @@ static int reply_message(struct ctx *ctx, int sd, const void *resp, size_t resp_ reply_addr.smctp_tag &= ~MCTP_TAG_OWNER; if (reply_addr.smctp_addr.s_addr == 0 || - reply_addr.smctp_addr.s_addr == 0xff) { + reply_addr.smctp_addr.s_addr == 0xff) { bug_warn("reply_message can't take EID %d", - reply_addr.smctp_addr.s_addr); + reply_addr.smctp_addr.s_addr); return -EPROTO; } @@ -628,19 +628,20 @@ static int reply_message(struct ctx *ctx, int sd, const void *resp, size_t resp_ } // Handles new Incoming Set Endpoint ID request -static int handle_control_set_endpoint_id(struct ctx *ctx, - int sd, struct sockaddr_mctp_ext *addr, - const uint8_t *buf, const size_t buf_size) +static int handle_control_set_endpoint_id(struct ctx *ctx, int sd, + struct sockaddr_mctp_ext *addr, + const uint8_t *buf, + const size_t buf_size) { struct mctp_ctrl_cmd_set_eid *req = NULL; - struct mctp_ctrl_resp_set_eid respi = {0}, *resp = &respi; + struct mctp_ctrl_resp_set_eid respi = { 0 }, *resp = &respi; size_t resp_len; if (buf_size < sizeof(*req)) { warnx("short Set Endpoint ID message"); return -ENOMSG; } - req = (void*)buf; + req = (void *)buf; resp->ctrl_hdr.command_code = req->ctrl_hdr.command_code; resp->ctrl_hdr.rq_dgram_inst = RQDI_RESP; @@ -655,15 +656,16 @@ static int handle_control_set_endpoint_id(struct ctx *ctx, return reply_message(ctx, sd, resp, resp_len, addr); } -static int handle_control_get_version_support(struct ctx *ctx, - int sd, const struct sockaddr_mctp_ext *addr, - const uint8_t *buf, const size_t buf_size) +static int +handle_control_get_version_support(struct ctx *ctx, int sd, + const struct sockaddr_mctp_ext *addr, + const uint8_t *buf, const size_t buf_size) { struct mctp_ctrl_cmd_get_mctp_ver_support *req = NULL; struct mctp_ctrl_resp_get_mctp_ver_support *resp = NULL; uint32_t *versions = NULL; // space for 4 versions - uint8_t respbuf[sizeof(*resp) + 4*sizeof(*versions)]; + uint8_t respbuf[sizeof(*resp) + 4 * sizeof(*versions)]; size_t resp_len; if (buf_size < sizeof(struct mctp_ctrl_cmd_get_mctp_ver_support)) { @@ -671,25 +673,25 @@ static int handle_control_get_version_support(struct ctx *ctx, return -ENOMSG; } - req = (void*)buf; - resp = (void*)respbuf; - versions = (void*)(resp+1); + req = (void *)buf; + resp = (void *)respbuf; + versions = (void *)(resp + 1); switch (req->msg_type_number) { - case 0xff: // Base Protocol - case 0x00: // Control protocol - // from DSP0236 1.3.1 section 12.6.2. Big endian. - versions[0] = htonl(0xF1F0FF00); - versions[1] = htonl(0xF1F1FF00); - versions[2] = htonl(0xF1F2FF00); - versions[3] = htonl(0xF1F3F100); - resp->number_of_entries = 4; - resp->completion_code = 0x00; - resp_len = sizeof(*resp) + 4*sizeof(*versions); - break; - default: - // Unsupported message type - resp->completion_code = 0x80; - resp_len = sizeof(*resp); + case 0xff: // Base Protocol + case 0x00: // Control protocol + // from DSP0236 1.3.1 section 12.6.2. Big endian. + versions[0] = htonl(0xF1F0FF00); + versions[1] = htonl(0xF1F1FF00); + versions[2] = htonl(0xF1F2FF00); + versions[3] = htonl(0xF1F3F100); + resp->number_of_entries = 4; + resp->completion_code = 0x00; + resp_len = sizeof(*resp) + 4 * sizeof(*versions); + break; + default: + // Unsupported message type + resp->completion_code = 0x80; + resp_len = sizeof(*resp); } resp->ctrl_hdr.command_code = req->ctrl_hdr.command_code; @@ -697,19 +699,20 @@ static int handle_control_get_version_support(struct ctx *ctx, return reply_message(ctx, sd, resp, resp_len, addr); } -static int handle_control_get_endpoint_id(struct ctx *ctx, - int sd, const struct sockaddr_mctp_ext *addr, - const uint8_t *buf, const size_t buf_size) +static int handle_control_get_endpoint_id(struct ctx *ctx, int sd, + const struct sockaddr_mctp_ext *addr, + const uint8_t *buf, + const size_t buf_size) { struct mctp_ctrl_cmd_get_eid *req = NULL; - struct mctp_ctrl_resp_get_eid respi = {0}, *resp = &respi; + struct mctp_ctrl_resp_get_eid respi = { 0 }, *resp = &respi; if (buf_size < sizeof(*req)) { warnx("short Get Endpoint ID message"); return -ENOMSG; } - req = (void*)buf; + req = (void *)buf; resp->ctrl_hdr.command_code = req->ctrl_hdr.command_code; resp->ctrl_hdr.rq_dgram_inst = RQDI_RESP; @@ -724,31 +727,33 @@ static int handle_control_get_endpoint_id(struct ctx *ctx, return reply_message_phys(ctx, sd, resp, sizeof(*resp), addr); } -static int handle_control_get_endpoint_uuid(struct ctx *ctx, - int sd, const struct sockaddr_mctp_ext *addr, - const uint8_t *buf, const size_t buf_size) +static int +handle_control_get_endpoint_uuid(struct ctx *ctx, int sd, + const struct sockaddr_mctp_ext *addr, + const uint8_t *buf, const size_t buf_size) { - struct mctp_ctrl_cmd_get_uuid *req = NULL;; - struct mctp_ctrl_resp_get_uuid respi = {0}, *resp = &respi; + struct mctp_ctrl_cmd_get_uuid *req = NULL; + ; + struct mctp_ctrl_resp_get_uuid respi = { 0 }, *resp = &respi; if (buf_size < sizeof(*req)) { warnx("short Get Endpoint UUID message"); return -ENOMSG; } - req = (void*)buf; + req = (void *)buf; resp->ctrl_hdr.command_code = req->ctrl_hdr.command_code; resp->ctrl_hdr.rq_dgram_inst = RQDI_RESP; memcpy(resp->uuid, ctx->uuid, sizeof(resp->uuid)); return reply_message(ctx, sd, resp, sizeof(*resp), addr); } - -static int handle_control_get_message_type_support(struct ctx *ctx, - int sd, const struct sockaddr_mctp_ext *addr, +static int handle_control_get_message_type_support( + struct ctx *ctx, int sd, const struct sockaddr_mctp_ext *addr, const uint8_t *buf, const size_t buf_size) { - struct mctp_ctrl_cmd_get_msg_type_support *req = NULL;; + struct mctp_ctrl_cmd_get_msg_type_support *req = NULL; + ; struct mctp_ctrl_resp_get_msg_type_support *resp = NULL; uint8_t resp_buf[sizeof(*resp) + 1]; size_t resp_len; @@ -758,22 +763,23 @@ static int handle_control_get_message_type_support(struct ctx *ctx, return -ENOMSG; } - req = (void*)buf; - resp = (void*)resp_buf; + req = (void *)buf; + resp = (void *)resp_buf; resp->ctrl_hdr.command_code = req->ctrl_hdr.command_code; resp->ctrl_hdr.rq_dgram_inst = RQDI_RESP; // Only control messages supported resp->msg_type_count = 1; - *((uint8_t*)(resp+1)) = MCTP_CTRL_HDR_MSG_TYPE; + *((uint8_t *)(resp + 1)) = MCTP_CTRL_HDR_MSG_TYPE; resp_len = sizeof(*resp) + resp->msg_type_count; return reply_message(ctx, sd, resp, resp_len, addr); } -static int handle_control_resolve_endpoint_id(struct ctx *ctx, - int sd, const struct sockaddr_mctp_ext *addr, - const uint8_t *buf, const size_t buf_size) +static int +handle_control_resolve_endpoint_id(struct ctx *ctx, int sd, + const struct sockaddr_mctp_ext *addr, + const uint8_t *buf, const size_t buf_size) { struct mctp_ctrl_cmd_resolve_endpoint_id *req = NULL; struct mctp_ctrl_resp_resolve_endpoint_id *resp = NULL; @@ -786,45 +792,44 @@ static int handle_control_resolve_endpoint_id(struct ctx *ctx, return -ENOMSG; } - req = (void*)buf; - resp = (void*)resp_buf; + req = (void *)buf; + resp = (void *)resp_buf; memset(resp, 0x0, sizeof(*resp)); resp->ctrl_hdr.command_code = req->ctrl_hdr.command_code; resp->ctrl_hdr.rq_dgram_inst = RQDI_RESP; - peer = find_peer_by_addr(ctx, req->eid, - addr->smctp_base.smctp_network); + peer = find_peer_by_addr(ctx, req->eid, addr->smctp_base.smctp_network); if (!peer) { resp->completion_code = 1; resp_len = sizeof(*resp); } else { // TODO: bridging resp->eid = req->eid; - memcpy((void*)(resp+1), - peer->phys.hwaddr, peer->phys.hwaddr_len); + memcpy((void *)(resp + 1), peer->phys.hwaddr, + peer->phys.hwaddr_len); resp_len = sizeof(*resp) + peer->phys.hwaddr_len; } return reply_message(ctx, sd, resp, resp_len, addr); } -static int handle_control_unsupported(struct ctx *ctx, - int sd, const struct sockaddr_mctp_ext *addr, - const uint8_t *buf, const size_t buf_size) +static int handle_control_unsupported(struct ctx *ctx, int sd, + const struct sockaddr_mctp_ext *addr, + const uint8_t *buf, const size_t buf_size) { struct mctp_ctrl_msg_hdr *req = NULL; struct mctp_ctrl_generic { struct mctp_ctrl_msg_hdr ctrl_hdr; uint8_t completion_code; } __attribute__((__packed__)); - struct mctp_ctrl_generic respi = {0}, *resp = &respi; + struct mctp_ctrl_generic respi = { 0 }, *resp = &respi; if (buf_size < sizeof(*req)) { warnx("short unsupported control message"); return -ENOMSG; } - req = (void*)buf; + req = (void *)buf; resp->ctrl_hdr.command_code = req->command_code; resp->ctrl_hdr.rq_dgram_inst = RQDI_RESP; resp->completion_code = MCTP_CTRL_CC_ERROR_UNSUPPORTED_CMD; @@ -832,9 +837,9 @@ static int handle_control_unsupported(struct ctx *ctx, } static int cb_listen_control_msg(sd_event_source *s, int sd, uint32_t revents, - void *userdata) + void *userdata) { - struct sockaddr_mctp_ext addr = {0}; + struct sockaddr_mctp_ext addr = { 0 }; struct ctx *ctx = userdata; uint8_t *buf = NULL; size_t buf_size; @@ -855,56 +860,55 @@ static int cb_listen_control_msg(sd_event_source *s, int sd, uint32_t revents, } if (buf_size < sizeof(struct mctp_ctrl_msg_hdr)) { - warnx("Short message %zu bytes from %s", - buf_size, ext_addr_tostr(&addr)); + warnx("Short message %zu bytes from %s", buf_size, + ext_addr_tostr(&addr)); rc = -EINVAL; goto out; } - ctrl_msg = (void*)buf; + ctrl_msg = (void *)buf; if (ctx->verbose) { warnx("Got control request command code %hhd", - ctrl_msg->command_code); + ctrl_msg->command_code); } switch (ctrl_msg->command_code) { - case MCTP_CTRL_CMD_GET_VERSION_SUPPORT: - rc = handle_control_get_version_support(ctx, - sd, &addr, buf, buf_size); - break; - case MCTP_CTRL_CMD_SET_ENDPOINT_ID: - rc = handle_control_set_endpoint_id(ctx, - sd, &addr, buf, buf_size); - break; - case MCTP_CTRL_CMD_GET_ENDPOINT_ID: - rc = handle_control_get_endpoint_id(ctx, - sd, &addr, buf, buf_size); - break; - case MCTP_CTRL_CMD_GET_ENDPOINT_UUID: - rc = handle_control_get_endpoint_uuid(ctx, - sd, &addr, buf, buf_size); - break; - case MCTP_CTRL_CMD_GET_MESSAGE_TYPE_SUPPORT: - rc = handle_control_get_message_type_support(ctx, - sd, &addr, buf, buf_size); - break; - case MCTP_CTRL_CMD_RESOLVE_ENDPOINT_ID: - rc = handle_control_resolve_endpoint_id(ctx, - sd, &addr, buf, buf_size); - break; - default: - if (ctx->verbose) { - warnx("Ignoring unsupported command code 0x%02x", - ctrl_msg->command_code); - rc = -ENOTSUP; - } - rc = handle_control_unsupported(ctx, - sd, &addr, buf, buf_size); + case MCTP_CTRL_CMD_GET_VERSION_SUPPORT: + rc = handle_control_get_version_support(ctx, sd, &addr, buf, + buf_size); + break; + case MCTP_CTRL_CMD_SET_ENDPOINT_ID: + rc = handle_control_set_endpoint_id(ctx, sd, &addr, buf, + buf_size); + break; + case MCTP_CTRL_CMD_GET_ENDPOINT_ID: + rc = handle_control_get_endpoint_id(ctx, sd, &addr, buf, + buf_size); + break; + case MCTP_CTRL_CMD_GET_ENDPOINT_UUID: + rc = handle_control_get_endpoint_uuid(ctx, sd, &addr, buf, + buf_size); + break; + case MCTP_CTRL_CMD_GET_MESSAGE_TYPE_SUPPORT: + rc = handle_control_get_message_type_support(ctx, sd, &addr, + buf, buf_size); + break; + case MCTP_CTRL_CMD_RESOLVE_ENDPOINT_ID: + rc = handle_control_resolve_endpoint_id(ctx, sd, &addr, buf, + buf_size); + break; + default: + if (ctx->verbose) { + warnx("Ignoring unsupported command code 0x%02x", + ctrl_msg->command_code); + rc = -ENOTSUP; + } + rc = handle_control_unsupported(ctx, sd, &addr, buf, buf_size); } if (ctx->verbose && rc < 0) { warnx("Error handling command code %02x from %s: %s", - ctrl_msg->command_code, ext_addr_tostr(&addr), - strerror(-rc)); + ctrl_msg->command_code, ext_addr_tostr(&addr), + strerror(-rc)); } out: @@ -938,8 +942,8 @@ static int listen_control_msg(struct ctx *ctx, uint32_t net) } val = 1; - rc = mctp_ops.mctp.setsockopt(sd, SOL_MCTP, MCTP_OPT_ADDR_EXT, - &val, sizeof(val)); + rc = mctp_ops.mctp.setsockopt(sd, SOL_MCTP, MCTP_OPT_ADDR_EXT, &val, + sizeof(val)); if (rc < 0) { rc = -errno; warn("Kernel does not support MCTP extended addressing"); @@ -947,7 +951,7 @@ static int listen_control_msg(struct ctx *ctx, uint32_t net) } rc = sd_event_add_io(ctx->event, NULL, sd, EPOLLIN, - cb_listen_control_msg, ctx); + cb_listen_control_msg, ctx); return rc; out: if (rc < 0) { @@ -957,7 +961,7 @@ static int listen_control_msg(struct ctx *ctx, uint32_t net) } static int cb_listen_monitor(sd_event_source *s, int sd, uint32_t revents, - void *userdata) + void *userdata) { struct ctx *ctx = userdata; mctp_nl_change *changes = NULL; @@ -968,22 +972,19 @@ static int cb_listen_monitor(sd_event_source *s, int sd, uint32_t revents, rc = mctp_nl_handle_monitor(ctx->nl, &changes, &num_changes); if (rc < 0) { warnx("Error handling update from netlink, link state may now be outdated. %s", - strerror(-rc)); + strerror(-rc)); return rc; } for (size_t i = 0; i < num_changes; i++) { struct mctp_nl_change *c = &changes[i]; switch (c->op) { - case MCTP_NL_ADD_LINK: - { + case MCTP_NL_ADD_LINK: { rc = add_interface_local(ctx, c->ifindex); any_error |= (rc < 0); - } - break; + } break; - case MCTP_NL_DEL_LINK: - { + case MCTP_NL_DEL_LINK: { // Local addresses have already been deleted with DEL_EID if (c->link_userdata) { rc = del_interface(c->link_userdata); @@ -991,14 +992,13 @@ static int cb_listen_monitor(sd_event_source *s, int sd, uint32_t revents, // Would have expected to have seen it in previous // MCTP_NL_ADD_LINK or setup_nets(). rc = -ENOENT; - bug_warn("delete unconfigured interface %d", c->ifindex); + bug_warn("delete unconfigured interface %d", + c->ifindex); } any_error |= (rc < 0); - } - break; + } break; - case MCTP_NL_CHANGE_NET: - { + case MCTP_NL_CHANGE_NET: { // Local addresses have already been deleted with DEL_EID rc = add_interface_local(ctx, c->ifindex); any_error |= (rc < 0); @@ -1007,30 +1007,22 @@ static int cb_listen_monitor(sd_event_source *s, int sd, uint32_t revents, rc = change_net_interface(ctx, c->ifindex, c->old_net); any_error |= (rc < 0); - } - break; + } break; - case MCTP_NL_ADD_EID: - { - uint32_t net = mctp_nl_net_byindex(ctx->nl, - c->ifindex); + case MCTP_NL_ADD_EID: { + uint32_t net = mctp_nl_net_byindex(ctx->nl, c->ifindex); rc = add_local_eid(ctx, net, c->eid); any_error |= (rc < 0); - } - break; + } break; - case MCTP_NL_DEL_EID: - { + case MCTP_NL_DEL_EID: { rc = del_local_eid(ctx, c->old_net, c->eid); any_error |= (rc < 0); - } - break; + } break; - case MCTP_NL_CHANGE_UP: - { + case MCTP_NL_CHANGE_UP: { // 'up' state is currently unused - } - break; + } break; } } @@ -1053,8 +1045,8 @@ static int listen_monitor(struct ctx *ctx) return sd; } - rc = sd_event_add_io(ctx->event, NULL, sd, EPOLLIN, - cb_listen_monitor, ctx); + rc = sd_event_add_io(ctx->event, NULL, sd, EPOLLIN, cb_listen_monitor, + ctx); return rc; } @@ -1122,8 +1114,8 @@ static const char *peer_cmd_prefix(const char *peer, uint8_t cmd) { static char pfx_str[64]; - snprintf(pfx_str, sizeof(pfx_str), "[peer %s, cmd %s]", - peer, command_str(cmd)); + snprintf(pfx_str, sizeof(pfx_str), "[peer %s, cmd %s]", peer, + command_str(cmd)); return pfx_str; } @@ -1131,9 +1123,9 @@ static const char *peer_cmd_prefix(const char *peer, uint8_t cmd) /* Common checks for responses: that we have enough data for a response, * the expected IID and opcode, and that the response indicated success. */ -static int mctp_ctrl_validate_response(uint8_t *buf, size_t rsp_size, size_t - exp_size, const char *peer, uint8_t iid, - uint8_t cmd) +static int mctp_ctrl_validate_response(uint8_t *buf, size_t rsp_size, + size_t exp_size, const char *peer, + uint8_t iid, uint8_t cmd) { struct mctp_ctrl_resp *rsp; @@ -1178,16 +1170,17 @@ static int mctp_ctrl_validate_response(uint8_t *buf, size_t rsp_size, size_t * resp buffer is allocated, caller to free. * Extended addressing is used optionally, depending on ext_addr arg. */ static int endpoint_query_addr(struct ctx *ctx, - const struct sockaddr_mctp_ext *req_addr, bool ext_addr, - const void* req, size_t req_len, - uint8_t **resp, size_t *resp_len, struct sockaddr_mctp_ext *resp_addr) + const struct sockaddr_mctp_ext *req_addr, + bool ext_addr, const void *req, size_t req_len, + uint8_t **resp, size_t *resp_len, + struct sockaddr_mctp_ext *resp_addr) { size_t req_addr_len; int sd = -1, val; ssize_t rc; size_t buf_size; - uint8_t* buf = NULL; + uint8_t *buf = NULL; *resp = NULL; *resp_len = 0; @@ -1201,8 +1194,8 @@ static int endpoint_query_addr(struct ctx *ctx, // We want extended addressing on all received messages val = 1; - rc = mctp_ops.mctp.setsockopt(sd, SOL_MCTP, MCTP_OPT_ADDR_EXT, - &val, sizeof(val)); + rc = mctp_ops.mctp.setsockopt(sd, SOL_MCTP, MCTP_OPT_ADDR_EXT, &val, + sizeof(val)); if (rc < 0) { rc = -errno; warn("Kernel does not support MCTP extended addressing"); @@ -1226,8 +1219,7 @@ static int endpoint_query_addr(struct ctx *ctx, rc = -errno; if (ctx->verbose) { warnx("%s: sendto(%s) %zu bytes failed. %s", __func__, - ext_addr_tostr(req_addr), req_len, - strerror(-rc)); + ext_addr_tostr(req_addr), req_len, strerror(-rc)); } goto out; } @@ -1241,7 +1233,7 @@ static int endpoint_query_addr(struct ctx *ctx, if (rc < 0) { if (rc == -ETIMEDOUT && ctx->verbose) { warnx("%s: receive timed out from %s", __func__, - ext_addr_tostr(req_addr)); + ext_addr_tostr(req_addr)); } goto out; } @@ -1251,11 +1243,12 @@ static int endpoint_query_addr(struct ctx *ctx, goto out; } - if (resp_addr->smctp_base.smctp_type != req_addr->smctp_base.smctp_type) { + if (resp_addr->smctp_base.smctp_type != + req_addr->smctp_base.smctp_type) { warnx("Mismatching response type %d for request type %d. dest %s", - resp_addr->smctp_base.smctp_type, - req_addr->smctp_base.smctp_type, - ext_addr_tostr(req_addr)); + resp_addr->smctp_base.smctp_type, + req_addr->smctp_base.smctp_type, + ext_addr_tostr(req_addr)); rc = -ENOMSG; } @@ -1274,11 +1267,12 @@ static int endpoint_query_addr(struct ctx *ctx, /* Queries an endpoint peer. Addressing is standard eid/net. */ -static int endpoint_query_peer(const struct peer *peer, - uint8_t req_type, const void* req, size_t req_len, - uint8_t **resp, size_t *resp_len, struct sockaddr_mctp_ext *resp_addr) +static int endpoint_query_peer(const struct peer *peer, uint8_t req_type, + const void *req, size_t req_len, uint8_t **resp, + size_t *resp_len, + struct sockaddr_mctp_ext *resp_addr) { - struct sockaddr_mctp_ext addr = {0}; + struct sockaddr_mctp_ext addr = { 0 }; if (peer->state != REMOTE) { bug_warn("%s bad peer %s", __func__, peer_tostr(peer)); @@ -1292,17 +1286,18 @@ static int endpoint_query_peer(const struct peer *peer, addr.smctp_base.smctp_type = req_type; addr.smctp_base.smctp_tag = MCTP_TAG_OWNER; - return endpoint_query_addr(peer->ctx, &addr, false, req, req_len, - resp, resp_len, resp_addr); + return endpoint_query_addr(peer->ctx, &addr, false, req, req_len, resp, + resp_len, resp_addr); } /* Queries an endpoint using physical addressing, null EID. */ static int endpoint_query_phys(struct ctx *ctx, const dest_phys *dest, - uint8_t req_type, const void* req, size_t req_len, - uint8_t **resp, size_t *resp_len, struct sockaddr_mctp_ext *resp_addr) + uint8_t req_type, const void *req, + size_t req_len, uint8_t **resp, size_t *resp_len, + struct sockaddr_mctp_ext *resp_addr) { - struct sockaddr_mctp_ext addr = {0}; + struct sockaddr_mctp_ext addr = { 0 }; addr.smctp_base.smctp_family = AF_MCTP; addr.smctp_base.smctp_network = 0; @@ -1321,8 +1316,8 @@ static int endpoint_query_phys(struct ctx *ctx, const dest_phys *dest, addr.smctp_base.smctp_type = req_type; addr.smctp_base.smctp_tag = MCTP_TAG_OWNER; - return endpoint_query_addr(ctx, &addr, true, req, req_len, - resp, resp_len, resp_addr); + return endpoint_query_addr(ctx, &addr, true, req, req_len, resp, + resp_len, resp_addr); } /* returns -ECONNREFUSED if the endpoint returns failure. */ @@ -1330,10 +1325,10 @@ static int endpoint_send_set_endpoint_id(const struct peer *peer, mctp_eid_t *new_eidp) { struct sockaddr_mctp_ext addr; - struct mctp_ctrl_cmd_set_eid req = {0}; + struct mctp_ctrl_cmd_set_eid req = { 0 }; struct mctp_ctrl_resp_set_eid *resp = NULL; int rc; - uint8_t* buf = NULL; + uint8_t *buf = NULL; size_t buf_size; uint8_t iid, stat, alloc; const dest_phys *dest = &peer->phys; @@ -1344,20 +1339,21 @@ static int endpoint_send_set_endpoint_id(const struct peer *peer, iid = mctp_next_iid(peer->ctx); req.ctrl_hdr.rq_dgram_inst = RQDI_REQ | iid; req.ctrl_hdr.command_code = MCTP_CTRL_CMD_SET_ENDPOINT_ID; - req.operation = mctp_ctrl_cmd_set_eid_set_eid; // TODO: do we want Force? + req.operation = + mctp_ctrl_cmd_set_eid_set_eid; // TODO: do we want Force? req.eid = peer->eid; rc = endpoint_query_phys(peer->ctx, dest, MCTP_CTRL_HDR_MSG_TYPE, &req, - sizeof(req), &buf, &buf_size, &addr); + sizeof(req), &buf, &buf_size, &addr); if (rc < 0) goto out; rc = mctp_ctrl_validate_response(buf, buf_size, sizeof(*resp), - dest_phys_tostr(dest), - iid, MCTP_CTRL_CMD_SET_ENDPOINT_ID); + dest_phys_tostr(dest), iid, + MCTP_CTRL_CMD_SET_ENDPOINT_ID); if (rc) goto out; - resp = (void*)buf; + resp = (void *)buf; stat = resp->status >> 4 & 0x3; new_eid = resp->eid_set; @@ -1369,23 +1365,23 @@ static int endpoint_send_set_endpoint_id(const struct peer *peer, if (stat == 0x01) { if (!mctp_eid_is_valid_unicast(new_eid)) { warnx("%s rejected assignment eid %d, and reported invalid eid %d", - dest_phys_tostr(dest), peer->eid, new_eid); + dest_phys_tostr(dest), peer->eid, new_eid); rc = -ECONNREFUSED; goto out; } } else if (stat == 0x00) { if (!mctp_eid_is_valid_unicast(new_eid)) { warnx("%s eid %d replied with invalid eid %d, but 'accepted'", - dest_phys_tostr(dest), peer->eid, new_eid); + dest_phys_tostr(dest), peer->eid, new_eid); rc = -ECONNREFUSED; goto out; } else if (new_eid != peer->eid) { warnx("%s eid %d replied with different eid %d, but 'accepted'", - dest_phys_tostr(dest), peer->eid, new_eid); + dest_phys_tostr(dest), peer->eid, new_eid); } } else { - warnx("%s unexpected status 0x%02x", - dest_phys_tostr(dest), resp->status); + warnx("%s unexpected status 0x%02x", dest_phys_tostr(dest), + resp->status); } *new_eidp = new_eid; @@ -1393,7 +1389,7 @@ static int endpoint_send_set_endpoint_id(const struct peer *peer, if (alloc != 0) { // TODO for bridges warnx("%s requested allocation pool, unimplemented", - dest_phys_tostr(dest)); + dest_phys_tostr(dest)); } rc = 0; @@ -1402,11 +1398,10 @@ static int endpoint_send_set_endpoint_id(const struct peer *peer, return rc; } - /* Returns the newly added peer. * Error is -EEXISTS if it exists */ static int add_peer(struct ctx *ctx, const dest_phys *dest, mctp_eid_t eid, - uint32_t net, struct peer **ret_peer) + uint32_t net, struct peer **ret_peer) { struct peer *peer, **tmp; struct net *n; @@ -1459,8 +1454,8 @@ static int add_peer(struct ctx *ctx, const dest_phys *dest, mctp_eid_t eid, static int check_peer_struct(const struct peer *peer, const struct net *n) { if (n->net != peer->net) { - bug_warn("Mismatching net %d vs peer net %u", - n->net, peer->net); + bug_warn("Mismatching net %d vs peer net %u", n->net, + peer->net); return -1; } @@ -1496,10 +1491,12 @@ static int remove_peer(struct peer *peer) if (peer->degraded) { int rc; - rc = sd_event_source_set_enabled(peer->recovery.source, SD_EVENT_OFF); + rc = sd_event_source_set_enabled(peer->recovery.source, + SD_EVENT_OFF); if (rc < 0) { /* XXX: Fix caller assumptions? */ - warnx("Failed to stop recovery timer while removing peer: %d", rc); + warnx("Failed to stop recovery timer while removing peer: %d", + rc); } sd_event_source_unref(peer->recovery.source); } @@ -1514,8 +1511,8 @@ static int remove_peer(struct peer *peer) } if (idx == ctx->num_peers) { - bug_warn("peer net %u, eid %d not found on remove!", - peer->net, peer->eid); + bug_warn("peer net %u, eid %d not found on remove!", peer->net, + peer->eid); return -EPROTO; } @@ -1525,7 +1522,8 @@ static int remove_peer(struct peer *peer) (ctx->num_peers - idx) * sizeof(struct peer *)); if (ctx->num_peers > 0) { - tmp = realloc(ctx->peers, ctx->num_peers * sizeof(struct peer *)); + tmp = realloc(ctx->peers, + ctx->num_peers * sizeof(struct peer *)); if (!tmp) { warn("%s: peer realloc(reduce!) failed", __func__); // we'll re-try on next add/remove @@ -1598,8 +1596,8 @@ static int peer_set_mtu(struct ctx *ctx, struct peer *peer, uint32_t mtu) int rc; if (!mctp_nl_if_exists(peer->ctx->nl, peer->phys.ifindex)) { - bug_warn("%s: no interface for ifindex %d", - __func__, peer->phys.ifindex); + bug_warn("%s: no interface for ifindex %d", __func__, + peer->phys.ifindex); return -EPROTO; } @@ -1618,8 +1616,9 @@ static int peer_set_mtu(struct ctx *ctx, struct peer *peer, uint32_t mtu) return rc; } -static int endpoint_assign_eid(struct ctx *ctx, sd_bus_error *berr, const dest_phys *dest, - struct peer **ret_peer, mctp_eid_t static_eid) +static int endpoint_assign_eid(struct ctx *ctx, sd_bus_error *berr, + const dest_phys *dest, struct peer **ret_peer, + mctp_eid_t static_eid) { mctp_eid_t e, new_eid; struct net *n = NULL; @@ -1656,16 +1655,18 @@ static int endpoint_assign_eid(struct ctx *ctx, sd_bus_error *berr, const dest_p break; } if (e > eid_alloc_max) { - warnx("Ran out of EIDs for net %d, allocating %s", net, dest_phys_tostr(dest)); + warnx("Ran out of EIDs for net %d, allocating %s", net, + dest_phys_tostr(dest)); sd_bus_error_setf(berr, SD_BUS_ERROR_FAILED, - "Ran out of EIDs"); + "Ran out of EIDs"); return -EADDRNOTAVAIL; } } rc = endpoint_send_set_endpoint_id(peer, &new_eid); if (rc == -ECONNREFUSED) - sd_bus_error_setf(berr, SD_BUS_ERROR_FAILED, + sd_bus_error_setf( + berr, SD_BUS_ERROR_FAILED, "Endpoint returned failure to Set Endpoint ID"); if (rc < 0) { remove_peer(peer); @@ -1675,7 +1676,8 @@ static int endpoint_assign_eid(struct ctx *ctx, sd_bus_error *berr, const dest_p if (new_eid != peer->eid) { rc = change_peer_eid(peer, new_eid); if (rc == -EEXIST) { - sd_bus_error_setf(berr, SD_BUS_ERROR_FAILED, + sd_bus_error_setf( + berr, SD_BUS_ERROR_FAILED, "Endpoint requested EID %d instead of assigned %d, already used", new_eid, peer->eid); } @@ -1696,59 +1698,62 @@ static int endpoint_assign_eid(struct ctx *ctx, sd_bus_error *berr, const dest_p /* Populates a sd_bus_error based on mctpd's convention for error codes. * Does nothing if berr is already set. */ -static void set_berr(struct ctx *ctx, int errcode, sd_bus_error *berr) { +static void set_berr(struct ctx *ctx, int errcode, sd_bus_error *berr) +{ bool existing = false; if (sd_bus_error_is_set(berr)) { existing = true; - } else switch (errcode) { + } else + switch (errcode) { case -ETIMEDOUT: sd_bus_error_setf(berr, SD_BUS_ERROR_FAILED, - "MCTP Endpoint did not respond"); + "MCTP Endpoint did not respond"); break; case -ECONNREFUSED: // MCTP_CTRL_CC_ERROR or others sd_bus_error_setf(berr, SD_BUS_ERROR_FAILED, - "MCTP Endpoint replied with failure"); + "MCTP Endpoint replied with failure"); break; case -EBUSY: // MCTP_CTRL_CC_ERROR_NOT_READY sd_bus_error_setf(berr, SD_BUS_ERROR_FAILED, - "MCTP Endpoint busy"); + "MCTP Endpoint busy"); break; case -ENOTSUP: // MCTP_CTRL_CC_ERROR_UNSUPPORTED_CMD sd_bus_error_setf(berr, SD_BUS_ERROR_FAILED, - "Endpoint replied 'unsupported'"); + "Endpoint replied 'unsupported'"); break; case -EPROTO: // BUG sd_bus_error_setf(berr, SD_BUS_ERROR_FAILED, - "Internal error"); + "Internal error"); break; default: if (errcode < 0) sd_bus_error_setf(berr, SD_BUS_ERROR_FAILED, - "Request failed"); + "Request failed"); break; - } + } if (ctx->verbose && sd_bus_error_is_set(berr)) { if (existing) { warnx("Returning existing dbus error '%s'. ignored errcode=%d (%s)", - berr->message, errcode, strerror(-errcode)); + berr->message, errcode, strerror(-errcode)); } else { warnx("Returning dbus error '%s', errcode=%d (%s)", - berr->message, errcode, strerror(-errcode)); + berr->message, errcode, strerror(-errcode)); } } } static int query_get_endpoint_id(struct ctx *ctx, const dest_phys *dest, - mctp_eid_t *ret_eid, uint8_t *ret_ep_type, uint8_t *ret_media_spec) + mctp_eid_t *ret_eid, uint8_t *ret_ep_type, + uint8_t *ret_media_spec) { struct sockaddr_mctp_ext addr; - struct mctp_ctrl_cmd_get_eid req = {0}; + struct mctp_ctrl_cmd_get_eid req = { 0 }; struct mctp_ctrl_resp_get_eid *resp = NULL; uint8_t *buf = NULL; size_t buf_size; @@ -1760,13 +1765,13 @@ static int query_get_endpoint_id(struct ctx *ctx, const dest_phys *dest, req.ctrl_hdr.rq_dgram_inst = RQDI_REQ | iid; req.ctrl_hdr.command_code = MCTP_CTRL_CMD_GET_ENDPOINT_ID; rc = endpoint_query_phys(ctx, dest, MCTP_CTRL_HDR_MSG_TYPE, &req, - sizeof(req), &buf, &buf_size, &addr); + sizeof(req), &buf, &buf_size, &addr); if (rc < 0) goto out; rc = mctp_ctrl_validate_response(buf, buf_size, sizeof(*resp), - dest_phys_tostr(dest), - iid, MCTP_CTRL_CMD_GET_ENDPOINT_ID); + dest_phys_tostr(dest), iid, + MCTP_CTRL_CMD_GET_ENDPOINT_ID); if (rc) goto out; @@ -1785,7 +1790,8 @@ static int query_get_endpoint_id(struct ctx *ctx, const dest_phys *dest, * Returns negative error code on failure. */ static int get_endpoint_peer(struct ctx *ctx, sd_bus_error *berr, - const dest_phys *dest, struct peer **ret_peer, mctp_eid_t *ret_cur_eid) + const dest_phys *dest, struct peer **ret_peer, + mctp_eid_t *ret_cur_eid) { mctp_eid_t eid; uint8_t ep_type, medium_spec; @@ -1845,11 +1851,12 @@ static int get_endpoint_peer(struct ctx *ctx, sd_bus_error *berr, return 0; } -static int query_get_peer_msgtypes(struct peer *peer) { +static int query_get_peer_msgtypes(struct peer *peer) +{ struct sockaddr_mctp_ext addr; struct mctp_ctrl_cmd_get_msg_type_support req; struct mctp_ctrl_resp_get_msg_type_support *resp = NULL; - uint8_t* buf = NULL; + uint8_t *buf = NULL; size_t buf_size, expect_size; uint8_t iid; int rc; @@ -1862,23 +1869,23 @@ static int query_get_peer_msgtypes(struct peer *peer) { req.ctrl_hdr.rq_dgram_inst = RQDI_REQ | iid; req.ctrl_hdr.command_code = MCTP_CTRL_CMD_GET_MESSAGE_TYPE_SUPPORT; - rc = endpoint_query_peer(peer, MCTP_CTRL_HDR_MSG_TYPE, - &req, sizeof(req), &buf, &buf_size, &addr); + rc = endpoint_query_peer(peer, MCTP_CTRL_HDR_MSG_TYPE, &req, + sizeof(req), &buf, &buf_size, &addr); if (rc < 0) goto out; - rc = mctp_ctrl_validate_response(buf, buf_size, sizeof(*resp), - peer_tostr_short(peer), iid, - MCTP_CTRL_CMD_GET_MESSAGE_TYPE_SUPPORT); + rc = mctp_ctrl_validate_response( + buf, buf_size, sizeof(*resp), peer_tostr_short(peer), iid, + MCTP_CTRL_CMD_GET_MESSAGE_TYPE_SUPPORT); if (rc) goto out; - resp = (void*)buf; + resp = (void *)buf; expect_size = sizeof(*resp) + resp->msg_type_count; if (buf_size != expect_size) { warnx("%s: bad reply length. got %zu, expected %zu, %d entries. dest %s", - __func__, buf_size, expect_size, resp->msg_type_count, - peer_tostr(peer)); + __func__, buf_size, expect_size, resp->msg_type_count, + peer_tostr(peer)); rc = -ENOMSG; goto out; } @@ -1889,7 +1896,7 @@ static int query_get_peer_msgtypes(struct peer *peer) { goto out; } peer->num_message_types = resp->msg_type_count; - memcpy(peer->message_types, (void*)(resp+1), resp->msg_type_count); + memcpy(peer->message_types, (void *)(resp + 1), resp->msg_type_count); rc = 0; out: free(buf); @@ -1907,13 +1914,13 @@ static int peer_set_uuid(struct peer *peer, const uint8_t uuid[16]) return 0; } -static int -query_get_peer_uuid_by_phys(struct ctx *ctx, const dest_phys *dest, uint8_t uuid[16]) +static int query_get_peer_uuid_by_phys(struct ctx *ctx, const dest_phys *dest, + uint8_t uuid[16]) { struct sockaddr_mctp_ext addr; struct mctp_ctrl_cmd_get_uuid req; struct mctp_ctrl_resp_get_uuid *resp = NULL; - uint8_t* buf = NULL; + uint8_t *buf = NULL; size_t buf_size; uint8_t iid; int rc; @@ -1922,18 +1929,18 @@ query_get_peer_uuid_by_phys(struct ctx *ctx, const dest_phys *dest, uint8_t uuid req.ctrl_hdr.rq_dgram_inst = RQDI_REQ | iid; req.ctrl_hdr.command_code = MCTP_CTRL_CMD_GET_ENDPOINT_UUID; - rc = endpoint_query_phys(ctx, dest, MCTP_CTRL_HDR_MSG_TYPE, - &req, sizeof(req), &buf, &buf_size, &addr); + rc = endpoint_query_phys(ctx, dest, MCTP_CTRL_HDR_MSG_TYPE, &req, + sizeof(req), &buf, &buf_size, &addr); if (rc < 0) goto out; rc = mctp_ctrl_validate_response(buf, buf_size, sizeof(*resp), - dest_phys_tostr(dest), - iid, MCTP_CTRL_CMD_GET_ENDPOINT_UUID); + dest_phys_tostr(dest), iid, + MCTP_CTRL_CMD_GET_ENDPOINT_UUID); if (rc) goto out; - resp = (void*)buf; + resp = (void *)buf; memcpy(uuid, resp->uuid, 16); out: @@ -1941,17 +1948,19 @@ query_get_peer_uuid_by_phys(struct ctx *ctx, const dest_phys *dest, uint8_t uuid return rc; } -static int query_get_peer_uuid(struct peer *peer) { +static int query_get_peer_uuid(struct peer *peer) +{ struct sockaddr_mctp_ext addr; struct mctp_ctrl_cmd_get_uuid req; struct mctp_ctrl_resp_get_uuid *resp = NULL; - uint8_t* buf = NULL; + uint8_t *buf = NULL; size_t buf_size; uint8_t iid; int rc; if (peer->state != REMOTE) { - warnx("%s: Wrong state for peer %s", __func__, peer_tostr(peer)); + warnx("%s: Wrong state for peer %s", __func__, + peer_tostr(peer)); return -EPROTO; } @@ -1959,18 +1968,18 @@ static int query_get_peer_uuid(struct peer *peer) { req.ctrl_hdr.rq_dgram_inst = RQDI_REQ | iid; req.ctrl_hdr.command_code = MCTP_CTRL_CMD_GET_ENDPOINT_UUID; - rc = endpoint_query_peer(peer, MCTP_CTRL_HDR_MSG_TYPE, - &req, sizeof(req), &buf, &buf_size, &addr); + rc = endpoint_query_peer(peer, MCTP_CTRL_HDR_MSG_TYPE, &req, + sizeof(req), &buf, &buf_size, &addr); if (rc < 0) goto out; rc = mctp_ctrl_validate_response(buf, buf_size, sizeof(*resp), - peer_tostr_short(peer), - iid, MCTP_CTRL_CMD_GET_ENDPOINT_UUID); + peer_tostr_short(peer), iid, + MCTP_CTRL_CMD_GET_ENDPOINT_UUID); if (rc) goto out; - resp = (void*)buf; + resp = (void *)buf; rc = peer_set_uuid(peer, resp->uuid); if (rc < 0) @@ -1999,10 +2008,10 @@ static int validate_dest_phys(struct ctx *ctx, const dest_phys *dest) return 0; } -static int message_read_hwaddr(sd_bus_message *call, dest_phys* dest) +static int message_read_hwaddr(sd_bus_message *call, dest_phys *dest) { int rc; - const void* msg_hwaddr = NULL; + const void *msg_hwaddr = NULL; size_t msg_hwaddr_len; rc = sd_bus_message_read_array(call, 'y', &msg_hwaddr, &msg_hwaddr_len); @@ -2020,9 +2029,10 @@ static int message_read_hwaddr(sd_bus_message *call, dest_phys* dest) /* SetupEndpoint method tries the following in order: - request Get Endpoint ID to add to the known table, return that - request Set Endpoint ID, return that */ -static int method_setup_endpoint(sd_bus_message *call, void *data, sd_bus_error *berr) +static int method_setup_endpoint(sd_bus_message *call, void *data, + sd_bus_error *berr) { - dest_phys desti = {0}, *dest = &desti; + dest_phys desti = { 0 }, *dest = &desti; const char *peer_path = NULL; struct link *link = data; struct ctx *ctx = link->ctx; @@ -2032,7 +2042,7 @@ static int method_setup_endpoint(sd_bus_message *call, void *data, sd_bus_error dest->ifindex = link->ifindex; if (dest->ifindex <= 0) return sd_bus_error_setf(berr, SD_BUS_ERROR_INVALID_ARGS, - "Unknown MCTP interface"); + "Unknown MCTP interface"); rc = message_read_hwaddr(call, dest); if (rc < 0) @@ -2041,7 +2051,7 @@ static int method_setup_endpoint(sd_bus_message *call, void *data, sd_bus_error rc = validate_dest_phys(ctx, dest); if (rc < 0) return sd_bus_error_setf(berr, SD_BUS_ERROR_INVALID_ARGS, - "Bad physaddr"); + "Bad physaddr"); /* Get Endpoint ID */ rc = get_endpoint_peer(ctx, berr, dest, &peer, NULL); @@ -2053,8 +2063,8 @@ static int method_setup_endpoint(sd_bus_message *call, void *data, sd_bus_error peer_path = path_from_peer(peer); if (!peer_path) goto err; - return sd_bus_reply_method_return(call, "yisb", - peer->eid, peer->net, peer_path, 0); + return sd_bus_reply_method_return(call, "yisb", peer->eid, + peer->net, peer_path, 0); } else if (rc == -EEXIST) { // EEXISTS is OK, we will assign a new eid instead. } else if (rc < 0) { @@ -2073,15 +2083,16 @@ static int method_setup_endpoint(sd_bus_message *call, void *data, sd_bus_error if (ctx->verbose) fprintf(stderr, "%s returning from endpoint_assign_eid %s\n", __func__, peer_tostr(peer)); - return sd_bus_reply_method_return(call, "yisb", - peer->eid, peer->net, peer_path, 1); + return sd_bus_reply_method_return(call, "yisb", peer->eid, peer->net, + peer_path, 1); err: set_berr(ctx, rc, berr); return rc; } -static int method_assign_endpoint(sd_bus_message *call, void *data, sd_bus_error *berr) +static int method_assign_endpoint(sd_bus_message *call, void *data, + sd_bus_error *berr) { dest_phys desti, *dest = &desti; const char *peer_path = NULL; @@ -2093,7 +2104,7 @@ static int method_assign_endpoint(sd_bus_message *call, void *data, sd_bus_error dest->ifindex = link->ifindex; if (dest->ifindex <= 0) return sd_bus_error_setf(berr, SD_BUS_ERROR_INVALID_ARGS, - "Unknown MCTP interface"); + "Unknown MCTP interface"); rc = message_read_hwaddr(call, dest); if (rc < 0) @@ -2102,7 +2113,7 @@ static int method_assign_endpoint(sd_bus_message *call, void *data, sd_bus_error rc = validate_dest_phys(ctx, dest); if (rc < 0) return sd_bus_error_setf(berr, SD_BUS_ERROR_INVALID_ARGS, - "Bad physaddr"); + "Bad physaddr"); peer = find_peer_by_phys(ctx, dest); if (peer) { @@ -2111,8 +2122,8 @@ static int method_assign_endpoint(sd_bus_message *call, void *data, sd_bus_error if (!peer_path) goto err; - return sd_bus_reply_method_return(call, "yisb", - peer->eid, peer->net, peer_path, 0); + return sd_bus_reply_method_return(call, "yisb", peer->eid, + peer->net, peer_path, 0); } rc = endpoint_assign_eid(ctx, berr, dest, &peer, 0); @@ -2123,8 +2134,8 @@ static int method_assign_endpoint(sd_bus_message *call, void *data, sd_bus_error if (!peer_path) goto err; - return sd_bus_reply_method_return(call, "yisb", - peer->eid, peer->net, peer_path, 1); + return sd_bus_reply_method_return(call, "yisb", peer->eid, peer->net, + peer_path, 1); err: set_berr(ctx, rc, berr); return rc; @@ -2144,7 +2155,7 @@ static int method_assign_endpoint_static(sd_bus_message *call, void *data, dest->ifindex = link->ifindex; if (dest->ifindex <= 0) return sd_bus_error_setf(berr, SD_BUS_ERROR_INVALID_ARGS, - "Unknown MCTP interface"); + "Unknown MCTP interface"); rc = message_read_hwaddr(call, dest); if (rc < 0) @@ -2157,12 +2168,13 @@ static int method_assign_endpoint_static(sd_bus_message *call, void *data, rc = validate_dest_phys(ctx, dest); if (rc < 0) return sd_bus_error_setf(berr, SD_BUS_ERROR_INVALID_ARGS, - "Bad physaddr"); + "Bad physaddr"); peer = find_peer_by_phys(ctx, dest); if (peer) { if (peer->eid != eid) { - return sd_bus_error_setf(berr, SD_BUS_ERROR_INVALID_ARGS, + return sd_bus_error_setf( + berr, SD_BUS_ERROR_INVALID_ARGS, "Already assigned a different EID"); } @@ -2171,8 +2183,8 @@ static int method_assign_endpoint_static(sd_bus_message *call, void *data, if (!peer_path) goto err; - return sd_bus_reply_method_return(call, "yisb", - peer->eid, peer->net, peer_path, 0); + return sd_bus_reply_method_return(call, "yisb", peer->eid, + peer->net, peer_path, 0); } else { uint32_t netid; @@ -2180,8 +2192,9 @@ static int method_assign_endpoint_static(sd_bus_message *call, void *data, netid = mctp_nl_net_byindex(ctx->nl, dest->ifindex); peer = find_peer_by_addr(ctx, eid, netid); if (peer) { - return sd_bus_error_setf(berr, SD_BUS_ERROR_INVALID_ARGS, - "Address in use"); + return sd_bus_error_setf(berr, + SD_BUS_ERROR_INVALID_ARGS, + "Address in use"); } } @@ -2194,14 +2207,15 @@ static int method_assign_endpoint_static(sd_bus_message *call, void *data, if (!peer_path) goto err; - return sd_bus_reply_method_return(call, "yisb", - peer->eid, peer->net, peer_path, 1); + return sd_bus_reply_method_return(call, "yisb", peer->eid, peer->net, + peer_path, 1); err: set_berr(ctx, rc, berr); return rc; } -static int method_learn_endpoint(sd_bus_message *call, void *data, sd_bus_error *berr) +static int method_learn_endpoint(sd_bus_message *call, void *data, + sd_bus_error *berr) { int rc; const char *peer_path = NULL; @@ -2214,7 +2228,7 @@ static int method_learn_endpoint(sd_bus_message *call, void *data, sd_bus_error dest->ifindex = link->ifindex; if (dest->ifindex <= 0) return sd_bus_error_setf(berr, SD_BUS_ERROR_INVALID_ARGS, - "Unknown MCTP interface"); + "Unknown MCTP interface"); rc = message_read_hwaddr(call, dest); if (rc < 0) @@ -2223,15 +2237,15 @@ static int method_learn_endpoint(sd_bus_message *call, void *data, sd_bus_error rc = validate_dest_phys(ctx, dest); if (rc < 0) return sd_bus_error_setf(berr, SD_BUS_ERROR_INVALID_ARGS, - "Bad physaddr"); + "Bad physaddr"); rc = get_endpoint_peer(ctx, berr, dest, &peer, &eid); if (rc == -EEXIST) { /* We have a conflict with an existing endpoint, so can't * learn; recovery would requre a Set Endpoint ID. */ - return sd_bus_error_setf(berr, SD_BUS_ERROR_FILE_EXISTS, - "Endpoint claimed EID %d which is already used", - eid); + return sd_bus_error_setf( + berr, SD_BUS_ERROR_FILE_EXISTS, + "Endpoint claimed EID %d which is already used", eid); } if (rc < 0) goto err; @@ -2242,7 +2256,7 @@ static int method_learn_endpoint(sd_bus_message *call, void *data, sd_bus_error if (!peer_path) goto err; return sd_bus_reply_method_return(call, "yisb", peer->eid, peer->net, - peer_path, 1); + peer_path, 1); err: set_berr(ctx, rc, berr); return rc; @@ -2260,7 +2274,7 @@ static int query_peer_properties(struct peer *peer) // Warn here, it's a mandatory command code. // It might be too noisy if some devices don't implement it. warnx("Error getting endpoint types for %s. Ignoring error %d %s", - peer_tostr(peer), rc, strerror(-rc)); + peer_tostr(peer), rc, strerror(-rc)); rc = 0; } @@ -2268,7 +2282,7 @@ static int query_peer_properties(struct peer *peer) if (rc < 0) { if (peer->ctx->verbose) warnx("Error getting UUID for %s. Ignoring error %d %s", - peer_tostr(peer), rc, strerror(-rc)); + peer_tostr(peer), rc, strerror(-rc)); rc = 0; } @@ -2279,22 +2293,23 @@ static int query_peer_properties(struct peer *peer) static int peer_neigh_update(struct peer *peer, uint16_t type) { struct { - struct nlmsghdr nh; - struct ndmsg ndmsg; - uint8_t rta_buff[RTA_SPACE(1) + RTA_SPACE(MAX_ADDR_LEN)]; - } msg = {0}; + struct nlmsghdr nh; + struct ndmsg ndmsg; + uint8_t rta_buff[RTA_SPACE(1) + RTA_SPACE(MAX_ADDR_LEN)]; + } msg = { 0 }; size_t rta_len = sizeof(msg.rta_buff); - struct rtattr *rta = (void*)msg.rta_buff; + struct rtattr *rta = (void *)msg.rta_buff; msg.nh.nlmsg_type = type; msg.nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK; msg.ndmsg.ndm_ifindex = peer->phys.ifindex; msg.ndmsg.ndm_family = AF_MCTP; msg.nh.nlmsg_len = NLMSG_LENGTH(sizeof(msg.ndmsg)); - msg.nh.nlmsg_len += mctp_put_rtnlmsg_attr(&rta, &rta_len, - NDA_DST, &peer->eid, sizeof(peer->eid)); - msg.nh.nlmsg_len += mctp_put_rtnlmsg_attr(&rta, &rta_len, - NDA_LLADDR, peer->phys.hwaddr, peer->phys.hwaddr_len); + msg.nh.nlmsg_len += mctp_put_rtnlmsg_attr( + &rta, &rta_len, NDA_DST, &peer->eid, sizeof(peer->eid)); + msg.nh.nlmsg_len += mctp_put_rtnlmsg_attr(&rta, &rta_len, NDA_LLADDR, + peer->phys.hwaddr, + peer->phys.hwaddr_len); return mctp_nl_send(peer->ctx->nl, &msg.nh); } @@ -2302,7 +2317,8 @@ static int peer_neigh_update(struct peer *peer, uint16_t type) static int peer_route_update(struct peer *peer, uint16_t type) { if (!mctp_nl_if_exists(peer->ctx->nl, peer->phys.ifindex)) { - bug_warn("%s: Unknown ifindex %d", __func__, peer->phys.ifindex); + bug_warn("%s: Unknown ifindex %d", __func__, + peer->phys.ifindex); return -ENODEV; } @@ -2347,7 +2363,8 @@ static void add_peer_neigh(struct peer *peer) size_t if_hwaddr_len; int rc; - rc = mctp_nl_hwaddr_len_byindex(peer->ctx->nl, peer->phys.ifindex, &if_hwaddr_len); + rc = mctp_nl_hwaddr_len_byindex(peer->ctx->nl, peer->phys.ifindex, + &if_hwaddr_len); if (rc) { warnx("Missing neigh ifindex %d", peer->phys.ifindex); return; @@ -2365,7 +2382,7 @@ static void add_peer_neigh(struct peer *peer) rc = peer_neigh_update(peer, RTM_NEWNEIGH); if (rc < 0 && rc != -EEXIST) { warnx("Failed adding neigh for %s: %s", peer_tostr(peer), - strerror(-rc)); + strerror(-rc)); } else { peer->have_neigh = true; } @@ -2389,7 +2406,7 @@ static void add_peer_route(struct peer *peer) rc = peer_route_update(peer, RTM_NEWROUTE); if (rc < 0 && rc != -EEXIST) { warnx("Failed adding route for %s: %s", peer_tostr(peer), - strerror(-rc)); + strerror(-rc)); } else { peer->have_route = true; } @@ -2436,16 +2453,18 @@ static int publish_peer(struct peer *peer, bool add_route) } /* removes route, neigh, dbus entry for the peer */ -static int unpublish_peer(struct peer *peer) { +static int unpublish_peer(struct peer *peer) +{ int rc; if (peer->have_neigh) { if (peer->ctx->verbose) { - fprintf(stderr, "Deleting neigh to %s\n", peer_tostr(peer)); + fprintf(stderr, "Deleting neigh to %s\n", + peer_tostr(peer)); } rc = peer_neigh_update(peer, RTM_DELNEIGH); if (rc < 0) { warnx("Failed removing neigh for %s: %s", - peer_tostr(peer), strerror(-rc)); + peer_tostr(peer), strerror(-rc)); } else { peer->have_neigh = false; } @@ -2453,12 +2472,13 @@ static int unpublish_peer(struct peer *peer) { if (peer->have_route) { if (peer->ctx->verbose) { - fprintf(stderr, "Deleting route to %s\n", peer_tostr(peer)); + fprintf(stderr, "Deleting route to %s\n", + peer_tostr(peer)); } rc = peer_route_update(peer, RTM_DELROUTE); if (rc < 0) { warnx("Failed removing route for %s: %s", - peer_tostr(peer), strerror(-rc)); + peer_tostr(peer), strerror(-rc)); } else { peer->have_route = false; } @@ -2479,7 +2499,7 @@ static int unpublish_peer(struct peer *peer) { } static int method_endpoint_remove(sd_bus_message *call, void *data, - sd_bus_error *berr) + sd_bus_error *berr) { struct peer *peer = data; int rc; @@ -2487,7 +2507,7 @@ static int method_endpoint_remove(sd_bus_message *call, void *data, if (peer->state == LOCAL) return sd_bus_error_setf(berr, SD_BUS_ERROR_FAILED, - "Cannot remove mctpd-local endpoint"); + "Cannot remove mctpd-local endpoint"); if (!peer->published) { rc = -EPROTO; goto out; @@ -2514,8 +2534,8 @@ static int method_endpoint_remove(sd_bus_message *call, void *data, (MCTP_I2C_TSYM_MT1_MAX_US + 2 * MCTP_I2C_TSYM_MT3_MAX_US) #define MCTP_I2C_TSYM_MT2_MAX_MS MCTP_I2C_TSYM_MT4_MIN_US -static int -peer_endpoint_recover(sd_event_source *s, uint64_t usec, void *userdata) +static int peer_endpoint_recover(sd_event_source *s, uint64_t usec, + void *userdata) { struct peer *peer = userdata; struct ctx *ctx = peer->ctx; @@ -2540,7 +2560,8 @@ peer_endpoint_recover(sd_event_source *s, uint64_t usec, void *userdata) * of DSP0236 v1.3.1. */ rc = query_get_endpoint_id(ctx, &peer->phys, &peer->recovery.eid, - &peer->recovery.endpoint_type, &peer->recovery.medium_spec); + &peer->recovery.endpoint_type, + &peer->recovery.medium_spec); if (rc < 0) { goto reschedule; } @@ -2558,25 +2579,29 @@ peer_endpoint_recover(sd_event_source *s, uint64_t usec, void *userdata) * EID for the exchanged device, given it is responsive. */ if (peer->recovery.eid != peer->eid) { - static const uint8_t nil_uuid[16] = {0}; + static const uint8_t nil_uuid[16] = { 0 }; bool uuid_matches_peer = false; bool uuid_matches_nil = false; - uint8_t uuid[16] = {0}; + uint8_t uuid[16] = { 0 }; mctp_eid_t new_eid; rc = query_get_peer_uuid_by_phys(ctx, &peer->phys, uuid); if (!rc && peer->uuid) { - static_assert(sizeof(uuid) == sizeof(nil_uuid), "Unsynchronized UUID sizes"); - uuid_matches_peer = memcmp(uuid, peer->uuid, sizeof(uuid)) == 0; - uuid_matches_nil = memcmp(uuid, nil_uuid, sizeof(uuid)) == 0; + static_assert(sizeof(uuid) == sizeof(nil_uuid), + "Unsynchronized UUID sizes"); + uuid_matches_peer = + memcmp(uuid, peer->uuid, sizeof(uuid)) == 0; + uuid_matches_nil = + memcmp(uuid, nil_uuid, sizeof(uuid)) == 0; } if (rc || !uuid_matches_peer || - (uuid_matches_nil && !MCTPD_RECOVER_NIL_UUID)) { + (uuid_matches_nil && !MCTPD_RECOVER_NIL_UUID)) { /* It's not known to be the same device, allocate a new EID */ dest_phys phys = peer->phys; - assert(sd_event_source_get_enabled(peer->recovery.source, NULL) == 0); + assert(sd_event_source_get_enabled( + peer->recovery.source, NULL) == 0); remove_peer(peer); /* * The representation of the old peer is now gone. Set up the new peer, @@ -2607,7 +2632,8 @@ peer_endpoint_recover(sd_event_source *s, uint64_t usec, void *userdata) goto reschedule; rc = sd_bus_emit_properties_changed(ctx->bus, peer_path, - CC_MCTP_DBUS_IFACE_ENDPOINT, "Connectivity", NULL); + CC_MCTP_DBUS_IFACE_ENDPOINT, + "Connectivity", NULL); if (rc < 0) { goto reschedule; } @@ -2623,22 +2649,24 @@ peer_endpoint_recover(sd_event_source *s, uint64_t usec, void *userdata) reschedule: if (peer->recovery.npolls > 0) { rc = sd_event_source_set_time_relative(peer->recovery.source, - peer->recovery.delay); + peer->recovery.delay); if (rc >= 0) { - rc = sd_event_source_set_enabled(peer->recovery.source, SD_EVENT_ONESHOT); + rc = sd_event_source_set_enabled(peer->recovery.source, + SD_EVENT_ONESHOT); } } if (rc < 0) { reclaim: /* Recovery unsuccessful, clean up the peer */ - assert(sd_event_source_get_enabled(peer->recovery.source, NULL) == 0); + assert(sd_event_source_get_enabled(peer->recovery.source, + NULL) == 0); remove_peer(peer); } return rc < 0 ? rc : 0; } static int method_endpoint_recover(sd_bus_message *call, void *data, - sd_bus_error *berr) + sd_bus_error *berr) { struct peer *peer; bool previously; @@ -2656,19 +2684,20 @@ static int method_endpoint_recover(sd_bus_message *call, void *data, peer->recovery.npolls = MCTP_I2C_TSYM_MN1_MIN + 1; peer->recovery.delay = (MCTP_I2C_TSYM_TRECLAIM_MIN_US / 2) - ctx->mctp_timeout; - rc = sd_event_add_time_relative(ctx->event, &peer->recovery.source, - CLOCK_MONOTONIC, 0, ctx->mctp_timeout, peer_endpoint_recover, peer); + rc = sd_event_add_time_relative( + ctx->event, &peer->recovery.source, CLOCK_MONOTONIC, 0, + ctx->mctp_timeout, peer_endpoint_recover, peer); if (rc < 0) { goto out; } peer->degraded = true; - rc = sd_bus_emit_properties_changed(sd_bus_message_get_bus(call), - sd_bus_message_get_path(call), - sd_bus_message_get_interface(call), - "Connectivity", - NULL); + rc = sd_bus_emit_properties_changed( + sd_bus_message_get_bus(call), + sd_bus_message_get_path(call), + sd_bus_message_get_interface(call), "Connectivity", + NULL); if (rc < 0) { goto out; } @@ -2680,7 +2709,8 @@ static int method_endpoint_recover(sd_bus_message *call, void *data, if (rc < 0 && !previously) { if (peer->degraded) { /* Cleanup the timer if it was setup successfully. */ - sd_event_source_set_enabled(peer->recovery.source, SD_EVENT_OFF); + sd_event_source_set_enabled(peer->recovery.source, + SD_EVENT_OFF); sd_event_source_unref(peer->recovery.source); } peer->degraded = previously; @@ -2693,7 +2723,7 @@ static int method_endpoint_recover(sd_bus_message *call, void *data, } static int method_endpoint_set_mtu(sd_bus_message *call, void *data, - sd_bus_error *berr) + sd_bus_error *berr) { struct peer *peer = data; struct ctx *ctx = peer->ctx; @@ -2702,7 +2732,7 @@ static int method_endpoint_set_mtu(sd_bus_message *call, void *data, if (peer->state == LOCAL) return sd_bus_error_setf(berr, SD_BUS_ERROR_FAILED, - "Cannot set local endpoint MTU"); + "Cannot set local endpoint MTU"); rc = sd_bus_message_read(call, "u", &mtu); if (rc < 0) @@ -2811,9 +2841,10 @@ static const sd_bus_vtable bus_link_owner_vtable[] = { }; // clang-format on -static int bus_endpoint_get_prop(sd_bus *bus, - const char *path, const char *interface, const char *property, - sd_bus_message *reply, void *userdata, sd_bus_error *berr) +static int bus_endpoint_get_prop(sd_bus *bus, const char *path, + const char *interface, const char *property, + sd_bus_message *reply, void *userdata, + sd_bus_error *berr) { struct peer *peer = userdata; int rc; @@ -2824,23 +2855,27 @@ static int bus_endpoint_get_prop(sd_bus *bus, rc = sd_bus_message_append(reply, "y", peer->eid); } else if (strcmp(property, "SupportedMessageTypes") == 0) { rc = sd_bus_message_append_array(reply, 'y', - peer->message_types, peer->num_message_types); + peer->message_types, + peer->num_message_types); } else if (strcmp(property, "UUID") == 0 && peer->uuid) { const char *s = dfree(bytes_to_uuid(peer->uuid)); rc = sd_bus_message_append(reply, "s", s); } else if (strcmp(property, "Connectivity") == 0) { - rc = sd_bus_message_append(reply, "s", peer->degraded ? "Degraded" : "Available"); + rc = sd_bus_message_append( + reply, "s", peer->degraded ? "Degraded" : "Available"); } else { - warnx("Unknown property '%s' for %s iface %s", property, path, interface); + warnx("Unknown property '%s' for %s iface %s", property, path, + interface); rc = -ENOENT; } return rc; } -static int bus_network_get_prop(sd_bus *bus, - const char *path, const char *interface, const char *property, - sd_bus_message *reply, void *userdata, sd_bus_error *berr) +static int bus_network_get_prop(sd_bus *bus, const char *path, + const char *interface, const char *property, + sd_bus_message *reply, void *userdata, + sd_bus_error *berr) { struct net *net = userdata; int rc = -ENOENT; @@ -2859,21 +2894,24 @@ static int bus_network_get_prop(sd_bus *bus, return rc; } -static int bus_link_get_prop(sd_bus *bus, - const char *path, const char *interface, const char *property, - sd_bus_message *reply, void *userdata, sd_bus_error *berr) +static int bus_link_get_prop(sd_bus *bus, const char *path, + const char *interface, const char *property, + sd_bus_message *reply, void *userdata, + sd_bus_error *berr) { struct link *link = userdata; int rc = 0; if (link->published && strcmp(property, "Role") == 0) { - rc = sd_bus_message_append(reply, "s", roles[link->role].dbus_val); + rc = sd_bus_message_append(reply, "s", + roles[link->role].dbus_val); } else if (strcmp(property, "NetworkId") == 0) { - uint32_t net = mctp_nl_net_byindex(link->ctx->nl, link->ifindex); + uint32_t net = + mctp_nl_net_byindex(link->ctx->nl, link->ifindex); rc = sd_bus_message_append_basic(reply, 'u', &net); } else { sd_bus_error_setf(berr, SD_BUS_ERROR_INVALID_ARGS, - "Unknown property."); + "Unknown property."); rc = -ENOENT; } @@ -2881,9 +2919,10 @@ static int bus_link_get_prop(sd_bus *bus, return rc; } -static int bus_link_set_prop(sd_bus *bus, - const char *path, const char *interface, const char *property, - sd_bus_message *value, void *userdata, sd_bus_error *berr) +static int bus_link_set_prop(sd_bus *bus, const char *path, + const char *interface, const char *property, + sd_bus_message *value, void *userdata, + sd_bus_error *berr) { struct link *link = userdata; struct ctx *ctx = link->ctx; @@ -2892,29 +2931,31 @@ static int bus_link_set_prop(sd_bus *bus, int rc = -1; if (strcmp(property, "Role") != 0) { - warnx("Unknown property '%s' for %s iface %s", property, path, interface); + warnx("Unknown property '%s' for %s iface %s", property, path, + interface); rc = -ENOENT; goto out; } if (link->role != ENDPOINT_ROLE_UNKNOWN) { sd_bus_error_setf(berr, SD_BUS_ERROR_INVALID_ARGS, - "Role is already set."); + "Role is already set."); rc = -ENOENT; goto out; } rc = sd_bus_message_read(value, "s", &state); if (rc < 0) { - sd_bus_error_setf(berr, SD_BUS_ERROR_INVALID_ARGS, - "Unknown Role. Only Support BusOwner/EndPoint."); + sd_bus_error_setf( + berr, SD_BUS_ERROR_INVALID_ARGS, + "Unknown Role. Only Support BusOwner/EndPoint."); goto out; } rc = get_role(state, &role); if (rc < 0) { warnx("Invalid property value '%s' for property '%s' from interface '%s' on object '%s'", - state, property, interface, path); + state, property, interface, path); rc = -EINVAL; goto out; } @@ -2925,13 +2966,10 @@ static int bus_link_set_prop(sd_bus *bus, return rc; } -__attribute__((unused)) -static int bus_endpoint_set_prop(sd_bus *bus, const char *path, - const char *interface, - const char *property, - sd_bus_message *value, - void *userdata, - sd_bus_error *ret_error) +__attribute__((unused)) static int +bus_endpoint_set_prop(sd_bus *bus, const char *path, const char *interface, + const char *property, sd_bus_message *value, + void *userdata, sd_bus_error *ret_error) { struct peer *peer = userdata; const char *connectivity; @@ -2950,17 +2988,17 @@ static int bus_endpoint_set_prop(sd_bus *bus, const char *path, peer->degraded = true; } else { warnx("Invalid property value '%s' for property '%s' from interface '%s' on object '%s'", - connectivity, property, interface, path); + connectivity, property, interface, path); rc = -EINVAL; goto out; } - if (previously != peer->degraded) - { - rc = sd_bus_emit_properties_changed(bus, path, interface, "Connectivity", NULL); + if (previously != peer->degraded) { + rc = sd_bus_emit_properties_changed( + bus, path, interface, "Connectivity", NULL); } } else { - warnx("Unknown property '%s' in interface '%s' on object '%s'", property, - interface, path); + warnx("Unknown property '%s' in interface '%s' on object '%s'", + property, interface, path); rc = -ENOENT; } out: @@ -3068,7 +3106,8 @@ static const sd_bus_vtable bus_network_vtable[] = { }; // clang-format on -static int emit_endpoint_added(const struct peer *peer) { +static int emit_endpoint_added(const struct peer *peer) +{ const char *path = NULL; int rc; @@ -3085,7 +3124,8 @@ static int emit_endpoint_added(const struct peer *peer) { return rc; } -static int emit_endpoint_removed(const struct peer *peer) { +static int emit_endpoint_removed(const struct peer *peer) +{ const char *path = NULL; int rc; @@ -3107,7 +3147,7 @@ static int emit_net_added(struct ctx *ctx, struct net *net) int rc; if (ctx->verbose) - warnx("emitting net add: %s", net->path); + warnx("emitting net add: %s", net->path); rc = sd_bus_emit_object_added(ctx->bus, net->path); if (rc < 0) @@ -3134,7 +3174,7 @@ static int emit_net_removed(struct ctx *ctx, struct net *net) int rc; if (ctx->verbose) - warnx("emitting net remove: %s", net->path); + warnx("emitting net remove: %s", net->path); rc = sd_bus_emit_object_removed(ctx->bus, net->path); if (rc < 0) @@ -3202,7 +3242,7 @@ static int setup_bus(struct ctx *ctx) } rc = sd_bus_attach_event(ctx->bus, ctx->event, - SD_EVENT_PRIORITY_NORMAL); + SD_EVENT_PRIORITY_NORMAL); if (rc < 0) { warnx("Failed attach to event loop"); goto out; @@ -3219,7 +3259,6 @@ static int setup_bus(struct ctx *ctx) return rc; } - int request_dbus(struct ctx *ctx) { int rc; @@ -3233,7 +3272,6 @@ int request_dbus(struct ctx *ctx) return 0; } - // Deletes one local EID. static int del_local_eid(struct ctx *ctx, uint32_t net, int eid) { @@ -3247,20 +3285,22 @@ static int del_local_eid(struct ctx *ctx, uint32_t net, int eid) } if (peer->state != LOCAL) { - bug_warn("local eid %d net %d to delete is incorrect", eid, net); + bug_warn("local eid %d net %d to delete is incorrect", eid, + net); return -EPROTO; } peer->local_count--; if (peer->local_count < 0) { - bug_warn("local eid %d net %d bad refcount %d", - eid, net, peer->local_count); + bug_warn("local eid %d net %d bad refcount %d", eid, net, + peer->local_count); } rc = 0; if (peer->local_count <= 0) { if (ctx->verbose) { - fprintf(stderr, "Removing local eid %d net %d\n", eid, net); + fprintf(stderr, "Removing local eid %d net %d\n", eid, + net); } rc = remove_peer(peer); @@ -3294,7 +3334,8 @@ static int prune_old_nets(struct ctx *ctx) for (size_t p = 0; p < 256; p++) { // Sanity check that no peers are used if (ctx->nets[i]->peers[p]) { - bug_warn("stale entry for eid %zd in deleted net %d", + bug_warn( + "stale entry for eid %zd in deleted net %d", p, net->net); } } @@ -3307,7 +3348,8 @@ static int prune_old_nets(struct ctx *ctx) return 0; } -static void free_link(struct link *link) { +static void free_link(struct link *link) +{ sd_bus_slot_unref(link->slot_iface); sd_bus_slot_unref(link->slot_busowner); free(link->path); @@ -3347,11 +3389,11 @@ static int del_interface(struct link *link) static void free_links(struct ctx *ctx) { size_t num; - int* ifs; + int *ifs; ifs = mctp_nl_if_list(ctx->nl, &num); for (size_t i = 0; i < num; i++) { - struct link* link = mctp_nl_get_link_userdata(ctx->nl, ifs[i]); + struct link *link = mctp_nl_get_link_userdata(ctx->nl, ifs[i]); mctp_nl_set_link_userdata(ctx->nl, ifs[i], NULL); if (link) { free_link(link); @@ -3370,8 +3412,8 @@ static int change_net_interface(struct ctx *ctx, int ifindex, uint32_t old_net) if (ctx->verbose) { fprintf(stderr, "Moving interface #%d %s from net %d -> %d\n", - ifindex, mctp_nl_if_byindex(ctx->nl, ifindex), - old_net, new_net); + ifindex, mctp_nl_if_byindex(ctx->nl, ifindex), old_net, + new_net); } link = mctp_nl_get_link_userdata(ctx->nl, ifindex); @@ -3417,9 +3459,8 @@ static int change_net_interface(struct ctx *ctx, int ifindex, uint32_t old_net) if (peer->net != old_net) { bug_warn("%s: Mismatch old net %d vs %d, new net %d", - __func__, peer->net, old_net, new_net); + __func__, peer->net, old_net, new_net); continue; - } if (check_peer_struct(peer, old_n) != 0) { bug_warn("%s: Inconsistent state", __func__); @@ -3429,7 +3470,7 @@ static int change_net_interface(struct ctx *ctx, int ifindex, uint32_t old_net) if (new_n->peers[peer->eid]) { // Conflict, drop it warnx("EID %d already exists moving net %d->%d, dropping it", - peer->eid, old_net, new_net); + peer->eid, old_net, new_net); remove_peer(peer); continue; } @@ -3468,8 +3509,7 @@ static int add_local_eid(struct ctx *ctx, uint32_t net, int eid) return 0; } else { // TODO: remove the peer and add a new local one. - warnx("Local eid %d net %d already exists?", - eid, net); + warnx("Local eid %d net %d already exists?", eid, net); return -EPROTO; } } @@ -3483,8 +3523,7 @@ static int add_local_eid(struct ctx *ctx, uint32_t net, int eid) peer->local_count = 1; rc = peer_set_uuid(peer, ctx->uuid); if (rc < 0) { - warnx("Failed setting local UUID: %s", - strerror(-rc)); + warnx("Failed setting local UUID: %s", strerror(-rc)); } // Only advertise supporting control messages @@ -3501,7 +3540,6 @@ static int add_local_eid(struct ctx *ctx, uint32_t net, int eid) warnx("Error publishing local eid %d net %d", eid, net); } return 0; - } // Adds peers for local EIDs on an interface @@ -3514,13 +3552,13 @@ static int add_interface_local(struct ctx *ctx, int ifindex) int rc; if (ctx->verbose) { - fprintf(stderr, "Adding interface #%d %s\n", - ifindex, mctp_nl_if_byindex(ctx->nl, ifindex)); + fprintf(stderr, "Adding interface #%d %s\n", ifindex, + mctp_nl_if_byindex(ctx->nl, ifindex)); } if (!mctp_nl_up_byindex(ctx->nl, ifindex)) warnx("Warning, interface %s is down", - mctp_nl_if_byindex(ctx->nl, ifindex)); + mctp_nl_if_byindex(ctx->nl, ifindex)); net = mctp_nl_net_byindex(ctx->nl, ifindex); if (net == 0) { @@ -3577,7 +3615,7 @@ static int add_net(struct ctx *ctx, uint32_t net_id) return -ENOMEM; } - tmp = realloc(ctx->nets, sizeof(struct net *) * (ctx->num_nets+1)); + tmp = realloc(ctx->nets, sizeof(struct net *) * (ctx->num_nets + 1)); if (!tmp) { warnx("Out of memory"); return -ENOMEM; @@ -3644,15 +3682,15 @@ static int add_interface(struct ctx *ctx, int ifindex) goto err_free; } - sd_bus_add_object_vtable(link->ctx->bus, &link->slot_iface, - link->path, CC_MCTP_DBUS_IFACE_INTERFACE, - bus_link_vtable, link); + sd_bus_add_object_vtable(link->ctx->bus, &link->slot_iface, link->path, + CC_MCTP_DBUS_IFACE_INTERFACE, bus_link_vtable, + link); if (link->role == ENDPOINT_ROLE_BUS_OWNER) { sd_bus_add_object_vtable(link->ctx->bus, &link->slot_busowner, - link->path, CC_MCTP_DBUS_IFACE_BUSOWNER, + link->path, + CC_MCTP_DBUS_IFACE_BUSOWNER, bus_link_owner_vtable, link); - } link->published = true; @@ -3765,7 +3803,7 @@ static int fill_uuid(struct ctx *ctx) { int rc; sd_id128_t appid; - sd_id128_t *u = (void*)ctx->uuid; + sd_id128_t *u = (void *)ctx->uuid; rc = sd_id128_from_string(mctpd_appid, &appid); if (rc < 0) { @@ -3886,7 +3924,7 @@ static void free_config(struct ctx *ctx) int main(int argc, char **argv) { - struct ctx ctxi = {0}, *ctx = &ctxi; + struct ctx ctxi = { 0 }, *ctx = &ctxi; int rc; setlinebuf(stdout); @@ -3923,7 +3961,7 @@ int main(int argc, char **argv) rc = listen_monitor(ctx); if (rc < 0) { warnx("Error monitoring netlink updates. State changes will be ignored. (%s)", - strerror(-rc)); + strerror(-rc)); } rc = setup_nets(ctx); From a8db3d612b04820551a1ea87189ee9070cf25211 Mon Sep 17 00:00:00 2001 From: Jeremy Kerr Date: Thu, 26 Jun 2025 14:40:40 +0800 Subject: [PATCH 3/3] workflows: Add format check Now that we have formatted tree-wide, use meson's clang-format-check target to ensure no format regressions. Signed-off-by: Jeremy Kerr --- .github/workflows/pr.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 10e50b3d..42b47fcf 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -23,5 +23,8 @@ jobs: - name: Build mctp run: meson compile -C build + - name: Check formatting + run: ninja -C build clang-format-check + - name: Test mctp run: meson test -C build