コード例 #1
0
 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
コード例 #2
0
 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
コード例 #3
0
 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