Refactoring

This commit is contained in:
Joseph C. Lehner 2016-01-24 19:09:19 +01:00
parent 185d1f7e13
commit 5f3e50cb54

108
nmrpd.c
View file

@ -155,7 +155,8 @@ static void msg_dump(struct nmrp_msg *msg)
} }
} }
static int get_intf_info(int fd, const char *name, int *index, uint8_t *hwaddr) static int intf_get_index_and_addr(int fd, const char *name, int *index,
uint8_t *hwaddr)
{ {
struct ifreq ifr; struct ifreq ifr;
@ -228,7 +229,7 @@ static int pkt_recv(int fd, struct nmrp_pkt *pkt)
return 1; return 1;
} }
static int sock_bind(int fd, const char *name) static int sock_bind_to_intf(int fd, const char *name)
{ {
struct ifreq ifr; struct ifreq ifr;
@ -259,9 +260,8 @@ static const char *spinner = "\\|/-";
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
struct nmrp_pkt pkt, rx; struct nmrp_pkt tx, rx;
struct sockaddr_ll addr; struct sockaddr_ll addr;
struct in_addr ipaddr;
uint8_t hwaddr[ETH_ALEN]; uint8_t hwaddr[ETH_ALEN];
int i, fd, err, ulreqs, expect; int i, fd, err, ulreqs, expect;
@ -273,11 +273,11 @@ int main(int argc, char **argv)
return 1; return 1;
} }
if (get_intf_info(fd, arg_intf, &addr.sll_ifindex, hwaddr)) { if (intf_get_index_and_addr(fd, arg_intf, &addr.sll_ifindex, hwaddr)) {
return 1; return 1;
} }
if (sock_bind(fd, arg_intf)) { if (sock_bind_to_intf(fd, arg_intf)) {
return 1; return 1;
} }
@ -292,23 +292,23 @@ int main(int argc, char **argv)
addr.sll_halen = ETH_ALEN; addr.sll_halen = ETH_ALEN;
memcpy(addr.sll_addr, target, ETH_ALEN); memcpy(addr.sll_addr, target, ETH_ALEN);
memcpy(pkt.eh.ether_shost, hwaddr, ETH_ALEN); memcpy(tx.eh.ether_shost, hwaddr, ETH_ALEN);
memcpy(pkt.eh.ether_dhost, target, ETH_ALEN); memcpy(tx.eh.ether_dhost, target, ETH_ALEN);
pkt.eh.ether_type = htons(ETH_P_NMRP); tx.eh.ether_type = htons(ETH_P_NMRP);
pkt.msg.reserved = 0; tx.msg.reserved = 0;
pkt.msg.code = NMRP_C_ADVERTISE; tx.msg.code = NMRP_C_ADVERTISE;
pkt.msg.id = 0; tx.msg.id = 0;
pkt.msg.num_opts = 1; tx.msg.num_opts = 1;
pkt.msg.opts[0].type = NMRP_O_MAGIC_NO; tx.msg.opts[0].type = NMRP_O_MAGIC_NO;
pkt.msg.opts[0].len = NMRP_OPT_LEN + 4; tx.msg.opts[0].len = NMRP_OPT_LEN + 4;
pkt.msg.opts[0].val.magic[0] = 'N'; tx.msg.opts[0].val.magic[0] = 'N';
pkt.msg.opts[0].val.magic[1] = 'T'; tx.msg.opts[0].val.magic[1] = 'T';
pkt.msg.opts[0].val.magic[2] = 'G'; tx.msg.opts[0].val.magic[2] = 'G';
pkt.msg.opts[0].val.magic[3] = 'R'; tx.msg.opts[0].val.magic[3] = 'R';
msg_update_len(&pkt.msg); msg_update_len(&tx.msg);
msg_hton(&pkt.msg); msg_hton(&tx.msg);
i = 0; i = 0;
@ -317,7 +317,7 @@ int main(int argc, char **argv)
fflush(stdout); fflush(stdout);
i = (i + 1) & 3; i = (i + 1) & 3;
if (pkt_send(fd, &addr, &pkt) < 0) { if (pkt_send(fd, &addr, &tx) < 0) {
perror("sendto"); perror("sendto");
goto out; goto out;
} }
@ -337,29 +337,34 @@ int main(int argc, char **argv)
ulreqs = 0; ulreqs = 0;
do { do {
if (rx.msg.code == expect || IS_OOO_CODE(rx.msg.code)) { if (expect != NMRP_C_NONE && rx.msg.code != expect) {
pkt.msg.reserved = 0; fprintf(stderr, "Received code 0x%02x while waiting for 0x%02x!\n",
pkt.msg.id = 0; rx.msg.code, expect);
pkt.msg.num_opts = 0; }
pkt.msg.len = 0;
tx.msg.code = NMRP_C_NONE;
tx.msg.reserved = 0;
tx.msg.id = 0;
tx.msg.num_opts = 0;
tx.msg.len = 0;
err = 1; err = 1;
switch (rx.msg.code) { switch (rx.msg.code) {
case NMRP_C_CONF_REQ: case NMRP_C_CONF_REQ:
pkt.msg.code = NMRP_C_CONF_ACK; tx.msg.code = NMRP_C_CONF_ACK;
pkt.msg.num_opts = 2; tx.msg.num_opts = 2;
pkt.msg.opts[0].type = NMRP_O_DEV_IP; tx.msg.opts[0].type = NMRP_O_DEV_IP;
pkt.msg.opts[0].len = NMRP_OPT_LEN + 2 * IP_LEN; tx.msg.opts[0].len = NMRP_OPT_LEN + 2 * IP_LEN;
inet_aton(arg_ipaddr, &ipaddr); inet_aton(arg_ipaddr,
memcpy(pkt.msg.opts[0].val.ip.addr, &ipaddr, IP_LEN); (struct in_addr*)tx.msg.opts[0].val.ip.addr);
inet_aton(arg_ipmask, &ipaddr); inet_aton(arg_ipmask,
memcpy(pkt.msg.opts[0].val.ip.mask, &ipaddr, IP_LEN); (struct in_addr*)tx.msg.opts[0].val.ip.mask);
pkt.msg.opts[1].type = NMRP_O_FW_UP; tx.msg.opts[1].type = NMRP_O_FW_UP;
pkt.msg.opts[1].len = NMRP_OPT_LEN; tx.msg.opts[1].len = NMRP_OPT_LEN;
expect = NMRP_C_TFTP_UL_REQ; expect = NMRP_C_TFTP_UL_REQ;
@ -368,7 +373,7 @@ int main(int argc, char **argv)
rx.eh.ether_shost[0], rx.eh.ether_shost[1], rx.eh.ether_shost[0], rx.eh.ether_shost[1],
rx.eh.ether_shost[2], rx.eh.ether_shost[3], rx.eh.ether_shost[2], rx.eh.ether_shost[3],
rx.eh.ether_shost[4], rx.eh.ether_shost[5]); rx.eh.ether_shost[4], rx.eh.ether_shost[5]);
printf("Sending configuration: %s/%s.\n", arg_ipaddr, printf("Sending configuration: ip %s, mask %s.\n", arg_ipaddr,
arg_ipmask); arg_ipmask);
break; break;
@ -376,29 +381,25 @@ int main(int argc, char **argv)
if (++ulreqs > 5) { if (++ulreqs > 5) {
fprintf(stderr, "Device re-requested file upload %d " fprintf(stderr, "Device re-requested file upload %d "
"times; aborting.\n", ulreqs); "times; aborting.\n", ulreqs);
pkt.msg.code = NMRP_C_CLOSE_REQ; tx.msg.code = NMRP_C_CLOSE_REQ;
break; break;
} }
printf("Uploading %s ... ", arg_filename); printf("Uploading %s ... ", arg_filename);
fflush(stdout); fflush(stdout);
err = tftp_put(arg_filename, arg_ipaddr, arg_port); err = tftp_put(arg_filename, arg_ipaddr, arg_port);
if (err && err != -3) { if (!err) {
pkt.msg.code = NMRP_C_NONE;
} else if (!err) {
printf("OK\nWaiting for router to respond.\n"); printf("OK\nWaiting for router to respond.\n");
sock_set_rx_timeout(fd, arg_ul_timeout); sock_set_rx_timeout(fd, arg_ul_timeout);
pkt.msg.code = NMRP_C_NONE;
expect = NMRP_C_CLOSE_REQ; expect = NMRP_C_CLOSE_REQ;
} else { } else if (err != -3) {
goto out; goto out;
} }
break; break;
case NMRP_C_KEEP_ALIVE_REQ: case NMRP_C_KEEP_ALIVE_REQ:
pkt.msg.code = NMRP_C_KEEP_ALIVE_ACK; tx.msg.code = NMRP_C_KEEP_ALIVE_ACK;
break; break;
case NMRP_C_CLOSE_REQ: case NMRP_C_CLOSE_REQ:
pkt.msg.code = NMRP_C_CLOSE_ACK; tx.msg.code = NMRP_C_CLOSE_ACK;
break; break;
case NMRP_C_CLOSE_ACK: case NMRP_C_CLOSE_ACK:
err = 0; err = 0;
@ -408,11 +409,11 @@ int main(int argc, char **argv)
rx.msg.code); rx.msg.code);
} }
if (pkt.msg.code != NMRP_C_NONE) { if (tx.msg.code != NMRP_C_NONE) {
msg_update_len(&pkt.msg); msg_update_len(&tx.msg);
msg_hton(&pkt.msg); msg_hton(&tx.msg);
if (pkt_send(fd, &addr, &pkt) < 0) { if (pkt_send(fd, &addr, &tx) < 0) {
perror("sendto"); perror("sendto");
goto out; goto out;
} }
@ -423,11 +424,6 @@ int main(int argc, char **argv)
break; break;
} }
} else {
fprintf(stderr, "Received code 0x%02x while waiting for 0x%02x!\n",
rx.msg.code, expect);
}
err = pkt_recv(fd, &rx); err = pkt_recv(fd, &rx);
if (err) { if (err) {
if (err == 2) { if (err == 2) {