return 0;
}
-int ARP::construct(NetworkInterface* interface, NET_PACKET packet, int length)
+int ARP::construct(NetworkInterface* interface, NET_PACKET packet, int length)
{
arp_frame* arf = (arp_frame*) parent->get_payload_buffer(packet);
{
if (entry->ip == ip)
{
- memcpy(mac, entry->mac, SIZEOF_MAC);
+ if (mac)
+ memcpy(mac, entry->mac, SIZEOF_MAC);
if (interface)
*interface = entry->interface;
return 0;
construct(ni, buffer, bufferlen);
+ if (interface)
+ *interface = ni;
+
arf->tpa = ip;
memset(arf->tha, 0xFF, SIZEOF_MAC);
out->printf("ARP table: %i entries\n");
}
+NetworkInterface* ARP::get_interface(IP_ADDR ip)
+{
+ arp_cache_entry* entry = arp_cache;
+
+ while (entry)
+ {
+ if (entry->ip == ip)
+ return entry->interface;
+ entry = entry->next;
+ }
+}
int resolve_address(IP_ADDR, uint8_t*, NetworkInterface**, NET_PACKET, int);
IP_ADDR rarp(uint8_t*, NetworkInterface**);
+ NetworkInterface* get_interface(IP_ADDR);
+
bool store_mac_ip(NetworkInterface*, uint8_t*, uint32_t);
int periodical(int, NetworkInterface*, NET_PACKET, int);
{
// TODO: link up event
up = true;
+ net->set_interface_status(this, up);
uint32_t scsr = read_PHY(EMAC_PHY_REG_SCSR);
printf("%s: link up: ", interface_name);
switch ((scsr >> 2) & 0x7)
{
// TODO: link down event
up = false;
+ net->set_interface_status(this, up);
printf("%s: link down\n", interface_name);
}
return (NET_PAYLOAD) packet;
}
-void LPC17XX_Ethernet::set_payload_length(NET_PACKET packet, int length)
+void LPC17XX_Ethernet::set_payload_length(NET_PACKET packet, int length)
{
uint32_t offset = ((uint8_t*) packet) - txbuf.buf[0];
int i = (offset / LPC17XX_MAX_PACKET);
LPC17XX_Ethernet::instance->irq();
}
}
+
+void LPC17XX_Ethernet::provide_net(netcore* n)
+{
+ NetworkInterface::provide_net(n);
+ up = false;
+ n->set_interface_status(this, up);
+}
void _receive_frame(void);
// NetworkInterface methods
+ void provide_net(netcore* n);
bool can_read_packet(void);
int read_packet(uint8_t**);
void release_read_packet(uint8_t*);
+ void periodical(int);
bool can_write_packet(void);
int write_packet(uint8_t *, int);
if (txlength)
{
- printf("IP: adding %d to frame, %d -> %d\n", sizeof(ip_frame), txlength, txlength + sizeof(ip_frame));
+// printf("IP: adding %d to frame, %d -> %d\n", sizeof(ip_frame), txlength, txlength + sizeof(ip_frame));
txlength += sizeof(ip_frame);
ipf->dstip = ipf->srcip;
ipf->srcip = htonl(interface->ip_address);
{
ip_frame* p = (ip_frame*) parent->get_payload_buffer(packet);
p->dstip = ip;
+// uint8_t mac[6];
+// int r = parent->arp->resolve_address(ip, mac, NULL, packet, 1536);
+// if (r == 0)
+// parent->set_dest_mac(packet, mac);
+// else if (r > 0)
+//
}
return false;
interfaces[n_interfaces] = interface;
- interface->provide_net(this);
n_interfaces++;
+ interface->provide_net(this);
return true;
}
format_mac(e->dest_mac, dmac);
format_mac(e->src_mac, smac);
- printf("ETH: %d bytes To %s From %s Type 0x%04X: ", length, dmac, smac, ntohs(e->e_type));
+ printf("%s: %d bytes To %s From %s Type 0x%04X: ", interface->get_name(), length, dmac, smac, ntohs(e->e_type));
for (int i = 12; i < length; i++)
{
int c = e->payload[i];
txlength += sizeof(eth_frame);
}
- printf("return %d\n", txlength);
+// printf("return %d\n", txlength);
return txlength;
}
eth_frame* f = (eth_frame*) packet;
f->e_type = type;
}
+
+int netcore::set_interface_status(NetworkInterface* ni, bool up)
+{
+ printf("%s: %s\n", ni->get_name(), up?"up":"down");
+ return 0;
+}
+
+NET_PAYLOAD netcore::get_payload_buffer(NET_PACKET packet)
+{
+ eth_frame* e = (eth_frame*) packet;
+ return e->payload;
+}
+
+void netcore::set_payload_length(NET_PACKET packet, int length)
+{
+ // TODO
+}
+
+int netcore::receive(NetworkInterface*, NET_PACKET, int)
+{
+ return 0;
+}
+
+int netcore::construct(NetworkInterface* ni, NET_PACKET packet, int length)
+{
+ return 0;
+}
int receive_packet( NetworkInterface*, NET_PACKET, int);
int periodical( int, NetworkInterface*, NET_PACKET, int);
- NET_PACKET get_new_packet_buffer(NetworkInterface*);
+ int set_interface_status(NetworkInterface*, bool);
+ NET_PACKET get_new_packet_buffer(NetworkInterface*);
+ NET_PAYLOAD get_payload_buffer(NET_PACKET);
+ void set_payload_length(NET_PACKET, int);
+ int receive(NetworkInterface*, NET_PACKET, int);
+ int construct(NetworkInterface*, NET_PACKET, int);
void set_dest_mac(NET_PACKET, uint8_t*);
void set_type(NET_PACKET, int);
#include "libs/USBDevice/USBMSD/SDCard.h"
#include "libs/USBDevice/USBSerial/USBSerial.h"
#include "libs/USBDevice/DFU.h"
+#include "libs/USBDevice/USBEthernet/USBEthernet.h"
+
+#include "netcore.h"
#include "libs/SDFAT.h"
DFU dfu(&u);
USBSerial usbserial2(&u);
+USBEthernet usbeth(&u);
+
SDFAT mounter("sd", &sd);
LPC17XX_Ethernet eth;
+netcore net;
+
Kernel kernel;
char buf[512];
kernel.add_module( &dfu );
kernel.add_module( &u );
+ net.add_interface( ð );
+ net.add_interface( &usbeth );
+
kernel.add_module( ð );
+ kernel.add_module( &usbeth );
struct SerialMessage message;
message.message = "G90";