fix some things on linux todo list. 1) the config.ini. 2) the etherpkt struct defs...
authorLisa Hsu <hsul@eecs.umich.edu>
Thu, 10 Jun 2004 18:27:44 +0000 (14:27 -0400)
committerLisa Hsu <hsul@eecs.umich.edu>
Thu, 10 Jun 2004 18:27:44 +0000 (14:27 -0400)
3) add some new functions to etherpkt.  4) checkin the nice ping_linux.ini that i've been using.

dev/etherpkt.hh:
    remove the packet headers nate hated so much.
    also add some new functionality regarding packets, like isIpHdr(), etc.
dev/ns_gige.cc:
    improve the code given the nice new functions offered in etherpkt

--HG--
extra : convert_revision : 2e27f5a8dca5323c0fa22d3c51af44a35f6be1a2

dev/etherpkt.hh
dev/ns_gige.cc

index e51210e2e1e658935a9ed5b7ba26bf5f40675a03..8d0022363fae8a5ad17998479cb93ba5228700bd 100644 (file)
 
 #include "sim/host.hh"
 #include "base/refcnt.hh"
-
-#define EADDR_LEN 6
+#include "base/inet_hdrs.hh"
 
 class Checkpoint;
-
-struct pseudo_header
-{
-    uint32_t src_ip_addr;
-    uint32_t dest_ip_addr;
-    uint16_t protocol;
-    uint16_t len;
-};
-
-/** Ethernet header struct for casting purposes */
-struct eth_header
-{
-    uint8_t dest[EADDR_LEN];
-    uint8_t src[EADDR_LEN];
-    uint16_t type;
-};
-
-struct ip_header
-{
-    uint8_t vers_len;
-    uint8_t service_type;
-    uint16_t dgram_len;
-    uint16_t ID;
-    uint16_t flags_frag_offset;
-    uint8_t TTL;
-    uint8_t protocol;
-    uint16_t hdr_chksum;
-    uint32_t src_ip_addr;
-    uint32_t dest_ip_addr;
-    uint8_t *options;
-    uint8_t *transport_header;
-};
-
-struct tcp_header
-{
-    uint16_t src_port_num;
-    uint16_t dest_port_num;
-    uint32_t seq_num;
-    uint32_t ack_num;
-    uint8_t hdr_len;
-    uint8_t flags;
-    uint16_t rcv_window;
-    uint16_t chksum;
-    uint16_t urgent;
-    uint8_t *options;
-    uint8_t *data;
-};
-
-struct udp_header
-{
-    uint16_t src_port_num;
-    uint16_t dest_port_num;
-    uint16_t len;
-    uint16_t chksum;
-    uint8_t *data;
-};
-
 /*
  * Reference counted class containing ethernet packet data
  */
@@ -119,14 +61,31 @@ class EtherPacket : public RefCounted
     bool IsMulticast() { return data[0] == 0x01; }
     bool IsBroadcast() { return data[0] == 0xff; }
 
-    ip_header *getIpHdr() { return (ip_header *) (data + 14); }
-
-    void *getTransportHdr() {
+    bool isIpPkt() {
+        eth_header *eth = (eth_header *) data;
+        return (eth->type == 0x800);
+    }
+    bool isTcpPkt() {
         ip_header *ip = getIpHdr();
-        return (void *) (ip + (ip->vers_len & 0xf));
+        return (ip->protocol == 6);
+    }
+    bool isUdpPkt() {
+        ip_header *ip = getIpHdr();
+        return (ip->protocol == 17);
+    }
+
+    ip_header *getIpHdr() {
+        assert(isIpPkt());
+        return (ip_header *) (data + sizeof(eth_header));
     }
 
+    tcp_header *getTcpHdr(ip_header *ip) {
+        return (tcp_header *) (ip + (ip->vers_len & 0xf));
+    }
 
+    udp_header *getUdpHdr(ip_header *ip) {
+        return (udp_header *) (ip + (ip->vers_len & 0xf));
+    }
     typedef RefCountingPtr<EtherPacket> PacketPtr;
 
     void serialize(std::ostream &os);
index 812c10df4492c790cd52a0a9a0033adddf9edb76..486d16cb5fe6a6c8e1fe8b5d6ab90c1d96e6ece9 100644 (file)
@@ -1299,19 +1299,15 @@ NSGigE::rxKick()
             }
 #endif
 
-            eth_header *eth = (eth_header *) rxPacket->data;
-            // eth->type 0x800 indicated that it's an ip packet.
-            if (eth->type == 0x800 && extstsEnable) {
-                rxDescCache.extsts |= EXTSTS_IPPKT;
+            if (rxPacket->isIpPkt() && extstsEnable) {                       rxDescCache.extsts |= EXTSTS_IPPKT;
                 if (!ipChecksum(rxPacket, false))
                     rxDescCache.extsts |= EXTSTS_IPERR;
-                ip_header *ip = rxFifo.front()->getIpHdr();
 
-                if (ip->protocol == 6) {
+                if (rxPacket->isTcpPkt()) {
                     rxDescCache.extsts |= EXTSTS_TCPPKT;
                     if (!tcpChecksum(rxPacket, false))
                         rxDescCache.extsts |= EXTSTS_TCPERR;
-                } else if (ip->protocol == 17) {
+                } else if (rxPacket->isUdpPkt()) {
                     rxDescCache.extsts |= EXTSTS_UDPPKT;
                     if (!udpChecksum(rxPacket, false))
                         rxDescCache.extsts |= EXTSTS_UDPERR;
@@ -1914,9 +1910,8 @@ NSGigE::recvPacket(PacketPtr packet)
 bool
 NSGigE::udpChecksum(PacketPtr packet, bool gen)
 {
-    udp_header *hdr = (udp_header *)  packet->getTransportHdr();
-
     ip_header *ip = packet->getIpHdr();
+    udp_header *hdr = packet->getUdpHdr(ip);
 
     pseudo_header *pseudo = new pseudo_header;
 
@@ -1941,9 +1936,8 @@ NSGigE::udpChecksum(PacketPtr packet, bool gen)
 bool
 NSGigE::tcpChecksum(PacketPtr packet, bool gen)
 {
-    tcp_header *hdr = (tcp_header *) packet->getTransportHdr();
-
     ip_header *ip = packet->getIpHdr();
+    tcp_header *hdr = packet->getTcpHdr(ip);
 
     pseudo_header *pseudo = new pseudo_header;