time to save again origin/feature/ethernet
authorMichael Moon <triffid.hunter@gmail.com>
Wed, 30 Jan 2013 02:20:16 +0000 (13:20 +1100)
committerMichael Moon <triffid.hunter@gmail.com>
Wed, 30 Jan 2013 02:20:16 +0000 (13:20 +1100)
src/libs/Network/ARP.cpp
src/libs/Network/ARP.h
src/libs/Network/Drivers/LPC17XX_Ethernet.cpp
src/libs/Network/Drivers/LPC17XX_Ethernet.h
src/libs/Network/IP.cpp
src/libs/Network/netcore.cpp
src/libs/Network/netcore.h
src/main.cpp

index 25cd994..5377ff2 100644 (file)
@@ -88,7 +88,7 @@ int ARP::receive(NetworkInterface* interface, NET_PACKET packet, int length)
     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);
 
@@ -134,7 +134,8 @@ int   ARP::resolve_address(IP_ADDR ip, uint8_t* mac, NetworkInterface** interfac
     {
         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;
@@ -149,6 +150,9 @@ int   ARP::resolve_address(IP_ADDR ip, uint8_t* mac, NetworkInterface** interfac
 
         construct(ni, buffer, bufferlen);
 
+        if (interface)
+            *interface = ni;
+
         arf->tpa = ip;
         memset(arf->tha, 0xFF, SIZEOF_MAC);
 
@@ -198,3 +202,14 @@ void ARP::dump_arp_table(StreamOutput* out)
     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;
+    }
+}
index 1ea6b8d..20895df 100644 (file)
@@ -51,6 +51,8 @@ public:
     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);
index 8266d61..10e674b 100644 (file)
@@ -221,6 +221,7 @@ void LPC17XX_Ethernet::on_second_tick(void*)
     {
         // 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)
@@ -246,6 +247,7 @@ void LPC17XX_Ethernet::on_second_tick(void*)
     {
         // TODO: link down event
         up = false;
+        net->set_interface_status(this, up);
         printf("%s: link down\n", interface_name);
     }
 
@@ -469,7 +471,7 @@ NET_PAYLOAD LPC17XX_Ethernet::get_payload_buffer(NET_PACKET packet)
     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);
@@ -497,3 +499,10 @@ extern "C" {
         LPC17XX_Ethernet::instance->irq();
     }
 }
+
+void LPC17XX_Ethernet::provide_net(netcore* n)
+{
+    NetworkInterface::provide_net(n);
+    up = false;
+    n->set_interface_status(this, up);
+}
index 3f73509..aa99348 100644 (file)
@@ -52,9 +52,11 @@ public:
     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);
index eef79b1..4b28eae 100644 (file)
@@ -78,7 +78,7 @@ int IP::receive(NetworkInterface* interface, NET_PACKET packet, int length)
 
     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);
@@ -171,4 +171,10 @@ void IP::set_dest_ip(NET_PACKET packet, IP_ADDR ip)
 {
     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)
+//
 }
index 6ba8cbe..52398a0 100644 (file)
@@ -18,8 +18,8 @@ bool netcore::add_interface(NetworkInterface* interface)
         return false;
 
     interfaces[n_interfaces] = interface;
-    interface->provide_net(this);
     n_interfaces++;
+    interface->provide_net(this);
     return true;
 }
 
@@ -34,7 +34,7 @@ int netcore::receive_packet(NetworkInterface* interface, NET_PACKET packet, int
     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];
@@ -67,7 +67,7 @@ int netcore::receive_packet(NetworkInterface* interface, NET_PACKET packet, int
         txlength += sizeof(eth_frame);
     }
 
-    printf("return %d\n", txlength);
+//     printf("return %d\n", txlength);
 
     return txlength;
 }
@@ -115,3 +115,30 @@ void netcore::set_type(NET_PACKET packet, int type)
     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;
+}
index 21c855b..0c4210c 100644 (file)
@@ -34,9 +34,14 @@ public:
     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);
index ad31ac1..96d9a45 100644 (file)
@@ -29,6 +29,9 @@
 #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"
 
@@ -51,10 +54,14 @@ USBMSD msc(&u, &sd);
 DFU dfu(&u);
 USBSerial usbserial2(&u);
 
+USBEthernet usbeth(&u);
+
 SDFAT mounter("sd", &sd);
 
 LPC17XX_Ethernet eth;
 
+netcore net;
+
 Kernel kernel;
 
 char buf[512];
@@ -126,7 +133,11 @@ int main() {
     kernel.add_module( &dfu );
     kernel.add_module( &u );
 
+    net.add_interface( &eth );
+    net.add_interface( &usbeth );
+
     kernel.add_module( &eth );
+    kernel.add_module( &usbeth );
 
     struct SerialMessage message;
     message.message = "G90";