inet: initialization fixes.
Make sure variables are properly initialized and also make sure that truth testing works properly.
This commit is contained in:
parent
8042b8f4c7
commit
87d03d00cd
2 changed files with 59 additions and 54 deletions
|
@ -179,32 +179,31 @@ class IpPtr
|
||||||
friend class UdpPtr;
|
friend class UdpPtr;
|
||||||
EthPacketPtr p;
|
EthPacketPtr p;
|
||||||
|
|
||||||
const IpHdr *h() const
|
|
||||||
{ return (const IpHdr *)(p->data + sizeof(eth_hdr)); }
|
|
||||||
IpHdr *h() { return (IpHdr *)(p->data + sizeof(eth_hdr)); }
|
|
||||||
|
|
||||||
void set(const EthPacketPtr &ptr)
|
void set(const EthPacketPtr &ptr)
|
||||||
{
|
{
|
||||||
EthHdr *eth = (EthHdr *)ptr->data;
|
p = 0;
|
||||||
if (eth->type() == ETH_TYPE_IP)
|
|
||||||
p = ptr;
|
if (ptr) {
|
||||||
else
|
EthHdr *eth = (EthHdr *)ptr->data;
|
||||||
p = 0;
|
if (eth->type() == ETH_TYPE_IP)
|
||||||
|
p = ptr;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
IpPtr() {}
|
IpPtr() : p(0) {}
|
||||||
IpPtr(const EthPacketPtr &ptr) { set(ptr); }
|
IpPtr(const EthPacketPtr &ptr) : p(0) { set(ptr); }
|
||||||
IpPtr(const EthPtr &ptr) { set(ptr.p); }
|
IpPtr(const EthPtr &ptr) : p(0) { set(ptr.p); }
|
||||||
IpPtr(const IpPtr &ptr) : p(ptr.p) { }
|
IpPtr(const IpPtr &ptr) : p(ptr.p) { }
|
||||||
|
|
||||||
IpHdr *operator->() { return h(); }
|
IpHdr *get() { return (IpHdr *)(p->data + sizeof(eth_hdr)); }
|
||||||
IpHdr &operator*() { return *h(); }
|
IpHdr *operator->() { return get(); }
|
||||||
operator IpHdr *() { return h(); }
|
IpHdr &operator*() { return *get(); }
|
||||||
|
|
||||||
const IpHdr *operator->() const { return h(); }
|
const IpHdr *get() const
|
||||||
const IpHdr &operator*() const { return *h(); }
|
{ return (const IpHdr *)(p->data + sizeof(eth_hdr)); }
|
||||||
operator const IpHdr *() const { return h(); }
|
const IpHdr *operator->() const { return get(); }
|
||||||
|
const IpHdr &operator*() const { return *get(); }
|
||||||
|
|
||||||
const IpPtr &operator=(const EthPacketPtr &ptr) { set(ptr); return *this; }
|
const IpPtr &operator=(const EthPacketPtr &ptr) { set(ptr); return *this; }
|
||||||
const IpPtr &operator=(const EthPtr &ptr) { set(ptr.p); return *this; }
|
const IpPtr &operator=(const EthPtr &ptr) { set(ptr.p); return *this; }
|
||||||
|
@ -214,7 +213,6 @@ class IpPtr
|
||||||
EthPacketPtr packet() { return p; }
|
EthPacketPtr packet() { return p; }
|
||||||
bool operator!() const { return !p; }
|
bool operator!() const { return !p; }
|
||||||
operator bool() const { return p; }
|
operator bool() const { return p; }
|
||||||
operator bool() { return p; }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
uint16_t cksum(const IpPtr &ptr);
|
uint16_t cksum(const IpPtr &ptr);
|
||||||
|
@ -278,30 +276,27 @@ class TcpPtr
|
||||||
EthPacketPtr p;
|
EthPacketPtr p;
|
||||||
int off;
|
int off;
|
||||||
|
|
||||||
const TcpHdr *h() const { return (const TcpHdr *)(p->data + off); }
|
|
||||||
TcpHdr *h() { return (TcpHdr *)(p->data + off); }
|
|
||||||
|
|
||||||
void set(const EthPacketPtr &ptr, int offset) { p = ptr; off = offset; }
|
void set(const EthPacketPtr &ptr, int offset) { p = ptr; off = offset; }
|
||||||
void set(const IpPtr &ptr)
|
void set(const IpPtr &ptr)
|
||||||
{
|
{
|
||||||
if (ptr->proto() == IP_PROTO_TCP)
|
if (ptr && ptr->proto() == IP_PROTO_TCP)
|
||||||
set(ptr.p, sizeof(eth_hdr) + ptr->hlen());
|
set(ptr.p, sizeof(eth_hdr) + ptr->hlen());
|
||||||
else
|
else
|
||||||
set(0, 0);
|
set(0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TcpPtr() {}
|
TcpPtr() : p(0), off(0) {}
|
||||||
TcpPtr(const IpPtr &ptr) { set(ptr); }
|
TcpPtr(const IpPtr &ptr) : p(0), off(0) { set(ptr); }
|
||||||
TcpPtr(const TcpPtr &ptr) : p(ptr.p), off(ptr.off) {}
|
TcpPtr(const TcpPtr &ptr) : p(ptr.p), off(ptr.off) {}
|
||||||
|
|
||||||
TcpHdr *operator->() { return h(); }
|
TcpHdr *get() { return (TcpHdr *)(p->data + off); }
|
||||||
TcpHdr &operator*() { return *h(); }
|
TcpHdr *operator->() { return get(); }
|
||||||
operator TcpHdr *() { return h(); }
|
TcpHdr &operator*() { return *get(); }
|
||||||
|
|
||||||
const TcpHdr *operator->() const { return h(); }
|
const TcpHdr *get() const { return (const TcpHdr *)(p->data + off); }
|
||||||
const TcpHdr &operator*() const { return *h(); }
|
const TcpHdr *operator->() const { return get(); }
|
||||||
operator const TcpHdr *() const { return h(); }
|
const TcpHdr &operator*() const { return *get(); }
|
||||||
|
|
||||||
const TcpPtr &operator=(const IpPtr &i) { set(i); return *this; }
|
const TcpPtr &operator=(const IpPtr &i) { set(i); return *this; }
|
||||||
const TcpPtr &operator=(const TcpPtr &t) { set(t.p, t.off); return *this; }
|
const TcpPtr &operator=(const TcpPtr &t) { set(t.p, t.off); return *this; }
|
||||||
|
@ -310,7 +305,6 @@ class TcpPtr
|
||||||
EthPacketPtr packet() { return p; }
|
EthPacketPtr packet() { return p; }
|
||||||
bool operator!() const { return !p; }
|
bool operator!() const { return !p; }
|
||||||
operator bool() const { return p; }
|
operator bool() const { return p; }
|
||||||
operator bool() { return p; }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
uint16_t cksum(const TcpPtr &ptr);
|
uint16_t cksum(const TcpPtr &ptr);
|
||||||
|
@ -368,30 +362,27 @@ class UdpPtr
|
||||||
EthPacketPtr p;
|
EthPacketPtr p;
|
||||||
int off;
|
int off;
|
||||||
|
|
||||||
const UdpHdr *h() const { return (const UdpHdr *)(p->data + off); }
|
|
||||||
UdpHdr *h() { return (UdpHdr *)(p->data + off); }
|
|
||||||
|
|
||||||
void set(const EthPacketPtr &ptr, int offset) { p = ptr; off = offset; }
|
void set(const EthPacketPtr &ptr, int offset) { p = ptr; off = offset; }
|
||||||
void set(const IpPtr &ptr)
|
void set(const IpPtr &ptr)
|
||||||
{
|
{
|
||||||
if (ptr->proto() == IP_PROTO_UDP)
|
if (ptr && ptr->proto() == IP_PROTO_UDP)
|
||||||
set(ptr.p, sizeof(eth_hdr) + ptr->hlen());
|
set(ptr.p, sizeof(eth_hdr) + ptr->hlen());
|
||||||
else
|
else
|
||||||
set(0, 0);
|
set(0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
UdpPtr() {}
|
UdpPtr() : p(0), off(0) {}
|
||||||
UdpPtr(const IpPtr &ptr) { set(ptr); }
|
UdpPtr(const IpPtr &ptr) : p(0), off(0) { set(ptr); }
|
||||||
UdpPtr(const UdpPtr &ptr) : p(ptr.p), off(ptr.off) {}
|
UdpPtr(const UdpPtr &ptr) : p(ptr.p), off(ptr.off) {}
|
||||||
|
|
||||||
UdpHdr *operator->() { return h(); }
|
UdpHdr *get() { return (UdpHdr *)(p->data + off); }
|
||||||
UdpHdr &operator*() { return *h(); }
|
UdpHdr *operator->() { return get(); }
|
||||||
operator UdpHdr *() { return h(); }
|
UdpHdr &operator*() { return *get(); }
|
||||||
|
|
||||||
const UdpHdr *operator->() const { return h(); }
|
const UdpHdr *get() const { return (const UdpHdr *)(p->data + off); }
|
||||||
const UdpHdr &operator*() const { return *h(); }
|
const UdpHdr *operator->() const { return get(); }
|
||||||
operator const UdpHdr *() const { return h(); }
|
const UdpHdr &operator*() const { return *get(); }
|
||||||
|
|
||||||
const UdpPtr &operator=(const IpPtr &i) { set(i); return *this; }
|
const UdpPtr &operator=(const IpPtr &i) { set(i); return *this; }
|
||||||
const UdpPtr &operator=(const UdpPtr &t) { set(t.p, t.off); return *this; }
|
const UdpPtr &operator=(const UdpPtr &t) { set(t.p, t.off); return *this; }
|
||||||
|
@ -400,7 +391,6 @@ class UdpPtr
|
||||||
EthPacketPtr packet() { return p; }
|
EthPacketPtr packet() { return p; }
|
||||||
bool operator!() const { return !p; }
|
bool operator!() const { return !p; }
|
||||||
operator bool() const { return p; }
|
operator bool() const { return p; }
|
||||||
operator bool() { return p; }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
uint16_t cksum(const UdpPtr &ptr);
|
uint16_t cksum(const UdpPtr &ptr);
|
||||||
|
|
|
@ -2036,19 +2036,34 @@ NSGigE::txKick()
|
||||||
IpPtr ip(txPacket);
|
IpPtr ip(txPacket);
|
||||||
if (extsts & EXTSTS_UDPPKT) {
|
if (extsts & EXTSTS_UDPPKT) {
|
||||||
UdpPtr udp(ip);
|
UdpPtr udp(ip);
|
||||||
udp->sum(0);
|
if (udp) {
|
||||||
udp->sum(cksum(udp));
|
udp->sum(0);
|
||||||
txUdpChecksums++;
|
udp->sum(cksum(udp));
|
||||||
|
txUdpChecksums++;
|
||||||
|
} else {
|
||||||
|
debug_break();
|
||||||
|
warn_once("UDPPKT set, but not UDP!\n");
|
||||||
|
}
|
||||||
} else if (extsts & EXTSTS_TCPPKT) {
|
} else if (extsts & EXTSTS_TCPPKT) {
|
||||||
TcpPtr tcp(ip);
|
TcpPtr tcp(ip);
|
||||||
tcp->sum(0);
|
if (tcp) {
|
||||||
tcp->sum(cksum(tcp));
|
tcp->sum(0);
|
||||||
txTcpChecksums++;
|
tcp->sum(cksum(tcp));
|
||||||
|
txTcpChecksums++;
|
||||||
|
} else {
|
||||||
|
debug_break();
|
||||||
|
warn_once("TCPPKT set, but not UDP!\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (extsts & EXTSTS_IPPKT) {
|
if (extsts & EXTSTS_IPPKT) {
|
||||||
ip->sum(0);
|
if (ip) {
|
||||||
ip->sum(cksum(ip));
|
ip->sum(0);
|
||||||
txIpChecksums++;
|
ip->sum(cksum(ip));
|
||||||
|
txIpChecksums++;
|
||||||
|
} else {
|
||||||
|
debug_break();
|
||||||
|
warn_once("IPPKT set, but not UDP!\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue