fix some things on linux todo list. 1) the config.ini. 2) the etherpkt struct defs into ined_hdrs.hh
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
This commit is contained in:
@@ -38,67 +38,9 @@
|
||||
|
||||
#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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user