diff --git a/src/common/network/dhcp.c b/src/common/network/dhcp.c index 88c3aa9..2d9f98e 100644 --- a/src/common/network/dhcp.c +++ b/src/common/network/dhcp.c @@ -12,7 +12,7 @@ #include "dhcp.h" #define WITH_CLIENT_ID 1 -const char hostname[] = "ML-402"; +const char hostname[] = "ml402"; // ------------------------------------------------------------------------- // Testing @@ -33,7 +33,7 @@ void DHCP_request_send(packet_t *pPacket, uint32_t dhcp_msg_type, uint8_t *mac_a pDHCP->hlen = 6; pDHCP->hops = 0; pDHCP->secs = 0; - pDHCP->flags = 0; + pDHCP->flags = DHCP_FLAGS_BROADCAST; memcpy(pDHCP->chaddr, mac_addr_src, pDHCP->hlen); switch(dhcp_msg_type) @@ -69,7 +69,7 @@ void DHCP_request_send(packet_t *pPacket, uint32_t dhcp_msg_type, uint8_t *mac_a option_size += size; size = 1; - pDHCP->options[option_size] = HWTYPE_ETHERNET; + pDHCP->options[option_size] = TYPE_HW_ETH10; option_size += size; size = 6; @@ -124,7 +124,7 @@ void DHCP_request_send(packet_t *pPacket, uint32_t dhcp_msg_type, uint8_t *mac_a option_size += size; size = 1; - pDHCP->options[option_size] = HWTYPE_ETHERNET; + pDHCP->options[option_size] = TYPE_HW_ETH10; option_size += size; size = 6; diff --git a/src/common/network/dhcp.h b/src/common/network/dhcp.h index 8adf925..558bce6 100644 --- a/src/common/network/dhcp.h +++ b/src/common/network/dhcp.h @@ -41,6 +41,8 @@ typedef struct _sdhcp_opt_hdr_t } __attribute__ ((__packed__)) dhcp_opt_hdr_t; +#define DHCP_FLAGS_BROADCAST 0x8000 + #define DHCP_OPT_HOSTNAME 12 #define DHCP_OPT_REQIP 50 #define DHCP_OPT_MSGTYPE 53 @@ -56,27 +58,6 @@ typedef struct _sdhcp_opt_hdr_t #define DHCP_MSG_DHCPNAK 6 #define DHCP_MSG_DHCPRELEASE 7 -// Hardware types RFC 1340 -#define HWTYPE_ETHERNET 1 -/* - 1 Ethernet (10Mb) [JBP] - 2 Experimental Ethernet (3Mb) [JBP] - 3 Amateur Radio AX.25 [PXK] - 4 Proteon ProNET Token Ring [JBP] - 5 Chaos [GXP] - 6 IEEE 802 Networks [JBP] - 7 ARCNET [JBP] - 8 Hyperchannel [JBP] - 9 Lanstar [TU] - 10 Autonet Short Address [MXB1] - 11 LocalTalk [JKR1] - 12 LocalNet (IBM PCNet or SYTEK LocalNET) [JXM] - 13 Ultra link [RXD2] - 14 SMDS [GXC1] - 15 Frame Relay [AGM] - 16 Asynchronous Transmission Mode (ATM) [JXB2] -*/ - // ------------------------------------------------------------------------- void DHCP_request_send(packet_t *pPacket, uint32_t dhcp_msg_type, uint8_t *mac_addr_src, uint8_t *inet_addr_src, uint8_t *inet_addr_dst, DHCP *pLast); diff --git a/src/test_emac.c b/src/test_emac.c index 38af1f7..b3d0845 100644 --- a/src/test_emac.c +++ b/src/test_emac.c @@ -303,7 +303,10 @@ int main() interrupt_enable(6); *pEmac_rx_ctrl |= EMAC_RX_CTRL_INTEN; - + + uint32_t dhcp_state = 1; + sleep(200); + while(1) { @@ -326,79 +329,77 @@ int main() printf("\n"); } - res = gpio_read(&gpio_btn_data); +#ifdef WITH_DHCP_CLIENT + sleep(1000); + { + ARP *pARP; + IPV4 *pIPV4; + UDP *pUDP; + DHCP *pDHCP; + if (dhcp_state == 1) + { + printf("---------------------------------------------------------------\n"); + printf("- Send DHCP Discover ------------------------------------------\n"); + printf("---------------------------------------------------------------\n"); + Eth_pkt_create(&packet, TYPE_PROTO_IP, eth_myself, eth_bcst); + DHCP_request_send(&packet, DHCP_MSG_DHCPDISCOVER, eth_myself, ip_zero, ip_bcast, NULL); + PrintBuffer8((uint8_t*)packet.pkt_buf, 16, packet.size); + Eth_pkt_send(&packet); + dhcp_state = 0; + } + if (dhcp_state == 2) + { + printf("---------------------------------------------------------------\n"); + printf("- Send DHCP Request -------------------------------------------\n"); + printf("---------------------------------------------------------------\n"); + Eth_pkt_create(&packet, TYPE_PROTO_IP, eth_myself, eth_bcst); + DHCP_request_send(&packet, DHCP_MSG_DHCPREQUEST, eth_myself, ip_zero, ip_bcast, pDHCP); + Eth_pkt_send(&packet); + } + + if (dhcp_state == 3) + { + printf("---------------------------------------------------------------\n"); + printf("- Send ARP Request --------------------------------------------\n"); + printf("---------------------------------------------------------------\n"); + Eth_pkt_create(&packet, TYPE_PROTO_ARP, eth_myself, eth_bcst); + ArpRequest(&packet, eth_myself, myIP, eth_zero, arpIpDst); + Eth_pkt_send(&packet); + + sleep(500); + Eth_pkt_recv(buffer); + pARP = (ARP*)&buffer[sizeof(eth_hdr_t)]; + } + + if (dhcp_state == 4) + { + printf("---------------------------------------------------------------\n"); + printf("- Send ICMP ---------------------------------------------------\n"); + printf("---------------------------------------------------------------\n"); + Eth_pkt_create(&packet, TYPE_PROTO_IP, eth_myself, pARP->eth_addr_src); + ICMPSendRequest(&packet, myIP, arpIpDst, data, sizeof(data)); + Eth_pkt_send(&packet); + } + + if (dhcp_state == 5) + { + printf("---------------------------------------------------------------\n"); + printf("- Send ARP UDP ------------------------------------------------\n"); + printf("---------------------------------------------------------------\n"); + Eth_pkt_create(&packet, TYPE_PROTO_IP, eth_myself, pARP->eth_addr_src); + UDP_create(&packet, myIP, 10001, arpIpDst, 10002, data, sizeof(data)); + Eth_pkt_send(&packet); + } + } + +#endif + continue; + + res = gpio_read(&gpio_btn_data); if (!res) continue; -#ifdef WITH_DHCP_CLIENT - ARP *pARP; - IPV4 *pIPV4; - UDP *pUDP; - DHCP *pDHCP; - - printf("---------------------------------------------------------------\n"); - printf("- Send DHCP Discover ------------------------------------------\n"); - printf("---------------------------------------------------------------\n"); - Eth_pkt_create(&packet, TYPE_PROTO_IP, eth_myself, eth_bcst); - DHCP_request_send(&packet, DHCP_MSG_DHCPDISCOVER, eth_myself, ip_zero, ip_bcast, NULL); - PrintBuffer8((uint8_t*)packet.pkt_buf, 16, packet.size); - Eth_pkt_send(&packet); - - sleep(1000); - continue; - - while(fifo_read(&rx_descr_fifo, (uint8_t*)&rx_descr, sizeof(rx_descr_t), 0, FIFO_NONBLOCK)) - { - PrintBuffer8((uint8_t*)rx_descr.pBuf, 16, rx_descr.size); - pIPV4 = (IPV4*)&buffer[sizeof(eth_hdr_t)]; - pUDP = (UDP*)&buffer[sizeof(eth_hdr_t) + sizeof(IPV4)]; - pDHCP = (DHCP*)&buffer[sizeof(eth_hdr_t) + sizeof(IPV4) + sizeof(UDP)]; - if (pUDP->dst_port == 68) - { - break; - } - }; - - - printf("---------------------------------------------------------------\n"); - printf("- Send DHCP Request -------------------------------------------\n"); - printf("---------------------------------------------------------------\n"); - Eth_pkt_create(&packet, TYPE_PROTO_IP, eth_myself, eth_bcst); - DHCP_request_send(&packet, DHCP_MSG_DHCPREQUEST, eth_myself, ip_zero, ip_bcast, pDHCP); - Eth_pkt_send(&packet); - - sleep(500); - continue; - - printf("---------------------------------------------------------------\n"); - printf("- Send ARP Request --------------------------------------------\n"); - printf("---------------------------------------------------------------\n"); - Eth_pkt_create(&packet, TYPE_PROTO_ARP, eth_myself, eth_bcst); - ArpRequest(&packet, eth_myself, myIP, eth_zero, arpIpDst); - Eth_pkt_send(&packet); - - sleep(500); - Eth_pkt_recv(buffer); - pARP = (ARP*)&buffer[sizeof(eth_hdr_t)]; - - printf("---------------------------------------------------------------\n"); - printf("- Send ICMP ---------------------------------------------------\n"); - printf("---------------------------------------------------------------\n"); - Eth_pkt_create(&packet, TYPE_PROTO_IP, eth_myself, pARP->eth_addr_src); - ICMPSendRequest(&packet, myIP, arpIpDst, data, sizeof(data)); - Eth_pkt_send(&packet); - - printf("---------------------------------------------------------------\n"); - printf("- Send ARP UDP ------------------------------------------------\n"); - printf("---------------------------------------------------------------\n"); - Eth_pkt_create(&packet, TYPE_PROTO_IP, eth_myself, pARP->eth_addr_src); - UDP_create(&packet, myIP, 10001, arpIpDst, 10002, data, sizeof(data)); - Eth_pkt_send(&packet); - - continue; -#endif - start = clock(); Eth_pkt_create(&packet, TYPE_PROTO_IP, eth_myself, eth_bcst); UDP_create(&packet, myIP, 10001, arpIpDst, 10002, data, sizeof(data));