Change parse_ip()

This commit is contained in:
René van Dorst
2026-08-25 07:54:15 +02:00
parent 73df006d39
commit 3eb2dfe0c9
+41 -29
View File
@@ -283,33 +283,43 @@ __bit cmd_is_space(uint8_t idx) {
return cmd_buffer[idx] == ' '; return cmd_buffer[idx] == ' ';
} }
// returns 0 when on parser error or invalid value or no space.
int8_t parse_ip(uint8_t idx) // return non-zero number of bytes consumed including the space.
// Stops at a space or NULL.
uint8_t parse_ip(uint8_t idx)
{ {
uint8_t b = 0; uint8_t b = 0;
uint8_t ret; uint8_t ret;
uint8_t idx_start = idx;
while(1) { while(1) {
ret = atoi_byte(idx); ret = atoi_byte(idx);
if (ret == 0) { if (ret == 0)
goto err; goto err;
}
idx += ret; idx += ret;
ip[b++] = atoi_results_u8; ip[b++] = atoi_results_u8;
ret = cmd_buffer[idx];
if (b == 4) { if (b == 4) {
break; if (ret == ' ') {
} idx++;
break;
if (cmd_buffer[idx++] != '.') { }
if (ret == '\0')
break;
goto err; goto err;
} }
idx++;
if (ret != '.')
goto err;
} }
return 0; return idx - idx_start;
err: err:
print_string("Error in IP format\n"); print_string("Error in IP format\n");
return -1; return 0;
} }
@@ -1388,7 +1398,7 @@ void parse_syslog(void)
itoa(syslog_state.server_ip[0]); write_char('.'); itoa(syslog_state.server_ip[1]); write_char('.'); itoa(syslog_state.server_ip[0]); write_char('.'); itoa(syslog_state.server_ip[1]); write_char('.');
itoa(syslog_state.server_ip[2]); write_char('.'); itoa(syslog_state.server_ip[3]); itoa(syslog_state.server_ip[2]); write_char('.'); itoa(syslog_state.server_ip[3]);
return; return;
} else if (!parse_ip(cmd_words_b[2])) { } else if (parse_ip(cmd_words_b[2]) != 0) {
uint8_t was_enabled = syslog_state.enabled; uint8_t was_enabled = syslog_state.enabled;
if (was_enabled) if (was_enabled)
syslog_stop(); syslog_stop();
@@ -1568,46 +1578,48 @@ void cmd_parser(void) __banked
} else { } else {
if (dhcp_state.state) if (dhcp_state.state)
dhcp_stop(); dhcp_stop();
if (!parse_ip(cmd_words_b[1])) { if (parse_ip(cmd_words_b[1]) != 0) {
uip_ipaddr(&uip_hostaddr, ip[0], ip[1], ip[2], ip[3]); uip_ipaddr(&uip_hostaddr, ip[0], ip[1], ip[2], ip[3]);
print_string("Setting ip: "); print_string("Setting ip: ");
itoa(ip[0]); write_char('.'); itoa(ip[1]); write_char('.'); itoa(ip[0]); write_char('.'); itoa(ip[1]); write_char('.');
itoa(ip[2]); write_char('.'); itoa(ip[3]); write_char('\n'); itoa(ip[2]); write_char('.'); itoa(ip[3]); write_char('\n');
} else { } else {
print_string("Invalid IP address\n"); print_string("Invalid IP address\n" \
print_string("Error: ip [<ip-address>|dhcp]\n"); "Error: ip [<ip-address>|dhcp]\n" \
print_string(" The dhcp option enables the dhcp client, calling ip without options prints the current IP\n"); " The dhcp option enables the dhcp client, calling ip without options prints the current IP\n" \
print_string(" Calling with a valid IP address will stop any ongoing dhcp client and set the IP address\n"); " Calling with a valid IP address will stop any ongoing dhcp client and set the IP address\n");
} }
} }
} else if (cmd_compare(0, "gw")) { } else if (cmd_compare(0, "gw")) {
if (cmd_words_len == 1) { if (cmd_words_len == 1) {
print_string("Current gw: "); print_string("Current gw: ");
itoa(uip_draddr[0]); write_char('.'); itoa(uip_draddr[0] >> 8); write_char('.'); itoa(uip_draddr[0]); write_char('.'); itoa(uip_draddr[0] >> 8); write_char('.');
itoa(uip_draddr[1]); write_char('.'); itoa(uip_draddr[1] >> 8); itoa(uip_draddr[1]); write_char('.'); itoa(uip_draddr[1] >> 8); write_char('\n');
} else { } else {
if (!parse_ip(cmd_words_b[1])) if (parse_ip(cmd_words_b[1]) != 0) {
uip_ipaddr(&uip_draddr, ip[0], ip[1], ip[2], ip[3]); uip_ipaddr(&uip_draddr, ip[0], ip[1], ip[2], ip[3]);
else print_string("Setting gw: ");
print_string("Invalid IP address\n"); itoa(ip[0]); write_char('.'); itoa(ip[1]); write_char('.');
print_string("Setting gw: "); itoa(ip[2]); write_char('.'); itoa(ip[3]); write_char('\n');
itoa(ip[0]); write_char('.'); itoa(ip[1]); write_char('.'); } else {
itoa(ip[2]); write_char('.'); itoa(ip[3]); print_string("Invalid IP address\n" \
"Error: gw <ip-address>\n");
}
} }
write_char('\n');
} else if (cmd_compare(0, "netmask")) { } else if (cmd_compare(0, "netmask")) {
if (cmd_words_len == 1) { if (cmd_words_len == 1) {
print_string("Current netmask: "); print_string("Current netmask: ");
itoa(uip_netmask[0]); write_char('.'); itoa(uip_netmask[0] >> 8); write_char('.'); itoa(uip_netmask[0]); write_char('.'); itoa(uip_netmask[0] >> 8); write_char('.');
itoa(uip_netmask[1]); write_char('.'); itoa(uip_netmask[1] >> 8); itoa(uip_netmask[1]); write_char('.'); itoa(uip_netmask[1] >> 8);
} else { } else {
if (!parse_ip(cmd_words_b[1])) if (parse_ip(cmd_words_b[1]) != 0) {
uip_ipaddr(&uip_netmask, ip[0], ip[1], ip[2], ip[3]); uip_ipaddr(&uip_netmask, ip[0], ip[1], ip[2], ip[3]);
else print_string("Setting netmask: ");
itoa(ip[0]); write_char('.'); itoa(ip[1]); write_char('.');
itoa(ip[2]); write_char('.'); itoa(ip[3]);
} else {
print_string("Invalid IP address\n"); print_string("Invalid IP address\n");
print_string("Setting netmask: "); }
itoa(ip[0]); write_char('.'); itoa(ip[1]); write_char('.');
itoa(ip[2]); write_char('.'); itoa(ip[3]);
} }
write_char('\n'); write_char('\n');
} else if (cmd_compare(0, "l2")) { } else if (cmd_compare(0, "l2")) {