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
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
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))
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)
def __init__(self): self.p = lib.trace_create_packet() # Instance variables self.pi = ffi.new("struct pi *") self.mom = self