diff options
Diffstat (limited to 'scripts/external_libs/dpkt-1.8.6/dpkt/dhcp.py')
-rw-r--r-- | scripts/external_libs/dpkt-1.8.6/dpkt/dhcp.py | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/scripts/external_libs/dpkt-1.8.6/dpkt/dhcp.py b/scripts/external_libs/dpkt-1.8.6/dpkt/dhcp.py new file mode 100644 index 00000000..9916884a --- /dev/null +++ b/scripts/external_libs/dpkt-1.8.6/dpkt/dhcp.py @@ -0,0 +1,168 @@ +# $Id: dhcp.py 23 2006-11-08 15:45:33Z dugsong $ + +"""Dynamic Host Configuration Protocol.""" + +import arp, dpkt + +DHCP_OP_REQUEST = 1 +DHCP_OP_REPLY = 2 + +DHCP_MAGIC = 0x63825363 + +# DHCP option codes +DHCP_OPT_NETMASK = 1 # I: subnet mask +DHCP_OPT_TIMEOFFSET = 2 +DHCP_OPT_ROUTER = 3 # s: list of router ips +DHCP_OPT_TIMESERVER = 4 +DHCP_OPT_NAMESERVER = 5 +DHCP_OPT_DNS_SVRS = 6 # s: list of DNS servers +DHCP_OPT_LOGSERV = 7 +DHCP_OPT_COOKIESERV = 8 +DHCP_OPT_LPRSERV = 9 +DHCP_OPT_IMPSERV = 10 +DHCP_OPT_RESSERV = 11 +DHCP_OPT_HOSTNAME = 12 # s: client hostname +DHCP_OPT_BOOTFILESIZE = 13 +DHCP_OPT_DUMPFILE = 14 +DHCP_OPT_DOMAIN = 15 # s: domain name +DHCP_OPT_SWAPSERV = 16 +DHCP_OPT_ROOTPATH = 17 +DHCP_OPT_EXTENPATH = 18 +DHCP_OPT_IPFORWARD = 19 +DHCP_OPT_SRCROUTE = 20 +DHCP_OPT_POLICYFILTER = 21 +DHCP_OPT_MAXASMSIZE = 22 +DHCP_OPT_IPTTL = 23 +DHCP_OPT_MTUTIMEOUT = 24 +DHCP_OPT_MTUTABLE = 25 +DHCP_OPT_MTUSIZE = 26 +DHCP_OPT_LOCALSUBNETS = 27 +DHCP_OPT_BROADCASTADDR = 28 +DHCP_OPT_DOMASKDISCOV = 29 +DHCP_OPT_MASKSUPPLY = 30 +DHCP_OPT_DOROUTEDISC = 31 +DHCP_OPT_ROUTERSOLICIT = 32 +DHCP_OPT_STATICROUTE = 33 +DHCP_OPT_TRAILERENCAP = 34 +DHCP_OPT_ARPTIMEOUT = 35 +DHCP_OPT_ETHERENCAP = 36 +DHCP_OPT_TCPTTL = 37 +DHCP_OPT_TCPKEEPALIVE = 38 +DHCP_OPT_TCPALIVEGARBAGE = 39 +DHCP_OPT_NISDOMAIN = 40 +DHCP_OPT_NISSERVERS = 41 +DHCP_OPT_NISTIMESERV = 42 +DHCP_OPT_VENDSPECIFIC = 43 +DHCP_OPT_NBNS = 44 +DHCP_OPT_NBDD = 45 +DHCP_OPT_NBTCPIP = 46 +DHCP_OPT_NBTCPSCOPE = 47 +DHCP_OPT_XFONT = 48 +DHCP_OPT_XDISPLAYMGR = 49 +DHCP_OPT_REQ_IP = 50 # I: IP address +DHCP_OPT_LEASE_SEC = 51 # I: lease seconds +DHCP_OPT_OPTIONOVERLOAD = 52 +DHCP_OPT_MSGTYPE = 53 # B: message type +DHCP_OPT_SERVER_ID = 54 # I: server IP address +DHCP_OPT_PARAM_REQ = 55 # s: list of option codes +DHCP_OPT_MESSAGE = 56 +DHCP_OPT_MAXMSGSIZE = 57 +DHCP_OPT_RENEWTIME = 58 +DHCP_OPT_REBINDTIME = 59 +DHCP_OPT_VENDOR_ID = 60 # s: vendor class id +DHCP_OPT_CLIENT_ID = 61 # Bs: idtype, id (idtype 0: FQDN, idtype 1: MAC) +DHCP_OPT_NISPLUSDOMAIN = 64 +DHCP_OPT_NISPLUSSERVERS = 65 +DHCP_OPT_MOBILEIPAGENT = 68 +DHCP_OPT_SMTPSERVER = 69 +DHCP_OPT_POP3SERVER = 70 +DHCP_OPT_NNTPSERVER = 71 +DHCP_OPT_WWWSERVER = 72 +DHCP_OPT_FINGERSERVER = 73 +DHCP_OPT_IRCSERVER = 74 +DHCP_OPT_STSERVER = 75 +DHCP_OPT_STDASERVER = 76 + +# DHCP message type values +DHCPDISCOVER = 1 +DHCPOFFER = 2 +DHCPREQUEST = 3 +DHCPDECLINE = 4 +DHCPACK = 5 +DHCPNAK = 6 +DHCPRELEASE = 7 +DHCPINFORM = 8 + +class DHCP(dpkt.Packet): + __hdr__ = ( + ('op', 'B', DHCP_OP_REQUEST), + ('hrd', 'B', arp.ARP_HRD_ETH), # just like ARP.hrd + ('hln', 'B', 6), # and ARP.hln + ('hops', 'B', 0), + ('xid', 'I', 0xdeadbeefL), + ('secs', 'H', 0), + ('flags', 'H', 0), + ('ciaddr', 'I', 0), + ('yiaddr', 'I', 0), + ('siaddr', 'I', 0), + ('giaddr', 'I', 0), + ('chaddr', '16s', 16 * '\x00'), + ('sname', '64s', 64 * '\x00'), + ('file', '128s', 128 * '\x00'), + ('magic', 'I', DHCP_MAGIC), + ) + opts = ( + (DHCP_OPT_MSGTYPE, chr(DHCPDISCOVER)), + (DHCP_OPT_PARAM_REQ, ''.join(map(chr, (DHCP_OPT_REQ_IP, + DHCP_OPT_ROUTER, + DHCP_OPT_NETMASK, + DHCP_OPT_DNS_SVRS)))) + ) # list of (type, data) tuples + + def __len__(self): + return self.__hdr_len__ + \ + sum([ 2 + len(o[1]) for o in self.opts ]) + 1 + len(self.data) + + def __str__(self): + return self.pack_hdr() + self.pack_opts() + str(self.data) + + def pack_opts(self): + """Return packed options string.""" + if not self.opts: + return '' + l = [] + for t, data in self.opts: + l.append('%s%s%s' % (chr(t), chr(len(data)), data)) + l.append('\xff') + return ''.join(l) + + def unpack(self, buf): + dpkt.Packet.unpack(self, buf) + self.chaddr = self.chaddr[:self.hln] + buf = self.data + l = [] + while buf: + t = ord(buf[0]) + if t == 0xff: + buf = buf[1:] + break + elif t == 0: + buf = buf[1:] + else: + n = ord(buf[1]) + l.append((t, buf[2:2+n])) + buf = buf[2+n:] + self.opts = l + self.data = buf + +if __name__ == '__main__': + import unittest + + class DHCPTestCast(unittest.TestCase): + def test_DHCP(self): + s = '\x01\x01\x06\x00\xadS\xc8c\xb8\x87\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02U\x82\xf3\xa6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00c\x82Sc5\x01\x01\xfb\x01\x01=\x07\x01\x00\x02U\x82\xf3\xa62\x04\n\x00\x01e\x0c\tGuinevere<\x08MSFT 5.07\n\x01\x0f\x03\x06,./\x1f!+\xff\x00\x00\x00\x00\x00' + dhcp = DHCP(s) + self.failUnless(s == str(dhcp)) + + unittest.main() + |