182,185d181
< const IpHdr *h() const
< { return (const IpHdr *)(p->data + sizeof(eth_hdr)); }
< IpHdr *h() { return (IpHdr *)(p->data + sizeof(eth_hdr)); }
<
188,192c184,190
< EthHdr *eth = (EthHdr *)ptr->data;
< if (eth->type() == ETH_TYPE_IP)
< p = ptr;
< else
< p = 0;
---
> p = 0;
>
> if (ptr) {
> EthHdr *eth = (EthHdr *)ptr->data;
> if (eth->type() == ETH_TYPE_IP)
> p = ptr;
> }
196,198c194,196
< IpPtr() {}
< IpPtr(const EthPacketPtr &ptr) { set(ptr); }
< IpPtr(const EthPtr &ptr) { set(ptr.p); }
---
> IpPtr() : p(0) {}
> IpPtr(const EthPacketPtr &ptr) : p(0) { set(ptr); }
> IpPtr(const EthPtr &ptr) : p(0) { set(ptr.p); }
201,203c199,201
< IpHdr *operator->() { return h(); }
< IpHdr &operator*() { return *h(); }
< operator IpHdr *() { return h(); }
---
> IpHdr *get() { return (IpHdr *)(p->data + sizeof(eth_hdr)); }
> IpHdr *operator->() { return get(); }
> IpHdr &operator*() { return *get(); }
205,207c203,206
< const IpHdr *operator->() const { return h(); }
< const IpHdr &operator*() const { return *h(); }
< operator const IpHdr *() const { return h(); }
---
> const IpHdr *get() const
> { return (const IpHdr *)(p->data + sizeof(eth_hdr)); }
> const IpHdr *operator->() const { return get(); }
> const IpHdr &operator*() const { return *get(); }
217d215
< operator bool() { return p; }
281,283d278
< const TcpHdr *h() const { return (const TcpHdr *)(p->data + off); }
< TcpHdr *h() { return (TcpHdr *)(p->data + off); }
<
287c282
< if (ptr->proto() == IP_PROTO_TCP)
---
> if (ptr && ptr->proto() == IP_PROTO_TCP)
294,295c289,290
< TcpPtr() {}
< TcpPtr(const IpPtr &ptr) { set(ptr); }
---
> TcpPtr() : p(0), off(0) {}
> TcpPtr(const IpPtr &ptr) : p(0), off(0) { set(ptr); }
298,300c293,295
< TcpHdr *operator->() { return h(); }
< TcpHdr &operator*() { return *h(); }
< operator TcpHdr *() { return h(); }
---
> TcpHdr *get() { return (TcpHdr *)(p->data + off); }
> TcpHdr *operator->() { return get(); }
> TcpHdr &operator*() { return *get(); }
302,304c297,299
< const TcpHdr *operator->() const { return h(); }
< const TcpHdr &operator*() const { return *h(); }
< operator const TcpHdr *() const { return h(); }
---
> const TcpHdr *get() const { return (const TcpHdr *)(p->data + off); }
> const TcpHdr *operator->() const { return get(); }
> const TcpHdr &operator*() const { return *get(); }
313d307
< operator bool() { return p; }
371,373d364
< const UdpHdr *h() const { return (const UdpHdr *)(p->data + off); }
< UdpHdr *h() { return (UdpHdr *)(p->data + off); }
<
377c368
< if (ptr->proto() == IP_PROTO_UDP)
---
> if (ptr && ptr->proto() == IP_PROTO_UDP)
384,385c375,376
< UdpPtr() {}
< UdpPtr(const IpPtr &ptr) { set(ptr); }
---
> UdpPtr() : p(0), off(0) {}
> UdpPtr(const IpPtr &ptr) : p(0), off(0) { set(ptr); }
388,390c379,381
< UdpHdr *operator->() { return h(); }
< UdpHdr &operator*() { return *h(); }
< operator UdpHdr *() { return h(); }
---
> UdpHdr *get() { return (UdpHdr *)(p->data + off); }
> UdpHdr *operator->() { return get(); }
> UdpHdr &operator*() { return *get(); }
392,394c383,385
< const UdpHdr *operator->() const { return h(); }
< const UdpHdr &operator*() const { return *h(); }
< operator const UdpHdr *() const { return h(); }
---
> const UdpHdr *get() const { return (const UdpHdr *)(p->data + off); }
> const UdpHdr *operator->() const { return get(); }
> const UdpHdr &operator*() const { return *get(); }
403d393
< operator bool() { return p; }