From 56277ce21639a1e3ed608e73d67367d2b21c1764 Mon Sep 17 00:00:00 2001 From: Peter Lawrence <12226419+majbthrd@users.noreply.github.com> Date: Wed, 14 Oct 2020 20:26:40 -0500 Subject: [PATCH] net_lwip_webserver: efficiency tweaks --- .../device/net_lwip_webserver/src/lwipopts.h | 4 +- examples/device/net_lwip_webserver/src/main.c | 21 +++++---- lib/networking/dhserver.c | 43 ++++++++++--------- lib/networking/dhserver.h | 7 ++- 4 files changed, 38 insertions(+), 37 deletions(-) diff --git a/examples/device/net_lwip_webserver/src/lwipopts.h b/examples/device/net_lwip_webserver/src/lwipopts.h index 23319592d..5a8096f50 100644 --- a/examples/device/net_lwip_webserver/src/lwipopts.h +++ b/examples/device/net_lwip_webserver/src/lwipopts.h @@ -35,7 +35,7 @@ /* Prevent having to link sys_arch.c (we don't test the API layers in unit tests) */ #define NO_SYS 1 #define MEM_ALIGNMENT 4 -#define LWIP_RAW 1 +#define LWIP_RAW 0 #define LWIP_NETCONN 0 #define LWIP_SOCKET 0 #define LWIP_DHCP 0 @@ -54,4 +54,6 @@ #define LWIP_HTTPD_SSI 0 #define LWIP_HTTPD_SSI_INCLUDE_TAG 0 +#define LWIP_SINGLE_NETIF 1 + #endif /* __LWIPOPTS_H__ */ diff --git a/examples/device/net_lwip_webserver/src/main.c b/examples/device/net_lwip_webserver/src/main.c index 508f57857..020f4e4d6 100644 --- a/examples/device/net_lwip_webserver/src/main.c +++ b/examples/device/net_lwip_webserver/src/main.c @@ -71,22 +71,21 @@ static const ip_addr_t gateway = IPADDR4_INIT_BYTES(0, 0, 0, 0); /* database IP addresses that can be offered to the host; this must be in RAM to store assigned MAC addresses */ static dhcp_entry_t entries[] = { - /* mac ip address subnet mask lease time */ - { {0}, {192, 168, 7, 2}, {255, 255, 255, 0}, 24 * 60 * 60 }, - { {0}, {192, 168, 7, 3}, {255, 255, 255, 0}, 24 * 60 * 60 }, - { {0}, {192, 168, 7, 4}, {255, 255, 255, 0}, 24 * 60 * 60 } + /* mac ip address lease time */ + { {0}, IPADDR4_INIT_BYTES(192, 168, 7, 2), 24 * 60 * 60 }, + { {0}, IPADDR4_INIT_BYTES(192, 168, 7, 3), 24 * 60 * 60 }, + { {0}, IPADDR4_INIT_BYTES(192, 168, 7, 4), 24 * 60 * 60 }, }; -/* DHCP configuration parameters, leveraging "entries" above */ static const dhcp_config_t dhcp_config = { - {192, 168, 7, 1}, 67, /* server address (self), port */ - {192, 168, 7, 1}, /* dns server (self) */ - "usb", /* dns suffix */ - TU_ARRAY_SIZE(entries), /* number of entries */ - entries /* pointer to entries */ + .router = IPADDR4_INIT_BYTES(0, 0, 0, 0), /* router address (if any) */ + .port = 67, /* listen port */ + .dns = IPADDR4_INIT_BYTES(192, 168, 7, 1), /* dns server (if any) */ + "usb", /* dns suffix */ + TU_ARRAY_SIZE(entries), /* num entry */ + entries /* entries */ }; - static err_t linkoutput_fn(struct netif *netif, struct pbuf *p) { (void)netif; diff --git a/lib/networking/dhserver.c b/lib/networking/dhserver.c index a1a570f93..9287858ea 100644 --- a/lib/networking/dhserver.c +++ b/lib/networking/dhserver.c @@ -96,23 +96,23 @@ static const dhcp_config_t *config = NULL; char magic_cookie[] = {0x63,0x82,0x53,0x63}; -static uint32_t get_ip(const uint8_t *pnt) +static ip_addr_t get_ip(const uint8_t *pnt) { - uint32_t result; + ip_addr_t result; memcpy(&result, pnt, sizeof(result)); return result; } -static void set_ip(uint8_t *pnt, uint32_t value) +static void set_ip(uint8_t *pnt, ip_addr_t value) { - memcpy(pnt, &value, sizeof(value)); + memcpy(pnt, &value.addr, sizeof(value.addr)); } -static dhcp_entry_t *entry_by_ip(uint32_t ip) +static dhcp_entry_t *entry_by_ip(ip_addr_t ip) { int i; for (i = 0; i < config->num_entry; i++) - if (get_ip(config->entries[i].addr) == ip) + if (config->entries[i].addr.addr == ip.addr) return &config->entries[i]; return NULL; } @@ -162,11 +162,11 @@ uint8_t *find_dhcp_option(uint8_t *attrs, int size, uint8_t attr) int fill_options(void *dest, uint8_t msg_type, const char *domain, - uint32_t dns, + ip_addr_t dns, int lease_time, - uint32_t serverid, - uint32_t router, - uint32_t subnet) + ip_addr_t serverid, + ip_addr_t router, + ip_addr_t subnet) { uint8_t *ptr = (uint8_t *)dest; /* ACK message type */ @@ -195,7 +195,7 @@ int fill_options(void *dest, ptr += 4; /* router */ - if (router != 0) + if (router.addr != 0) { *ptr++ = DHCP_ROUTER; *ptr++ = 4; @@ -214,7 +214,7 @@ int fill_options(void *dest, } /* domain name server (DNS) */ - if (dns != 0) + if (dns.addr != 0) { *ptr++ = DHCP_DNSSERVER; *ptr++ = 4; @@ -232,6 +232,7 @@ static void udp_recv_proc(void *arg, struct udp_pcb *upcb, struct pbuf *p, const uint8_t *ptr; dhcp_entry_t *entry; struct pbuf *pp; + struct netif *netif = netif_get_by_index(p->if_idx); (void)arg; (void)addr; @@ -249,7 +250,7 @@ static void udp_recv_proc(void *arg, struct udp_pcb *upcb, struct pbuf *p, const dhcp_data.dp_op = 2; /* reply */ dhcp_data.dp_secs = 0; dhcp_data.dp_flags = 0; - set_ip(dhcp_data.dp_yiaddr, get_ip(entry->addr)); + set_ip(dhcp_data.dp_yiaddr, entry->addr); memcpy(dhcp_data.dp_magic, magic_cookie, 4); memset(dhcp_data.dp_options, 0, sizeof(dhcp_data.dp_options)); @@ -257,11 +258,11 @@ static void udp_recv_proc(void *arg, struct udp_pcb *upcb, struct pbuf *p, const fill_options(dhcp_data.dp_options, DHCP_OFFER, config->domain, - get_ip(config->dns), + config->dns, entry->lease, - get_ip(config->addr), - get_ip(config->addr), - get_ip(entry->subnet)); + *netif_ip4_addr(netif), + config->router, + *netif_ip4_netmask(netif)); pp = pbuf_alloc(PBUF_TRANSPORT, sizeof(dhcp_data), PBUF_POOL); if (pp == NULL) break; @@ -299,11 +300,11 @@ static void udp_recv_proc(void *arg, struct udp_pcb *upcb, struct pbuf *p, const fill_options(dhcp_data.dp_options, DHCP_ACK, config->domain, - get_ip(config->dns), + config->dns, entry->lease, - get_ip(config->addr), - get_ip(config->addr), - get_ip(entry->subnet)); + *netif_ip4_addr(netif), + config->router, + *netif_ip4_netmask(netif)); /* 6. send ACK */ pp = pbuf_alloc(PBUF_TRANSPORT, sizeof(dhcp_data), PBUF_POOL); diff --git a/lib/networking/dhserver.h b/lib/networking/dhserver.h index 901f6e351..0d22461c7 100644 --- a/lib/networking/dhserver.h +++ b/lib/networking/dhserver.h @@ -42,16 +42,15 @@ typedef struct dhcp_entry { uint8_t mac[6]; - uint8_t addr[4]; - uint8_t subnet[4]; + ip_addr_t addr; uint32_t lease; } dhcp_entry_t; typedef struct dhcp_config { - uint8_t addr[4]; + ip_addr_t router; uint16_t port; - uint8_t dns[4]; + ip_addr_t dns; const char *domain; int num_entry; dhcp_entry_t *entries;