Пример #1
0
 def get_option_numbers(self):
     if self.check_tcp(20):
         hdr_len = (self.pi.dp[12] >> 4)*4  # TCP header length
         if hdr_len <= 20 or self.pi.rem < hdr_len:
             # No options or incomplete options
             return None
         o_bytes = self.pi.dp[20:hdr_len];  o_len = hdr_len-20
         o_nbrs = ffi.new("uint8_t[]", o_len)
         x = n_opts = 0
         while x < o_len:
             opt = o_bytes[x]
             if opt == 0:  # End of option list
                 break
             elif opt == 1:  # No-op
                 x += 1;  continue
             t_len = o_bytes[x+1]
             if x+t_len > o_len:  # Not enough bytes!
                 break
             o_nbrs[n_opts] = opt;  n_opts += 1;
             if t_len != 0:
                 x += t_len
             else:
                 break
         numbers = ffi.new("uint8_t[]", n_opts)
         ffi.memmove(numbers, o_nbrs, n_opts)
         return numbers
     return None
Пример #2
0
 def option(self, opt_nbr):
     if opt_nbr < 2 or opt_nbr > 255:
         raise PltError("TCP option number < 2 or > 255")            
     if self.check_tcp(20):
         hdr_len = (self.pi.dp[12] >> 4)*4  # TCP header length
         if hdr_len <= 20 or self.pi.rem < hdr_len:
             # No options or incomplete options
             return None
         o_bytes = self.pi.dp[20:hdr_len];  o_len = hdr_len-20
         x = n_opts = 0
         while x < o_len:
             opt = o_bytes[x]
             if opt == 0:  # End of option list
                 break
             elif opt == 1:  # No-op
                 x += 1;  continue
             t_len = o_bytes[x+1]
             if x+t_len > o_len:  # Not enough bytes!
                 break
             if opt == opt_nbr:
                 if t_len == 2:
                     return True  # Option present
                 else:
                     val = self.pi.dp[20+x+2:20+x+t_len]
                     res = ffi.new("uint8_t[]", t_len-2)
                     ffi.memmove(res, val, t_len-2)
                     return res
             if t_len != 0:
                 x += t_len
             else:
                 break
     return None
Пример #3
0
import natkit as nk

from cplt import ffi, lib
import string

ba = bytearray.fromhex(u"1002 2004 3005 4006")
for b in ba: print "%02x " % b,
print

print "short[2] = %04x" % nk.ba_get_short(ba,2),
print "short[4] = %04x" % nk.ba_get_short(ba,4),
print "long[2]  = %08x" % nk.ba_get_long(ba,2),
print "long[5]  = %s\n" % nk.ba_get_long(ba,5)

s = string.join(str(ba), '')  # Make a cdata version of ba
cba = ffi.new("uint8_t[%d]" % len(s), s)
for b in cba: print "%02x " % b,
print

print "short[2] = %04x" % nk.ba_get_short(cba,2),
print "short[4] = %04x" % nk.ba_get_short(cba,4),
print "long[2]  = %08x" % nk.ba_get_long(cba,4),
print "long[5]  = %s\n" % nk.ba_get_long(cba,5)

a=5;  b=6
print "a=%x, b=%x,  a>b = %s" % (a, b, nk.seq_gt(a,b))
print "a=%x, b=%x, a>=b = %s" % (a, b, nk.seq_ge(a,b))
print "a=%x, b=%x, a<b  = %s\n" % (a, b, nk.seq_lt(a,b))

a = 0xffff0000;  b = 0xfffeffff  # b < a
print "a=%x, b=%x,  a+b= %x" % (a, b, nk.seq_add(a,b))
Пример #4
0
 def get_transport(self):
     self.check_pkt()
     new_pi = ffi.new("struct pi *")
     if lib.get_transport_info(new_pi, self.pi):
         new_pi.o_type = TYPE_L4;  new_pi.o_kind = KIND_PKT
         return _transport_obj(new_pi, self.mom)
Пример #5
0
 def __init__(self):
     self.p = lib.trace_create_packet()  # Instance variables
     self.pi = ffi.new("struct pi *")
     self.mom = self