def getAVPs(self): """Returns a copy of the embedded AVPs in a list""" avps = [] u = Unpacker(self.payload) bytes_left = len(self.payload) while bytes_left != 0: sz = AVP.decodeSize(u, bytes_left) if sz == 0: raise InvalidAVPLengthError(self) a = AVP(1, "") a.decode(u, sz) avps.append(a) bytes_left -= sz return avps
def narrow(avp): """Convert generic AVP to AVP_Float64 Raises: InvalidAVPLengthError """ avps = [] u = Unpacker(avp.payload) bytes_left = len(avp.payload) while bytes_left != 0: sz = AVP.decodeSize(u, bytes_left) if sz == 0: raise InvalidAVPLengthError(avp) a = AVP(1, "") a.decode(u, sz) avps.append(a) bytes_left -= sz a = AVP_Grouped(avp.code, avps, avp.vendor_id) a.flags = avp.flags return a
def decode(self,unpacker,bytes): """Decode a message from on-the-wire format. The message is checked to be in valid format and the VPs to be of the correct length etc. Invalid/reserved bits are not checked. unpacker a xdrlib.Unpacker possibly containing a Diameter message bytes the bytes to try to decode Return the result for the decode operation. """ start = unpacker.get_position() if bytes < 4: return Message.decode_status_not_enough v_ml = unpacker.unpack_uint() version = v_ml>>24 sz = v_ml&0x00FFFFFF if version!=1: return Message.decode_status_garbage if sz<20: return Message.decode_status_garbage if (sz%4)!=0: return Message.decode_status_garbage unpacker.set_position(start) # header looks ok if bytes<sz: return Message.decode_status_not_enough self.hdr.decode(unpacker) self.avp = [] bytes_left = bytes - 20 while bytes_left>0: if bytes_left<8: return Message.decode_status_garbage avp_sz = AVP.decodeSize(unpacker,bytes_left) if avp_sz==0: return Message.decode_status_garbage if avp_sz > bytes_left: return Message.decode_status_garbage a = AVP(0,[]) a.decode(unpacker,avp_sz) self.avp.append(a) bytes_left -= avp_sz return Message.decode_status_decoded