- fixed Eth_pkt_recv

- DHCP sending of client id is disabled

git-svn-id: http://moon:8086/svn/mips@209 a8ebac50-d88d-4704-bea3-6648445a41b3
This commit is contained in:
2021-11-24 07:17:01 +00:00
parent 6c957b9e84
commit 001e7af3e3
3 changed files with 37 additions and 34 deletions
+6 -2
View File
@@ -4,12 +4,12 @@
// 21.12.2003, J. Ahrensfeld // 21.12.2003, J. Ahrensfeld
// //
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
#include <string.h>
#include <libsys/libsys.h> #include <libsys/libsys.h>
#include "ethernet.h" #include "ethernet.h"
#include "ipv4.h" #include "ipv4.h"
#include "udp.h" #include "udp.h"
#include "dhcp.h" #include "dhcp.h"
#include "string.h"
const char hostname[] = "ML-402"; const char hostname[] = "ML-402";
@@ -46,6 +46,7 @@ void DHCP_request_send(packet_t *pPacket, uint32_t dhcp_msg_type, uint8_t *mac_a
pos = 0; pos = 0;
size = sizeof(magic); size = sizeof(magic);
memset(&pDHCP->options[pos], 0xAA, sizeof(pDHCP->options));
memcpy(&pDHCP->options[pos], &magic, size); memcpy(&pDHCP->options[pos], &magic, size);
pos += size; pos += size;
@@ -60,6 +61,7 @@ void DHCP_request_send(packet_t *pPacket, uint32_t dhcp_msg_type, uint8_t *mac_a
pDHCP->options[pos] = dhcp_msg_type; pDHCP->options[pos] = dhcp_msg_type;
pos += size; pos += size;
#ifdef WITH_CLIENT_ID
// Set client ID // Set client ID
size = sizeof(dhcp_opt_hdr_t); size = sizeof(dhcp_opt_hdr_t);
pOpt_hdr = (dhcp_opt_hdr_t*)&pDHCP->options[pos]; pOpt_hdr = (dhcp_opt_hdr_t*)&pDHCP->options[pos];
@@ -70,6 +72,7 @@ void DHCP_request_send(packet_t *pPacket, uint32_t dhcp_msg_type, uint8_t *mac_a
size = pOpt_hdr->len; size = pOpt_hdr->len;
memcpy(&pDHCP->options[pos], mac_addr_src, size); memcpy(&pDHCP->options[pos], mac_addr_src, size);
pos += size; pos += size;
#endif
// Set client name // Set client name
size = sizeof(dhcp_opt_hdr_t); size = sizeof(dhcp_opt_hdr_t);
@@ -107,6 +110,7 @@ void DHCP_request_send(packet_t *pPacket, uint32_t dhcp_msg_type, uint8_t *mac_a
pDHCP->options[pos] = dhcp_msg_type; pDHCP->options[pos] = dhcp_msg_type;
pos += size; pos += size;
#ifdef WITH_CLIENT_ID
// Set client ID // Set client ID
size = sizeof(dhcp_opt_hdr_t); size = sizeof(dhcp_opt_hdr_t);
pOpt_hdr = (dhcp_opt_hdr_t*)&pDHCP->options[pos]; pOpt_hdr = (dhcp_opt_hdr_t*)&pDHCP->options[pos];
@@ -117,7 +121,7 @@ void DHCP_request_send(packet_t *pPacket, uint32_t dhcp_msg_type, uint8_t *mac_a
size = pOpt_hdr->len; size = pOpt_hdr->len;
memcpy(&pDHCP->options[pos], mac_addr_src, size); memcpy(&pDHCP->options[pos], mac_addr_src, size);
pos += size; pos += size;
#endif
// Set client name // Set client name
size = sizeof(dhcp_opt_hdr_t); size = sizeof(dhcp_opt_hdr_t);
pOpt_hdr = (dhcp_opt_hdr_t*)&pDHCP->options[pos]; pOpt_hdr = (dhcp_opt_hdr_t*)&pDHCP->options[pos];
+4 -1
View File
@@ -124,7 +124,7 @@ uint32_t Eth_pkt_recv(uint8_t *pData)
volatile uint32_t *pEmac_size = (uint32_t*)SYS_EMAC_RX_SIZE; volatile uint32_t *pEmac_size = (uint32_t*)SYS_EMAC_RX_SIZE;
volatile uint32_t *pEmac_data = (uint32_t*)SYS_EMAC_DATA; volatile uint32_t *pEmac_data = (uint32_t*)SYS_EMAC_DATA;
uint32_t crc32, i, num_words, num_bytes, pkt_size; uint32_t i, num_words, num_bytes;
if(EMAC_RX_is_avail()) if(EMAC_RX_is_avail())
{ {
@@ -143,11 +143,14 @@ uint32_t Eth_pkt_recv(uint8_t *pData)
EMAC_RX_request(); EMAC_RX_request();
for (i=0; i < num_words; i++) for (i=0; i < num_words; i++)
{
((uint32_t*)pData)[i] = *pEmac_data; ((uint32_t*)pData)[i] = *pEmac_data;
}
EMAC_RX_free(); EMAC_RX_free();
} }
} }
return num_bytes;
} }
uint16_t htons(uint16_t a) uint16_t htons(uint16_t a)
+24 -28
View File
@@ -29,11 +29,10 @@ gpio_if_t gpio_led_dir;
gpio_if_t gpio_btn_data; gpio_if_t gpio_btn_data;
gpio_if_t gpio_btn_dir; gpio_if_t gpio_btn_dir;
gpio_if_t gpio_mdio_data;
Mii_t mii; Mii_t mii;
#define BUFFER_SIZE (32*1024*1024) #define BUFFER_SIZE (32*1024*1024)
#define WITH_DHCP_CLIENT
fifo_t rx_descr_fifo; fifo_t rx_descr_fifo;
uint32_t *g_pBuf; uint32_t *g_pBuf;
@@ -212,10 +211,6 @@ int main()
volatile uint8_t *pEmac_maddr8 = (uint8_t*)SYS_EMAC_MADDR; volatile uint8_t *pEmac_maddr8 = (uint8_t*)SYS_EMAC_MADDR;
uint8_t buffer[2048], data[1460]; uint8_t buffer[2048], data[1460];
packet_t packet; packet_t packet;
ARP *pARP;
IPV4 *pIPV4;
UDP *pUDP;
DHCP *pDHCP;
uint32_t start, stop; uint32_t start, stop;
rx_descr_t rx_descr; rx_descr_t rx_descr;
@@ -246,23 +241,6 @@ int main()
// Reset PHY // Reset PHY
MiiGpio_Reset(&mii); MiiGpio_Reset(&mii);
res = gpio_read(&gpio_led_dir);
printf("Dir = %08X\n", res);
// while(1)
{
res = gpio_read(&gpio_led_data);
printf("LED-Data = %08X\n", res);
gpio_write(&gpio_led_data, res + 1);
res = gpio_read(&gpio_btn_data);
printf("Btn-Data = %08X\n", res);
res = gpio_read(&gpio_mdio_data);
printf("MDIO-Data = %08X\n", res);
sleep(100);
}
// Phy_loopback_enable(&mii, PHY_ADDR, MPHY_CONTROL_SPD_SEL_100); // Phy_loopback_enable(&mii, PHY_ADDR, MPHY_CONTROL_SPD_SEL_100);
// printf("Set loopback mode.\n\r"); // printf("Set loopback mode.\n\r");
@@ -353,10 +331,15 @@ int main()
if (!res) if (!res)
continue; continue;
// printf("SYS_EMAC_RX_STAT = %08X\n", *pEmac_rx_ctrl); #ifdef WITH_DHCP_CLIENT
// printf("SYS_EMAC_RX_SIZE = %08X\n", *pEmac_rx_size); 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); 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); DHCP_request_send(&packet, DHCP_MSG_DHCPDISCOVER, eth_myself, ip_zero, ip_bcast, NULL);
Eth_pkt_send(&packet); Eth_pkt_send(&packet);
@@ -364,13 +347,17 @@ int main()
sleep(500); sleep(500);
do do
{ {
Eth_pkt_recv(buffer); int32_t size = Eth_pkt_recv(buffer);
PrintBuffer8((uint8_t*)buffer, 16, size);
pIPV4 = (IPV4*)&buffer[sizeof(eth_hdr_t)]; pIPV4 = (IPV4*)&buffer[sizeof(eth_hdr_t)];
pUDP = (UDP*)&buffer[sizeof(eth_hdr_t) + sizeof(IPV4)]; pUDP = (UDP*)&buffer[sizeof(eth_hdr_t) + sizeof(IPV4)];
pDHCP = (DHCP*)&buffer[sizeof(eth_hdr_t) + sizeof(IPV4) + sizeof(UDP)]; pDHCP = (DHCP*)&buffer[sizeof(eth_hdr_t) + sizeof(IPV4) + sizeof(UDP)];
} while (pUDP->dst_port != 68); } while (pUDP->dst_port != 68);
printf("---------------------------------------------------------------\n");
printf("- Send DHCP Request -------------------------------------------\n");
printf("---------------------------------------------------------------\n");
Eth_pkt_create(&packet, TYPE_PROTO_IP, eth_myself, eth_bcst); 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); DHCP_request_send(&packet, DHCP_MSG_DHCPREQUEST, eth_myself, ip_zero, ip_bcast, pDHCP);
Eth_pkt_send(&packet); Eth_pkt_send(&packet);
@@ -378,6 +365,9 @@ int main()
sleep(500); sleep(500);
continue; continue;
printf("---------------------------------------------------------------\n");
printf("- Send ARP Request --------------------------------------------\n");
printf("---------------------------------------------------------------\n");
Eth_pkt_create(&packet, TYPE_PROTO_ARP, eth_myself, eth_bcst); Eth_pkt_create(&packet, TYPE_PROTO_ARP, eth_myself, eth_bcst);
ArpRequest(&packet, eth_myself, myIP, eth_zero, arpIpDst); ArpRequest(&packet, eth_myself, myIP, eth_zero, arpIpDst);
Eth_pkt_send(&packet); Eth_pkt_send(&packet);
@@ -386,16 +376,22 @@ int main()
Eth_pkt_recv(buffer); Eth_pkt_recv(buffer);
pARP = (ARP*)&buffer[sizeof(eth_hdr_t)]; 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); Eth_pkt_create(&packet, TYPE_PROTO_IP, eth_myself, pARP->eth_addr_src);
ICMPSendRequest(&packet, myIP, arpIpDst, data, sizeof(data)); ICMPSendRequest(&packet, myIP, arpIpDst, data, sizeof(data));
Eth_pkt_send(&packet); 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); Eth_pkt_create(&packet, TYPE_PROTO_IP, eth_myself, pARP->eth_addr_src);
UDP_create(&packet, myIP, 10001, arpIpDst, 10002, data, sizeof(data)); UDP_create(&packet, myIP, 10001, arpIpDst, 10002, data, sizeof(data));
Eth_pkt_send(&packet); Eth_pkt_send(&packet);
continue; continue;
*/ #endif
start = clock(); start = clock();
Eth_pkt_create(&packet, TYPE_PROTO_IP, eth_myself, eth_bcst); Eth_pkt_create(&packet, TYPE_PROTO_IP, eth_myself, eth_bcst);