[Network]

- added broadcast flag
- removed hw types from dhcp
[test_emac]
- do dhcp discover on startup

git-svn-id: http://moon:8086/svn/mips@214 a8ebac50-d88d-4704-bea3-6648445a41b3
This commit is contained in:
2021-11-24 16:52:36 +00:00
parent 9c79fa3bd5
commit def3585764
3 changed files with 77 additions and 95 deletions
+4 -4
View File
@@ -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;
+2 -21
View File
@@ -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);
+71 -70
View File
@@ -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));