From 5138c9f09aa7069fb0b7433cd78aca2d9f325590 Mon Sep 17 00:00:00 2001 From: "Joseph C. Lehner" Date: Thu, 11 Jan 2024 12:23:56 +0100 Subject: [PATCH] Revert "Allow changing the region without uploading a firmware file" This reverts commit 6838a3a546fe743ec747065fc2cf1227824e76b7. --- ethsock.c | 2 - main.c | 30 ++++------ nmrp.c | 161 +++++++++++++++++++++++++----------------------------- nmrpd.h | 2 + 4 files changed, 86 insertions(+), 109 deletions(-) diff --git a/ethsock.c b/ethsock.c index 615352a..3f48e4c 100644 --- a/ethsock.c +++ b/ethsock.c @@ -1325,8 +1325,6 @@ static int ethsock_ip_add_del(struct ethsock *sock, uint32_t ipaddr, uint32_t ip (*undo)->ip[0] = ipaddr; (*undo)->ip[1] = ipmask; - } else if (!add && (!undo || !*undo)) { - return 0; } ret = -1; diff --git a/main.c b/main.c index b5c4e48..33292a8 100644 --- a/main.c +++ b/main.c @@ -29,7 +29,7 @@ void usage(FILE *fp) fprintf(fp, "Usage: nmrpflash [OPTIONS...]\n" "\n" - "Options (-i, and either -f, -c, or -R are mandatory):\n" + "Options (-i, and -f or -c are mandatory):\n" " -a IP address to assign to target device [%s]\n" " -A IP address to assign to selected interface [%s]\n" " -B Blind mode (don't wait for response packets)\n" @@ -42,7 +42,9 @@ void usage(FILE *fp) " -t Timeout (in milliseconds) for NMRP packets [%d ms]\n" " -T Time (seconds) to wait after successfull TFTP upload [%d s]\n" " -p Port to use for TFTP upload [%d]\n" - " -R Set device region (BZ, GR, IN, JP, KO, NA, PR, RU, WW)\n" +#ifdef NMRPFLASH_SET_REGION + " -R Set device region (NA, WW, GR, PR, RU, BZ, IN, KO, JP)\n" +#endif " -S Skip bytes of the firmware file\n" #ifdef NMRPFLASH_TFTP_TEST " -U Test TFTP upload\n" @@ -61,19 +63,15 @@ void usage(FILE *fp) ")\n\n" #ifndef NMRPFLASH_WINDOWS "# nmrpflash -i eth0 -f firmware.bin\n" - "\nor\n\n" - "# nmrpflash -i eth0 -R WW\n" #else "C:\\> nmrpflash.exe -i net0 -f firmware.bin\n" - "\nor\n\n" - "C:\\> nmrpflash.exe -i net0 -R WW\n" #endif "\n" "When using -c, the environment variables IP, PORT, NETMASK\n" "and MAC are set to the device IP address, TFTP port, subnet\n" "mask and MAC address, respectively.\n" "\n" - "nmrpflash %s, Copyright (C) 2016-2024 Joseph C. Lehner\n" + "nmrpflash %s, Copyright (C) 2016-2023 Joseph C. Lehner\n" "nmrpflash is free software, licensed under the GNU GPLv3.\n" "Source code at https://github.com/jclehner/nmrpflash\n" "\n" @@ -153,7 +151,7 @@ int main(int argc, char **argv) .ipmask = NMRP_DEFAULT_SUBNET, .intf = NULL, .mac = "ff:ff:ff:ff:ff:ff", - .op = -1, + .op = NMRP_UPLOAD_FW, .port = NMRP_DEFAULT_TFTP_PORT, .region = NULL, .blind = false, @@ -229,9 +227,11 @@ int main(int argc, char **argv) case 'M': args.ipmask = optarg; break; +#ifdef NMRPFLASH_SET_REGION case 'R': args.region = optarg; break; +#endif case 'p': case 'S': case 'T': @@ -297,17 +297,9 @@ int main(int argc, char **argv) } #ifndef NMRPFLASH_FUZZ - if (!list) { - if (args.file_local || args.tftpcmd) { - args.op = NMRP_UPLOAD_FW; - } else if (args.region) { - args.op = NMRP_SET_REGION; - } - - if (args.op == -1 || !args.intf) { - usage(stderr); - return 1; - } + if (!list && ((!args.file_local && !args.tftpcmd) || !args.intf)) { + usage(stderr); + return 1; } if (!list) { diff --git a/nmrp.c b/nmrp.c index fb58871..95416ea 100644 --- a/nmrp.c +++ b/nmrp.c @@ -212,21 +212,20 @@ static void msg_mkadvertise(struct nmrp_msg *msg, const char *magic) msg_mkopt(msg, msg->opts, NMRP_O_MAGIC_NO, magic, strlen(magic)); } -static void msg_mkconfack(struct nmrp_msg *msg, uint32_t ipaddr, uint32_t ipmask, uint16_t region, enum nmrp_op op) +static void msg_mkconfack(struct nmrp_msg *msg, uint32_t ipaddr, uint32_t ipmask, uint16_t region) { - char *p = msg->opts; + char *p; uint32_t ip[2] = { ipaddr, ipmask }; msg_init(msg, NMRP_C_CONF_ACK); + p = msg_mkopt(msg, msg->opts, NMRP_O_DEV_IP, &ip, 8); + p = msg_mkopt(msg, p, NMRP_O_FW_UP, NULL, 0); - if (op != NMRP_SET_REGION) { - p = msg_mkopt(msg, p, NMRP_O_DEV_IP, &ip, 8); - p = msg_mkopt(msg, p, NMRP_O_FW_UP, NULL, 0); - } - +#ifdef NMRPFLASH_SET_REGION if (region) { p = msg_mkopt(msg, p, NMRP_O_DEV_REGION, ®ion, 2); } +#endif } #ifdef NMRPFLASH_FUZZ @@ -397,54 +396,57 @@ int nmrp_do(struct nmrpd_args *args) struct in_addr ipaddr; struct in_addr ipmask; - if (args->op == NMRP_UPLOAD_FW) { - if (!mac_parse(args->mac, dest)) { - fprintf(stderr, "Invalid MAC address '%s'.\n", args->mac); + if (args->op != NMRP_UPLOAD_FW) { + fprintf(stderr, "Operation not implemented.\n"); + return 1; + } + + if (!mac_parse(args->mac, dest)) { + fprintf(stderr, "Invalid MAC address '%s'.\n", args->mac); + return 1; + } + + ipmask.s_addr = inet_addr(args->ipmask); + if (ipmask.s_addr == INADDR_NONE + || netmask(bitcount(ipmask.s_addr)) != ipmask.s_addr) { + fprintf(stderr, "Invalid subnet mask '%s'.\n", args->ipmask); + return 1; + } + + if (!args->ipaddr) { + autoip = true; + args->ipaddr = NMRP_DEFAULT_IP_REMOTE; + + if (!args->ipaddr_intf) { + args->ipaddr_intf = NMRP_DEFAULT_IP_LOCAL; + } + } else if (args->ipaddr_intf) { + autoip = true; + } else { + autoip = false; + } + + if ((ipaddr.s_addr = inet_addr(args->ipaddr)) == INADDR_NONE) { + fprintf(stderr, "Invalid IP address '%s'.\n", args->ipaddr); + return 1; + } + + if (args->ipaddr_intf && (intf_addr = inet_addr(args->ipaddr_intf)) == INADDR_NONE) { + fprintf(stderr, "Invalid IP address '%s'.\n", args->ipaddr_intf); + return 1; + } + + if (args->file_local && strcmp(args->file_local, "-") && access(args->file_local, R_OK) == -1) { + fprintf(stderr, "Error accessing file '%s'.\n", args->file_local); + return 1; + } + + if (args->file_remote) { + if (!tftp_is_valid_filename(args->file_remote)) { + fprintf(stderr, "Invalid remote filename '%s'.\n", + args->file_remote); return 1; } - - ipmask.s_addr = inet_addr(args->ipmask); - if (ipmask.s_addr == INADDR_NONE - || netmask(bitcount(ipmask.s_addr)) != ipmask.s_addr) { - fprintf(stderr, "Invalid subnet mask '%s'.\n", args->ipmask); - return 1; - } - - if (!args->ipaddr) { - autoip = true; - args->ipaddr = NMRP_DEFAULT_IP_REMOTE; - - if (!args->ipaddr_intf) { - args->ipaddr_intf = NMRP_DEFAULT_IP_LOCAL; - } - } else if (args->ipaddr_intf) { - autoip = true; - } else { - autoip = false; - } - - if ((ipaddr.s_addr = inet_addr(args->ipaddr)) == INADDR_NONE) { - fprintf(stderr, "Invalid IP address '%s'.\n", args->ipaddr); - return 1; - } - - if (args->ipaddr_intf && (intf_addr = inet_addr(args->ipaddr_intf)) == INADDR_NONE) { - fprintf(stderr, "Invalid IP address '%s'.\n", args->ipaddr_intf); - return 1; - } - - if (args->file_local && strcmp(args->file_local, "-") && access(args->file_local, R_OK) == -1) { - fprintf(stderr, "Error accessing file '%s'.\n", args->file_local); - return 1; - } - - if (args->file_remote) { - if (!tftp_is_valid_filename(args->file_remote)) { - fprintf(stderr, "Invalid remote filename '%s'.\n", - args->file_remote); - return 1; - } - } } if (args->region) { @@ -457,10 +459,6 @@ int nmrp_do(struct nmrpd_args *args) region = 0; } - if (args->op == NMRP_SET_REGION && !region) { - fprintf(stderr, "No region code specified.\n"); - } - status = 1; sock = ethsock_create(args->intf, ETH_P_NMRP); @@ -500,24 +498,22 @@ int nmrp_do(struct nmrpd_args *args) } } - if (args->op != NMRP_SET_REGION) { - if (!autoip) { - status = is_valid_ip(sock, &ipaddr, &ipmask); - if (status <= 0) { - if (!status) { - fprintf(stderr, "Address %s/%s cannot be used on interface %s.\n", - args->ipaddr, args->ipmask, args->intf); - } - goto out; - } - } else { - if (verbosity) { - printf("Adding %s to interface %s.\n", args->ipaddr_intf, args->intf); + if (!autoip) { + status = is_valid_ip(sock, &ipaddr, &ipmask); + if (status <= 0) { + if (!status) { + fprintf(stderr, "Address %s/%s cannot be used on interface %s.\n", + args->ipaddr, args->ipmask, args->intf); } + goto out; + } + } else { + if (verbosity) { + printf("Adding %s to interface %s.\n", args->ipaddr_intf, args->intf); + } - if (ethsock_ip_add(sock, intf_addr, ipmask.s_addr, &ip_undo) != 0) { - goto out; - } + if (ethsock_ip_add(sock, intf_addr, ipmask.s_addr, &ip_undo) != 0) { + goto out; } } @@ -616,28 +612,17 @@ int nmrp_do(struct nmrpd_args *args) status = 1; goto out; case NMRP_C_CONF_REQ: - msg_mkconfack(&tx.msg, ipaddr.s_addr, ipmask.s_addr, region, args->op); + msg_mkconfack(&tx.msg, ipaddr.s_addr, ipmask.s_addr, region); + expect = NMRP_C_TFTP_UL_REQ; if (!args->blind) { printf("Received configuration request from %s.\n", mac_to_str(rx.eh.ether_shost)); } - printf("Sending configuration:"); + printf("Sending configuration: %s/%d.\n", + args->ipaddr, bitcount(ipmask.s_addr)); - if (args->op == NMRP_SET_REGION) { - expect = NMRP_C_CLOSE_REQ; - } else { - printf(" %s/%d", args->ipaddr, bitcount(ipmask.s_addr)); - // no support for NMRP_UPLOAD_ST - expect = NMRP_C_TFTP_UL_REQ; - } - - if (region) { - printf(" region %s", args->region); - } - - printf(".\n"); break; case NMRP_C_TFTP_UL_REQ: if (!upload_ok) { diff --git a/nmrpd.h b/nmrpd.h index 675a92a..f3ae224 100644 --- a/nmrpd.h +++ b/nmrpd.h @@ -70,6 +70,8 @@ #define PACKED __attribute__((packed)) #endif +#define NMRPFLASH_SET_REGION + #define NMRP_DEFAULT_UL_TIMEOUT_S (30 * 60) #define NMRP_DEFAULT_RX_TIMEOUT_MS (10000) /*