Add blind mode (-B)
This commit is contained in:
parent
f301e1727e
commit
0ab6b37b9c
3 changed files with 34 additions and 15 deletions
17
main.c
17
main.c
|
@ -33,6 +33,7 @@ void usage(FILE *fp)
|
||||||
"Options (-i, -f and/or -c are mandatory):\n"
|
"Options (-i, -f and/or -c are mandatory):\n"
|
||||||
" -a <ipaddr> IP address to assign to target device\n"
|
" -a <ipaddr> IP address to assign to target device\n"
|
||||||
" -A <ipaddr> IP address to assign to seleted interface\n"
|
" -A <ipaddr> IP address to assign to seleted interface\n"
|
||||||
|
" -B Blind mode (don't wait for NMRP responses)\n"
|
||||||
" -c <command> Command to run before (or instead of) TFTP upload\n"
|
" -c <command> Command to run before (or instead of) TFTP upload\n"
|
||||||
" -f <firmware> Firmware file\n"
|
" -f <firmware> Firmware file\n"
|
||||||
" -F <filename> Remote filename to use during TFTP upload\n"
|
" -F <filename> Remote filename to use during TFTP upload\n"
|
||||||
|
@ -130,7 +131,7 @@ void require_admin()
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int c, val, max;
|
int c, val, max;
|
||||||
int list = 0;
|
bool list = false, have_dest_mac = false;
|
||||||
struct nmrpd_args args = {
|
struct nmrpd_args args = {
|
||||||
.rx_timeout = 200,
|
.rx_timeout = 200,
|
||||||
.ul_timeout = 5 * 60 * 1000,
|
.ul_timeout = 5 * 60 * 1000,
|
||||||
|
@ -145,6 +146,7 @@ int main(int argc, char **argv)
|
||||||
.op = NMRP_UPLOAD_FW,
|
.op = NMRP_UPLOAD_FW,
|
||||||
.port = 69,
|
.port = 69,
|
||||||
.region = NULL,
|
.region = NULL,
|
||||||
|
.blind = false,
|
||||||
};
|
};
|
||||||
#ifdef NMRPFLASH_WINDOWS
|
#ifdef NMRPFLASH_WINDOWS
|
||||||
char *newpath = NULL;
|
char *newpath = NULL;
|
||||||
|
@ -181,7 +183,7 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
opterr = 0;
|
opterr = 0;
|
||||||
|
|
||||||
while ((c = getopt(argc, argv, "a:A:c:f:F:i:m:M:p:R:t:T:hLVvU")) != -1) {
|
while ((c = getopt(argc, argv, "a:A:Bc:f:F:i:m:M:p:R:t:T:hLVvU")) != -1) {
|
||||||
max = 0x7fffffff;
|
max = 0x7fffffff;
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case 'a':
|
case 'a':
|
||||||
|
@ -190,6 +192,9 @@ int main(int argc, char **argv)
|
||||||
case 'A':
|
case 'A':
|
||||||
args.ipaddr_intf = optarg;
|
args.ipaddr_intf = optarg;
|
||||||
break;
|
break;
|
||||||
|
case 'B':
|
||||||
|
args.blind = true;
|
||||||
|
break;
|
||||||
case 'c':
|
case 'c':
|
||||||
args.tftpcmd = optarg;
|
args.tftpcmd = optarg;
|
||||||
break;
|
break;
|
||||||
|
@ -204,6 +209,7 @@ int main(int argc, char **argv)
|
||||||
break;
|
break;
|
||||||
case 'm':
|
case 'm':
|
||||||
args.mac = optarg;
|
args.mac = optarg;
|
||||||
|
have_dest_mac = true;
|
||||||
break;
|
break;
|
||||||
case 'M':
|
case 'M':
|
||||||
args.ipmask = optarg;
|
args.ipmask = optarg;
|
||||||
|
@ -243,7 +249,7 @@ int main(int argc, char **argv)
|
||||||
++verbosity;
|
++verbosity;
|
||||||
break;
|
break;
|
||||||
case 'L':
|
case 'L':
|
||||||
list = 1;
|
list = true;
|
||||||
break;
|
break;
|
||||||
case 'h':
|
case 'h':
|
||||||
usage(stdout);
|
usage(stdout);
|
||||||
|
@ -269,6 +275,11 @@ int main(int argc, char **argv)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (args.blind && !have_dest_mac) {
|
||||||
|
fprintf(stderr, "Error: use of -B requires -m <mac>.\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef NMRPFLASH_FUZZ
|
#ifndef NMRPFLASH_FUZZ
|
||||||
if (!list && ((!args.file_local && !args.tftpcmd) || !args.intf)) {
|
if (!list && ((!args.file_local && !args.tftpcmd) || !args.intf)) {
|
||||||
usage(stderr);
|
usage(stderr);
|
||||||
|
|
31
nmrp.c
31
nmrp.c
|
@ -356,7 +356,7 @@ int nmrp_do(struct nmrpd_args *args)
|
||||||
uint16_t region;
|
uint16_t region;
|
||||||
char *filename;
|
char *filename;
|
||||||
time_t beg;
|
time_t beg;
|
||||||
int i, status, ulreqs, expect, upload_ok, autoip, kareqs;
|
int i, timeout, status, ulreqs, expect, upload_ok, autoip, kareqs;
|
||||||
struct ethsock *sock;
|
struct ethsock *sock;
|
||||||
struct ethsock_ip_undo *ip_undo = NULL;
|
struct ethsock_ip_undo *ip_undo = NULL;
|
||||||
struct ethsock_arp_undo *arp_undo = NULL;
|
struct ethsock_arp_undo *arp_undo = NULL;
|
||||||
|
@ -472,9 +472,11 @@ int nmrp_do(struct nmrpd_args *args)
|
||||||
memcpy(tx.eh.ether_dhost, dest, 6);
|
memcpy(tx.eh.ether_dhost, dest, 6);
|
||||||
tx.eh.ether_type = htons(ETH_P_NMRP);
|
tx.eh.ether_type = htons(ETH_P_NMRP);
|
||||||
|
|
||||||
|
msg_mkadvertise(&tx.msg, "NTGR");
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
upload_ok = 0;
|
upload_ok = 0;
|
||||||
|
timeout = args->blind ? 10 : NMRP_INITIAL_TIMEOUT;
|
||||||
beg = time_monotonic();
|
beg = time_monotonic();
|
||||||
|
|
||||||
while (!g_interrupted) {
|
while (!g_interrupted) {
|
||||||
|
@ -483,12 +485,6 @@ int nmrp_do(struct nmrpd_args *args)
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
i = (i + 1) & 3;
|
i = (i + 1) & 3;
|
||||||
|
|
||||||
msg_mkadvertise(&tx.msg, "NTGR");
|
|
||||||
if (pkt_send(sock, &tx) < 0) {
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
msg_mkconfack(&tx.msg, ipaddr.s_addr, ipmask.s_addr, region);
|
|
||||||
if (pkt_send(sock, &tx) < 0) {
|
if (pkt_send(sock, &tx) < 0) {
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
@ -507,14 +503,19 @@ int nmrp_do(struct nmrpd_args *args)
|
||||||
} else {
|
} else {
|
||||||
/* because we don't want nmrpflash's exit status to be zero */
|
/* because we don't want nmrpflash's exit status to be zero */
|
||||||
status = 1;
|
status = 1;
|
||||||
if ((time_monotonic() - beg) >= NMRP_INITIAL_TIMEOUT) {
|
if ((time_monotonic() - beg) >= timeout) {
|
||||||
printf("\nNo response after 60 seconds. Bailing out.\n");
|
printf("\nNo response after %d seconds. ", timeout);
|
||||||
goto out;
|
if (!args->blind) {
|
||||||
|
printf("Bailing out.\n");
|
||||||
|
goto out;
|
||||||
|
} else {
|
||||||
|
printf("Continuing blindly.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
memcpy(tx.eh.ether_dhost, rx.eh.ether_shost, 6);
|
memcpy(tx.eh.ether_dhost, rx.eh.ether_shost, 6);
|
||||||
|
@ -679,7 +680,13 @@ int nmrp_do(struct nmrpd_args *args)
|
||||||
fprintf(stderr, "Timeout while waiting for %s.\n",
|
fprintf(stderr, "Timeout while waiting for %s.\n",
|
||||||
msg_code_str(expect));
|
msg_code_str(expect));
|
||||||
}
|
}
|
||||||
goto out;
|
|
||||||
|
if (!args->blind) {
|
||||||
|
goto out;
|
||||||
|
} else {
|
||||||
|
// fake a response
|
||||||
|
msg_init(&rx.msg, expect);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ethsock_set_timeout(sock, args->rx_timeout);
|
ethsock_set_timeout(sock, args->rx_timeout);
|
||||||
|
|
1
nmrpd.h
1
nmrpd.h
|
@ -92,6 +92,7 @@ struct nmrpd_args {
|
||||||
const char *intf;
|
const char *intf;
|
||||||
const char *mac;
|
const char *mac;
|
||||||
enum nmrp_op op;
|
enum nmrp_op op;
|
||||||
|
bool blind;
|
||||||
uint16_t port;
|
uint16_t port;
|
||||||
const char *region;
|
const char *region;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Reference in a new issue