//--------------------------------------------------------------------------------------- // Name: DHCP_GetIPAddress // Param: - // Return: TRUE in case of success, FALSE if an error occurred // // Description: This function is used to get IP Address and other network parameters using DHCP //--------------------------------------------------------------------------------------- bool DHCP_GetIPAddress(void) { uint8_t u8Index; uint8_t u8Socket = DHCP_SOCKET; bool bResult = FALSE; /* Initializations */ g_DHCP_LeaseTime = 0; for (u8Index = 0; u8Index < 4; u8Index++) { g_DHCP_YourIPAddress[u8Index] = 0; g_DHCP_RouterIPAddress[u8Index] = 0; g_DHCP_DNSIPAddress[u8Index] = 0; g_DHCP_SubnetMask[u8Index] = 0; g_DHCP_ServerIPAddress[u8Index] = 0; } /* Open a new socket */ if (SOCK_OpenSocket(u8Socket, W5100_SKT_MR_UDP, DHCP_CLIENT_PORT)==ERR_OK) { /* Send DISCOVER message */ if (DHCP_SendMessage(u8Socket, DHCP_DISCOVER) == TRUE) { /* Parse OFFER message */ if (DHCP_Parse(u8Socket) == DHCP_OFFER) { /* Send REQUEST message */ if (DHCP_SendMessage(u8Socket, DHCP_REQUEST) == TRUE) { /* Parse ACK message */ if (DHCP_Parse(u8Socket) == DHCP_ACK) { /* Set Gateway IP Address */ W5100_MemWriteByte(W5100_GAR0, g_DHCP_RouterIPAddress[0]); W5100_MemWriteByte(W5100_GAR1, g_DHCP_RouterIPAddress[1]); W5100_MemWriteByte(W5100_GAR2, g_DHCP_RouterIPAddress[2]); W5100_MemWriteByte(W5100_GAR3, g_DHCP_RouterIPAddress[3]); /* Set Subnet Mask */ W5100_MemWriteByte(W5100_SUBR0, g_DHCP_SubnetMask[0]); W5100_MemWriteByte(W5100_SUBR1, g_DHCP_SubnetMask[1]); W5100_MemWriteByte(W5100_SUBR2, g_DHCP_SubnetMask[2]); W5100_MemWriteByte(W5100_SUBR3, g_DHCP_SubnetMask[3]); /* Set my IP Address */ W5100_MemWriteByte(W5100_SIPR0, g_DHCP_YourIPAddress[0]); W5100_MemWriteByte(W5100_SIPR1, g_DHCP_YourIPAddress[1]); W5100_MemWriteByte(W5100_SIPR2, g_DHCP_YourIPAddress[2]); W5100_MemWriteByte(W5100_SIPR3, g_DHCP_YourIPAddress[3]); bResult = TRUE; } } } } /* Close the socket (socket can be used later in the application) */ SOCKET_Close(u8Socket); } return bResult; }
/** * Creates new INET socket of specified type (datagram/stream) * Note that both port and IP address are assumed to be in host * byte order */ Bool SOCKET_Create(int type, IPaddr ipaddr, Port port, Socket * sock) { ASSERT(sock); if (sock) { Socket s; *sock = INVALID_SOCKET; s = socket(AF_INET, type, 0); if (s == INVALID_SOCKET) { Error(TEXT("ERROR: cannot create socket, error %d\n"), SOCKET_GetLastError()); } else { int err; struct sockaddr_in sa; /* initialize sockaddr_in */ memset(&sa, 0, sizeof(sa)); sa.sin_family = AF_INET; sa.sin_port = htons(port); if (ipaddr) sa.sin_addr.s_addr = htonl(ipaddr); /* bind to port */ err = bind(s,(struct sockaddr*)&sa,sizeof(sa)); if (err) { if (port) { Error(TEXT("ERROR: cannot bind to port %hu, error %d\n"), port, SOCKET_GetLastError()); } else { Error(TEXT("ERROR: cannot bind socket, error %d\n"), SOCKET_GetLastError()); } SOCKET_Close(s); } else { *sock = s; return True; } } } return False; }