11 #include "net80211/ieee80211_var.h" 37 #define DHCPS_LEASE_TIME_DEF (120) 55 pdhcps_node = pinsert->
pnode;
56 pdhcps_pool = plist->
pnode;
66 plist->
pnext = pinsert;
73 plist->
pnext = pinsert;
94 if (plist == pdelete){
95 *phead = plist->
pnext;
97 while (plist !=
NULL) {
98 if (plist->
pnext == pdelete){
101 plist = plist->
pnext;
139 #ifdef USE_CLASS_B_NET 289 err_t SendOffer_err_t;
303 os_printf(
"dhcps: send_offer>>pbuf_alloc succeed\n");
310 for(i=0; i<q->
len; i++)
312 data[i] = ((
u8_t *) m)[cnt++];
326 os_printf(
"dhcps: send_offer>>pbuf_alloc failed\n");
332 os_printf(
"dhcps: send_offer>>udp_sendto result %x\n",SendOffer_err_t);
336 os_printf(
"udhcp: send_offer>>free pbuf\n");
369 os_printf(
"dhcps: send_nak>>pbuf_alloc succeed\n");
376 for(i=0; i<q->
len; i++)
378 data[i] = ((
u8_t *) m)[cnt++];
392 os_printf(
"dhcps: send_nak>>pbuf_alloc failed\n");
398 os_printf(
"dhcps: send_nak>>udp_sendto result %x\n",SendNak_err_t);
402 os_printf(
"udhcp: send_nak>>free pbuf\n");
436 os_printf(
"dhcps: send_ack>>pbuf_alloc succeed\n");
443 for(i=0; i<q->
len; i++)
445 data[i] = ((
u8_t *) m)[cnt++];
459 os_printf(
"dhcps: send_ack>>pbuf_alloc failed\n");
465 os_printf(
"dhcps: send_ack>>udp_sendto result %x\n",SendAck_err_t);
470 os_printf(
"udhcp: send_ack>>free pbuf\n");
488 bool is_dhcp_parse_end =
false;
493 u8_t *end = optptr + len;
498 while (optptr < end) {
505 type = *(optptr + 2);
509 if(
os_memcmp( (
char *) &client.
addr, (
char *) optptr+2,4)==0 ) {
511 os_printf(
"dhcps: DHCP_OPTION_REQ_IPADDR = 0 ok\n");
516 os_printf(
"dhcps: DHCP_OPTION_REQ_IPADDR != 0 err\n");
523 is_dhcp_parse_end =
true;
528 if(is_dhcp_parse_end){
532 optptr += optptr[1] + 2;
582 sizeof(magic_cookie)) == 0){
627 for (pback_node = plist; pback_node !=
NULL;pback_node = pback_node->
pnext) {
628 pdhcps_pool = pback_node->
pnode;
648 if(first_address.
addr < pdhcps_pool->
ip.
addr) {
670 pnode->
pnode = pdhcps_pool;
691 if (pdhcps_pool !=
NULL) {
708 if (pdhcps_pool !=
NULL) {
753 u16_t dhcps_msg_cnt = 0;
758 os_printf(
"dhcps: handle_dhcp-> receive a packet\n");
763 if (
NULL == pmsg_dhcps){
767 p_dhcps_msg = (
u8_t *)pmsg_dhcps;
772 os_printf(
"dhcps: handle_dhcp-> p->tot_len = %d\n", tlen);
773 os_printf(
"dhcps: handle_dhcp-> p->len = %d\n", p->
len);
776 for(i=0; i<p->
len; i++){
777 p_dhcps_msg[dhcps_msg_cnt++] = data[i];
788 os_printf(
"dhcps: handle_dhcp-> p->next != NULL\n");
795 p_dhcps_msg[dhcps_msg_cnt++] = data[i];
809 os_printf(
"dhcps: handle_dhcp-> parse_msg(p)\n");
812 switch(
parse_msg(pmsg_dhcps, tlen - 240)) {
816 os_printf(
"dhcps: handle_dhcp-> DHCPD_STATE_OFFER\n");
822 os_printf(
"dhcps: handle_dhcp-> DHCPD_STATE_ACK\n");
828 os_printf(
"dhcps: handle_dhcp-> DHCPD_STATE_NAK\n");
836 os_printf(
"dhcps: handle_dhcp-> pbuf_free(p)\n");
845 uint32 softap_ip = 0,local_ip = 0;
850 softap_ip =
htonl(ip);
854 if ((start_ip <= softap_ip) && (softap_ip <= end_ip)) {
859 if (((start_ip >> 8 != softap_ip) || (end_ip >> 8 != softap_ip))
867 local_ip = softap_ip =
htonl(ip);
868 softap_ip &= 0xFFFFFF00;
870 if (local_ip >= 0x80)
890 if(apnetif->dhcps_pcb !=
NULL) {
891 udp_remove(apnetif->dhcps_pcb);
896 os_printf(
"dhcps_start(): could not obtain pcb\n");
904 if (dns_address.
addr == 0) {
914 os_printf(
"dhcps:dhcps_start->udp_recv function Set a receive callback handle_dhcp for UDP_PCB pcb_dhcps\n");
925 if(apnetif->dhcps_pcb !=
NULL) {
926 udp_remove(apnetif->dhcps_pcb);
927 apnetif->dhcps_pcb =
NULL;
934 while (pnode !=
NULL) {
936 pnode = pback_node->
pnext;
976 if ((start_ip <= softap_ip) && (softap_ip <= end_ip))
981 if ((start_ip >> 8 != softap_ip)
982 || (end_ip >> 8 != softap_ip)) {
1050 pdhcps_pool = p->pnode;
1051 pmin_pool = minp->pnode;
1052 if (pdhcps_pool->
lease_timer < pmin_pool->lease_timer){
1068 uint8 num_dhcps_pool = 0;
1073 while (pnode !=
NULL) {
1074 pdhcps_pool = pnode->
pnode;
1078 pnode = pback_node->
pnext;
1085 pnode = pnode ->
pnext;
1096 bool offer_flag =
true;
1101 if (level <= OFFER_START || level >=
OFFER_END)
1164 for (pback_node = plist; pback_node !=
NULL;pback_node = pback_node->
pnext, no--) {
1165 if (no == 0)
return pback_node->
pnode;
1181 pnode->
pnode = pdhcps_pool;
#define DHCPS_SERVER_PORT
bool ICACHE_FLASH_ATTR wifi_softap_reset_dhcps_lease_time(void)
static uint8_t *ICACHE_FLASH_ATTR add_offer_options(uint8_t *optptr)
void ICACHE_FLASH_ATTR dhcps_set_DNS(struct ip_addr *dns_ip)
#define DHCP_OPTION_REQ_IPADDR
static void ICACHE_FLASH_ATTR wifi_softap_init_dhcps_lease(uint32 ip)
void ICACHE_FLASH_ATTR dhcps_set_mapping(struct ip_addr *addr, uint8 *mac, uint32 lease_time)
void ICACHE_FLASH_ATTR node_insert_to_list(list_node **phead, list_node *pinsert)
static uint8_t *ICACHE_FLASH_ATTR add_msg_type(uint8_t *optptr, uint8_t type)
static sint16_t ICACHE_FLASH_ATTR parse_msg(struct dhcps_msg *m, u16_t len)
#define DHCPS_STATE_RELEASE
uint32 system_get_free_heap_size(void)
static struct ip_addr broadcast_dhcps
static void ICACHE_FLASH_ATTR send_offer(struct dhcps_msg *m)
static uint8_t ICACHE_FLASH_ATTR parse_options(uint8_t *optptr, sint16_t len)
static void ICACHE_FLASH_ATTR send_ack(struct dhcps_msg *m)
static void ICACHE_FLASH_ATTR send_nak(struct dhcps_msg *m)
static void ICACHE_FLASH_ATTR kill_oldest_dhcps_pool(void)
#define ICACHE_FLASH_ATTR
bool wifi_get_ip_info(uint8 if_index, struct ip_info *info)
#define DHCP_OPTION_MSG_TYPE
#define DHCPS_CLIENT_PORT
struct netif * eagle_lwip_getif(uint8 index)
uint32 ICACHE_FLASH_ATTR wifi_softap_get_dhcps_lease_time(void)
bool ICACHE_FLASH_ATTR wifi_softap_set_dhcps_offer_option(uint8 level, void *optarg)
#define dhcps_router_enabled(offer)
uint8 wifi_get_opmode(void)
#define DHCP_OPTION_PERFORM_ROUTER_DISCOVERY
#define DHCP_OPTION_LEASE_TIME
enum dhcp_status wifi_softap_dhcps_status(void)
#define DHCP_OPTION_INTERFACE_MTU
static void ICACHE_FLASH_ATTR handle_dhcp(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr, uint16_t port)
static struct ip_addr dns_address
struct _list_node * pnext
bool ICACHE_FLASH_ATTR wifi_softap_set_dhcps_lease(struct dhcps_lease *please)
#define DHCPS_STATE_OFFER
static struct ip_addr client_address
#define DHCP_HTYPE_ETHERNET
struct dhcps_pool *ICACHE_FLASH_ATTR dhcps_get_mapping(uint16_t no)
#define ip_addr_isany(addr1)
#define DHCP_OPTION_ROUTER
#define ip4_addr3(ipaddr)
#define DHCP_OPTION_BROADCAST_ADDRESS
void ICACHE_FLASH_ATTR dhcps_start(struct ip_info *info)
#define DHCP_OPTION_DNS_SERVER
u8_t pbuf_free(struct pbuf *p) ICACHE_FLASH_ATTR
#define DHCPS_LEASE_TIME_DEF
void ICACHE_FLASH_ATTR dhcps_stop(void)
void ICACHE_FLASH_ATTR dhcps_coarse_tmr(void)
bool ICACHE_FLASH_ATTR wifi_softap_set_dhcps_lease_time(uint32 minute)
void ICACHE_FLASH_ATTR node_remove_from_list(list_node **phead, list_node *pdelete)
static struct udp_pcb * pcb_dhcps
#define DHCP_OPTION_SUBNET_MASK
bool ICACHE_FLASH_ATTR wifi_softap_get_dhcps_lease(struct dhcps_lease *please)
#define ip4_addr2(ipaddr)
static uint8_t *ICACHE_FLASH_ATTR add_end(uint8_t *optptr)
static void ICACHE_FLASH_ATTR create_msg(struct dhcps_msg *m)
#define ip4_addr4(ipaddr)
#define ip4_addr1(ipaddr)
static struct ip_addr server_address
static const uint32 magic_cookie ICACHE_RODATA_ATTR
static struct ip_addr client_address_plus
struct pbuf * pbuf_alloc(pbuf_layer l, u16_t length, pbuf_type type) ICACHE_FLASH_ATTR
#define DHCP_OPTION_SERVER_ID
#define IP4_ADDR(ipaddr, a, b, c, d)
#define DHCPS_LEASE_TIMER