Revert "Allow changing the region without uploading a firmware file"

This reverts commit 6838a3a546.
This commit is contained in:
Joseph C. Lehner 2024-01-11 12:23:56 +01:00
parent 6838a3a546
commit 5138c9f09a
4 changed files with 86 additions and 109 deletions

View file

@ -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;

30
main.c
View file

@ -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 <ipaddr> IP address to assign to target device [%s]\n"
" -A <ipaddr> 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> Timeout (in milliseconds) for NMRP packets [%d ms]\n"
" -T <timeout> Time (seconds) to wait after successfull TFTP upload [%d s]\n"
" -p <port> Port to use for TFTP upload [%d]\n"
" -R <region> Set device region (BZ, GR, IN, JP, KO, NA, PR, RU, WW)\n"
#ifdef NMRPFLASH_SET_REGION
" -R <region> Set device region (NA, WW, GR, PR, RU, BZ, IN, KO, JP)\n"
#endif
" -S <n> Skip <n> 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) {

161
nmrp.c
View file

@ -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, &region, 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) {

View file

@ -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)
/*