def __init__(self, localAddress, eID=None): if _debug: BIPNetworkApplication._debug("__init__ %r eID=%r", localAddress, eID) NetworkServiceElement.__init__(self, eID) # allow the address to be cast to the correct type if isinstance(localAddress, Address): self.localAddress = localAddress else: self.localAddress = Address(localAddress) # a network service access point will be needed self.nsap = NetworkServiceAccessPoint() # give the NSAP a generic network layer service element bind(self, self.nsap) # create a generic BIP stack, bound to the Annex J server # on the UDP multiplexer self.bip = BIPSimple() self.annexj = AnnexJCodec() self.mux = UDPMultiplexer(self.localAddress) # bind the bottom layers bind(self.bip, self.annexj, self.mux.annexJ) # bind the NSAP to the stack, no network number self.nsap.bind(self.bip)
def __init__(self, localDevice, localAddress, aseID=None): if _debug: Application._debug("__init__ %r %r aseID=%r", localDevice, localAddress, aseID) ApplicationServiceElement.__init__(self, aseID) # keep track of the local device self.localDevice = localDevice # allow the address to be cast to the correct type if isinstance(localAddress, Address): self.localAddress = localAddress else: self.localAddress = Address(localAddress) # local objects by ID and name self.objectName = {localDevice.objectName: localDevice} self.objectIdentifier = {localDevice.objectIdentifier: localDevice}
def decode_packet(data): """decode the data, return some kind of PDU.""" if _debug: decode_packet._debug("decode_packet %r", data) # empty strings are some other kind of pcap content if not data: return None # assume it is ethernet for now d = decode_ethernet(data) data = d['data'] # there could be a VLAN header if (d['type'] == 0x8100): if _debug: decode_packet._debug(" - vlan found") d = decode_vlan(data) data = d['data'] # look for IP packets if (d['type'] == 0x0800): if _debug: decode_packet._debug(" - IP found") d = decode_ip(data) pduSource, pduDestination = d['source_address'], d[ 'destination_address'] data = d['data'] if (d['protocol'] == 'udp'): if _debug: decode_packet._debug(" - UDP found") d = decode_udp(data) data = d['data'] pduSource = Address((pduSource, d['source_port'])) pduDestination = Address((pduDestination, d['destination_port'])) if _debug: decode_packet._debug(" - pduSource: %r", pduSource) decode_packet._debug(" - pduDestination: %r", pduDestination) else: if _debug: decode_packet._debug(" - not a UDP packet") return None else: if _debug: decode_packet._debug(" - not an IP packet") return None # check for empty if not data: if _debug: decode_packet._debug(" - empty packet") return None # build a PDU pdu = PDU(data, source=pduSource, destination=pduDestination) # check for a BVLL header if (pdu.pduData[0] == '\x81'): if _debug: decode_packet._debug(" - BVLL header found") xpdu = BVLPDU() xpdu.decode(pdu) pdu = xpdu # make a more focused interpretation atype = bvl_pdu_types.get(pdu.bvlciFunction) if not atype: if _debug: decode_packet._debug(" - unknown BVLL type: %r", pdu.bvlciFunction) return pdu # decode it as one of the basic types try: xpdu = pdu bpdu = atype() bpdu.decode(pdu) if _debug: decode_packet._debug(" - bpdu: %r", bpdu) pdu = bpdu # lift the address for forwarded NPDU's if atype is ForwardedNPDU: pdu.pduSource = bpdu.bvlciAddress # no deeper decoding for some elif atype not in (DistributeBroadcastToNetwork, OriginalUnicastNPDU, OriginalBroadcastNPDU): return pdu except Exception, err: if _debug: decode_packet._debug(" - decoding Error: %r", err) return xpdu
def decode_packet(data): """decode the data, return some kind of PDU.""" if _debug: decode_packet._debug("decode_packet %r", data) # empty strings are some other kind of pcap content if not data: return None # assume it is ethernet for now d = decode_ethernet(data) data = d['data'] # there could be a VLAN header if (d['type'] == 0x8100): if _debug: decode_packet._debug(" - vlan found") d = decode_vlan(data) data = d['data'] # look for IP packets if (d['type'] == 0x0800): if _debug: decode_packet._debug(" - IP found") d = decode_ip(data) pduSource, pduDestination = d['source_address'], d[ 'destination_address'] data = d['data'] if (d['protocol'] == 'udp'): if _debug: decode_packet._debug(" - UDP found") d = decode_udp(data) data = d['data'] pduSource = Address((pduSource, d['source_port'])) pduDestination = Address((pduDestination, d['destination_port'])) if _debug: decode_packet._debug(" - pduSource: %r", pduSource) decode_packet._debug(" - pduDestination: %r", pduDestination) else: if _debug: decode_packet._debug(" - not a UDP packet") return None else: if _debug: decode_packet._debug(" - not an IP packet") return None # check for empty if not data: if _debug: decode_packet._debug(" - empty packet") return None # build a PDU pdu = PDU(data, source=pduSource, destination=pduDestination) # check for a BVLL header if (pdu.pduData[0] == '\x81'): if _debug: decode_packet._debug(" - BVLL header found") xpdu = BVLPDU() xpdu.decode(pdu) pdu = xpdu # make a more focused interpretation atype = bvl_pdu_types.get(pdu.bvlciFunction) if not atype: if _debug: decode_packet._debug(" - unknown BVLL type: %r", pdu.bvlciFunction) return pdu # decode it as one of the basic types try: xpdu = pdu bpdu = atype() bpdu.decode(pdu) if _debug: decode_packet._debug(" - bpdu: %r", bpdu) pdu = bpdu # lift the address for forwarded NPDU's if atype is ForwardedNPDU: pdu.pduSource = bpdu.bvlciAddress # no deeper decoding for some elif atype not in (DistributeBroadcastToNetwork, OriginalUnicastNPDU, OriginalBroadcastNPDU): return pdu except Exception as err: if _debug: decode_packet._debug(" - decoding Error: %r", err) return xpdu # check for version number if (pdu.pduData[0] != '\x01'): if _debug: decode_packet._debug(" - not a version 1 packet: %s...", _hexify(pdu.pduData[:30])) return None # it's an NPDU try: npdu = NPDU() npdu.decode(pdu) except Exception as err: if _debug: decode_packet._debug(" - decoding Error: %r", err) return None # application or network layer message if npdu.npduNetMessage is None: if _debug: decode_packet._debug( " - not a network layer message, try as an APDU") # decode as a generic APDU try: xpdu = APDU() xpdu.decode(npdu) apdu = xpdu except Exception as err: if _debug: decode_packet._debug(" - decoding Error: %r", err) return npdu # "lift" the source and destination address if npdu.npduSADR: apdu.pduSource = npdu.npduSADR else: apdu.pduSource = npdu.pduSource if npdu.npduDADR: apdu.pduDestination = npdu.npduDADR else: apdu.pduDestination = npdu.pduDestination # make a more focused interpretation atype = apdu_types.get(apdu.apduType) if not atype: if _debug: decode_packet._debug(" - unknown APDU type: %r", apdu.apduType) return apdu # decode it as one of the basic types try: xpdu = apdu apdu = atype() apdu.decode(xpdu) except Exception as err: if _debug: decode_packet._debug(" - decoding Error: %r", err) return xpdu # decode it at the next level if isinstance(apdu, ConfirmedRequestPDU): atype = confirmed_request_types.get(apdu.apduService) if not atype: if _debug: decode_packet._debug( " - no confirmed request decoder: %r", apdu.apduService) return apdu elif isinstance(apdu, UnconfirmedRequestPDU): atype = unconfirmed_request_types.get(apdu.apduService) if not atype: if _debug: decode_packet._debug( " - no unconfirmed request decoder: %r", apdu.apduService) return apdu elif isinstance(apdu, SimpleAckPDU): atype = None elif isinstance(apdu, ComplexAckPDU): atype = complex_ack_types.get(apdu.apduService) if not atype: if _debug: decode_packet._debug(" - no complex ack decoder: %r", apdu.apduService) return apdu elif isinstance(apdu, SegmentAckPDU): atype = None elif isinstance(apdu, ErrorPDU): atype = error_types.get(apdu.apduService) if not atype: if _debug: decode_packet._debug(" - no error decoder: %r", apdu.apduService) return apdu elif isinstance(apdu, RejectPDU): atype = None elif isinstance(apdu, AbortPDU): atype = None if _debug: decode_packet._debug(" - atype: %r", atype) # deeper decoding try: if atype: xpdu = apdu apdu = atype() apdu.decode(xpdu) except Exception as err: if _debug: decode_packet._debug(" - decoding error: %r", err) return xpdu # success return apdu else: # make a more focused interpretation ntype = npdu_types.get(npdu.npduNetMessage) if not ntype: if _debug: decode_packet._debug(" - no network layer decoder: %r", npdu.npduNetMessage) return npdu if _debug: decode_packet._debug(" - ntype: %r", ntype) # deeper decoding try: xpdu = npdu npdu = ntype() npdu.decode(xpdu) except Exception as err: if _debug: decode_packet._debug(" - decoding error: %r", err) return xpdu # success return npdu