'takes ethernet data and determines if it contains IP or IP6.
defragments IPv4
if 6to4, unencaps the IPv6
If IP/IP6, hands off to IPDecoder via IPHandler()'

def rawHandler(self, pktlen, pkt, ts, **kwargs):

    try:
        if (type(pkt.data) == dpkt.ip.IP):
            if self.defrag:
                pkt = self.ipdefrag(pkt.data)
            else:
                pkt = pkt.data
            if pkt:
                if (self.decode6to4 and (pkt.p == dpkt.ip.IP_PROTO_IP6)):
                    pass
                elif (not self.v6only):
                    (sip, dip) = (socket.inet_ntoa(pkt.src), socket.inet_ntoa(pkt.dst))
                    try:
                        (sport, dport) = (pkt.data.sport, pkt.data.dport)
                    except:
                        (sport, dport) = (None, None)
                    (sipint, dipint) = (struct.unpack('!L', pkt.src)[0], struct.unpack('!L', pkt.dst)[0])
                    self.IPHandler(((sip, sport), (dip, dport)), pkt, ts, pkttype=dpkt.ethernet.ETH_TYPE_IP, proto=self.IP_PROTO_MAP.get(pkt.p, pkt.p), sipint=sipint, dipint=dipint, **kwargs)
        if (pkt and (type(pkt.data) == dpkt.ip6.IP6)):
            pkt = pkt.data
            (sip, dip) = (socket.inet_ntop(socket.AF_INET6, pkt.src), socket.inet_ntop(socket.AF_INET6, pkt.dst))
            try:
                (sport, dport) = (pkt.data.sport, pkt.data.dport)
            except:
                (sport, dport) = (None, None)
            (h, l) = struct.unpack('!QQ', pkt.src)
            sipint = ((h << 64) | l)
            (h, l) = struct.unpack('!QQ', pkt.dst)
            dipint = ((h << 64) | l)
            self.IPHandler(((sip, sport), (dip, dport)), pkt, ts, pkttype=dpkt.ethernet.ETH_TYPE_IP6, proto=self.IP_PROTO_MAP.get(pkt.nxt, pkt.nxt), sipint=sipint, dipint=dipint, **kwargs)
    except Exception as e:
        self._exc(e)
