Hi there!
Im having some troubles implementing a DHCP server on a microcontroller.
System Overview: -Webserver (RL-ARM) running on MCBSTM32E -MCBSTM32E connected over UART with a WLAN module (SLIP). -WLAN module creates an ad-hoc network -Laptop is connected to WLAN module
First, I did get the DHCP server running on the MCBSTM32C development board which has an ethernet interface.
Then I tried to port the DHCP server to the MCBSTM32E. I receive the incoming DHCP_DISCOVER messages and the microcontroller seems to send the SLIP packets but I can't see any incoming UDP data on Packetyzer (running on my laptop). (btw I disable the firewall on my laptop.)
To find the problem I simplified the whole thing and used the udp_send function to send some data to an UDP port ("Hello", port 1333). I did receive the data but only after sending a PING to module and even then only at random. It seemed like a timing or a socket allocation problem. I tried various configurations but without a conclusive answer.
My code:
TCP Task
__task void task_tcp (void) { while (1) { main_TcpNet(); dhcp_server(); os_tsk_pass(); } }
DHCP Server
void dhcp_server (){ if (udp_soc == 0) { udp_soc = udp_get_socket (0, UDP_OPT_SEND_CS | UDP_OPT_CHK_CS, udp_callback); udp_open (udp_soc, 67); /*open port*/ } }
UDP Callback
U16 udp_callback (U8 socket, U8 *remip, U16 remport, U8 *buf, U16 len) { /*udp inits*/ U8 remoteip[4] = {255,255,255,255}; U8* sendbuf; unsigned char udp_msg[302]; //302 Bytes ... if(buf[0]==0x01) //check if bootp boot request { ... if(buf[242]==0x01) //check if dhcp discover { ... //send message len = 256; sendbuf = udp_get_buf (len); // for(index=0;index<256;index++) { sendbuf[index] = udp_msg[index]; } udp_send (udp_soc, remoteip, 68, sendbuf, len); } else if(buf[242]==0x03) //check if dhcp request { ... //send message len = 268; sendbuf = udp_get_buf (len); for(index=0;index<268;index++) { sendbuf[index] = udp_msg[index]; } udp_send (udp_soc, remoteip, 68, sendbuf, len); } } return (0); }
Has anyone encountered a similar problem?
Thanks, Christian
I just found the following text:
When the application starts, the ARP Cache buffer is normally empty. The ARP module does not yet know the target MAC address for the first UDP data packet being sent from the application. It sends the ARP request to the network. The first and any subsequent UDP data packets sent from the user application are lost until the target MAC address is resolved. This is because the UDP does not buffer outgoing packets.
(http://www.keil.com/support/man/docs/rlarm/rlarm_tn_using_udp_arpempty.htm)
Could this be the reason? How can I solve it?