Exemple #1
0
//---------------------------------------------------------------------------------------
// 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;
}
Exemple #2
0
/**
 * 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;
}