"""PPP-over-Ethernet.""" from pypacker import pypacker from pypacker.layer12.ppp import PPP import struct # RFC 2516 codes PPPoE_PADI = 0x09 PPPoE_PADO = 0x07 PPPoE_PADR = 0x19 PPPoE_PADS = 0x65 PPPoE_PADT = 0xA7 PPPoE_SESSION = 0x00 class PPPoE(pypacker.Packet): __hdr__ = ( ("v_type", "B", 0x11), ("code", "B", 0), ("session", "H", 0), ("len", "H", 0) # payload length ) def __get_v(self): return self.v_type >> 4 def __set_v(self, v): self.v_type = (v << 4) | (self.v_type & 0xf) v = property(__get_v, __set_v) def __get_type(self): return self.v_type & 0xf def __set_type(self, t): self.v_type = (self.v_type & 0xf0) | t type = property(__get_type, __set_type) def _dissect(self, buf): code = buf[1] if code == PPPoE_SESSION: try: self._set_bodyhandler(PPP(buf[6:])) except (KeyError, struct.error, pypacker.UnpackError): pass else: pass return 6 # XXX - TODO TLVs, etc.