Don't print messages on fake-packet receipt

This commit is contained in:
Joseph C. Lehner 2020-03-06 18:43:03 +01:00
parent 00505bc516
commit e95526d06c

37
nmrp.c
View file

@ -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, timeout, status, ulreqs, expect, upload_ok, autoip, kareqs; int i, timeout, status, ulreqs, expect, upload_ok, autoip, ka_reqs, fake;
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;
@ -481,6 +481,7 @@ int nmrp_do(struct nmrpd_args *args)
i = 0; i = 0;
upload_ok = 0; upload_ok = 0;
fake = 0;
timeout = args->blind ? 10 : NMRP_INITIAL_TIMEOUT; timeout = args->blind ? 10 : NMRP_INITIAL_TIMEOUT;
beg = time_monotonic(); beg = time_monotonic();
@ -517,7 +518,8 @@ int nmrp_do(struct nmrpd_args *args)
// we're blind, so fake a response from the MAC specified by -m // we're blind, so fake a response from the MAC specified by -m
memcpy(rx.eh.ether_shost, dest, 6); memcpy(rx.eh.ether_shost, dest, 6);
msg_init(&rx.msg, NMRP_C_CONF_REQ); msg_init(&rx.msg, NMRP_C_CONF_REQ);
printf("Faking one."); printf("Continuing blindly.");
fake = 1;
break; break;
} }
} }
@ -534,7 +536,7 @@ int nmrp_do(struct nmrpd_args *args)
expect = NMRP_C_CONF_REQ; expect = NMRP_C_CONF_REQ;
ulreqs = 0; ulreqs = 0;
kareqs = 0; ka_reqs = 0;
while (!g_interrupted) { while (!g_interrupted) {
if (expect != NMRP_C_NONE && rx.msg.code != expect) { if (expect != NMRP_C_NONE && rx.msg.code != expect) {
@ -556,8 +558,10 @@ int nmrp_do(struct nmrpd_args *args)
msg_mkconfack(&tx.msg, ipaddr.s_addr, ipmask.s_addr, region); msg_mkconfack(&tx.msg, ipaddr.s_addr, ipmask.s_addr, region);
expect = NMRP_C_TFTP_UL_REQ; expect = NMRP_C_TFTP_UL_REQ;
if (!fake) {
printf("Received configuration request from %s.\n", printf("Received configuration request from %s.\n",
mac_to_str(rx.eh.ether_shost)); mac_to_str(rx.eh.ether_shost));
}
printf("Sending configuration: %s/%d.\n", printf("Sending configuration: %s/%d.\n",
args->ipaddr, bitcount(ipmask.s_addr)); args->ipaddr, bitcount(ipmask.s_addr));
@ -588,8 +592,10 @@ int nmrp_do(struct nmrpd_args *args)
printf("Received upload request: filename '%s'.\n", filename); printf("Received upload request: filename '%s'.\n", filename);
} else if (!args->file_remote) { } else if (!args->file_remote) {
args->file_remote = leafname(args->file_local); args->file_remote = leafname(args->file_local);
if (!fake) {
printf("Received upload request without filename.\n"); printf("Received upload request without filename.\n");
} }
}
status = 0; status = 0;
@ -653,7 +659,7 @@ int nmrp_do(struct nmrpd_args *args)
case NMRP_C_KEEP_ALIVE_REQ: case NMRP_C_KEEP_ALIVE_REQ:
tx.msg.code = NMRP_C_KEEP_ALIVE_ACK; tx.msg.code = NMRP_C_KEEP_ALIVE_ACK;
ethsock_set_timeout(sock, args->ul_timeout); ethsock_set_timeout(sock, args->ul_timeout);
printf("\rReceived keep-alive request (%d). ", ++kareqs); printf("\rReceived keep-alive request (%d). ", ++ka_reqs);
break; break;
case NMRP_C_CLOSE_REQ: case NMRP_C_CLOSE_REQ:
tx.msg.code = NMRP_C_CLOSE_ACK; tx.msg.code = NMRP_C_CLOSE_ACK;
@ -668,17 +674,13 @@ int nmrp_do(struct nmrpd_args *args)
} }
if (tx.msg.code != NMRP_C_NONE) { if (tx.msg.code != NMRP_C_NONE) {
if (pkt_send(sock, &tx) < 0) { if (pkt_send(sock, &tx) != 0 || tx.msg.code == NMRP_C_CLOSE_REQ) {
goto out;
}
if (tx.msg.code == NMRP_C_CLOSE_REQ) {
goto out; goto out;
} }
} }
if (rx.msg.code == NMRP_C_CLOSE_REQ) { if (rx.msg.code == NMRP_C_CLOSE_REQ) {
if (kareqs) { if (ka_reqs) {
printf("\n"); printf("\n");
} }
@ -689,18 +691,21 @@ int nmrp_do(struct nmrpd_args *args)
status = pkt_recv(sock, &rx); status = pkt_recv(sock, &rx);
if (status) { if (status) {
if (status == 2) { if (status == 2) {
fprintf(stderr, "Timeout while waiting for %s. ", if (!args->blind) {
fprintf(stderr, "Timeout while waiting for %s.\n",
msg_code_str(expect)); msg_code_str(expect));
goto out;
} }
if (!args->blind) { // fake response
printf("\n");
goto out;
} else {
printf("Faking response.\n");
msg_init(&rx.msg, expect); msg_init(&rx.msg, expect);
memcpy(rx.eh.ether_shost, tx.eh.ether_dhost, 6); memcpy(rx.eh.ether_shost, tx.eh.ether_dhost, 6);
fake = 1;
} else {
goto out;
} }
} else {
fake = 0;
} }
ethsock_set_timeout(sock, args->rx_timeout); ethsock_set_timeout(sock, args->rx_timeout);