# # $Id: libnet.py,v 1.1.1.1 2001/10/15 06:54:55 davidma Exp $ # # Python libnet # Copyright (C) 2001, David Margrave (davidma@eskimo.com) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # import libnetc import string protocol_headers = ['tcp_options', 'tcp_header', 'udp_header', 'icmp_header'] # some purist will jump on me and say "internetwork" here. tough network_headers = ['arp_header', 'ip_header', 'ip_options'] mac_headers = ['eth_header'] def dumphex(s): bytes = map(lambda x: '%.2x ' % x, map(ord, s)) if len(s)>16: for i in range((len(s)+16)/16*16, 15, -16): bytes.insert(i,'\n') print string.join(bytes, '') class packet: def __init__(self): self.payload=None self.protocol_headers={} self.network_headers={} self.mac_headers={} def do_checksum(self, protocol, pkt_size): val = self.getvalue(macheader=0) ip_hdrlen = (ord(val[0]) & 0x0f) * 4 libnetc.do_checksum(val, protocol, pkt_size) if protocol==libnetc.IPPROTO_TCP: self.protocol_headers['tcp_header'] = val[ip_hdrlen:ip_hdrlen+pkt_size] if protocol==libnetc.IPPROTO_IP: self.network_headers['ip_header'] = val[0:ip_hdrlen] elif protocol==libnetc.IPPROTO_ICMP: self.protocol_headers['icmp_header'] = val[ip_hdrlen:] if protocol==libnetc.IPPROTO_TCP: self.protocol_headers['tcp_header'] = val[ip_hdrlen:ip_hdrlen+pkt_size] if protocol==libnetc.IPPROTO_UDP: self.protocol_headers['udp_header'] = val[ip_hdrlen:ip_hdrlen+pkt_size] def getvalue(self, macheader=1): value = '' if macheader: for val in mac_headers: if self.mac_headers.has_key(val): value = self.mac_headers[val] break for val in network_headers: if self.network_headers.has_key(val): value = value + self.network_headers[val] break for val in protocol_headers: if self.protocol_headers.has_key(val): value = value + self.protocol_headers[val] break if self.payload: value = value + self.payload return value def __repr__(self): return self.getvalue() def __len__(self): return len(self.__repr__()) def build_ethernet(self, *args, **kwargs): self.mac_headers['eth_header'] = apply(libnetc.build_ethernet, args, kwargs) def build_arp(self, *args, **kwargs): self.network_headers['arp_header'] = apply(libnetc.build_arp, args, kwargs) def build_ip(self, *args, **kwargs): self.network_headers['ip_header'] = apply(libnetc.build_ip, args, kwargs) def build_icmp_echo(self, *args, **kwargs): self.protocol_headers['icmp_header'] = apply(libnetc.build_icmp_echo, args, kwargs) def build_icmp_mask(self, *args, **kwargs): self.protocol_headers['icmp_header'] = apply(libnetc.build_icmp_mask, args, kwargs) def build_icmp_unreach(self, *args, **kwargs): self.protocol_headers['icmp_header'] = apply(libnetc.build_icmp_unreach, args, kwargs) def build_icmp_timeexceeded(self, *args, **kwargs): self.protocol_headers['icmp_header'] = apply(libnetc.build_icmp_timeexceeded, args, kwargs) def build_icmp_redirect(self, *args, **kwargs): self.protocol_headers['icmp_header'] = apply(libnetc.build_icmp_redirect, args, kwargs) def build_icmp_timestamp(self, *args, **kwargs): self.protocol_headers['icmp_header'] = apply(libnetc.build_icmp_timestamp, args, kwargs) def build_tcp(self, *args, **kwargs): self.protocol_headers['tcp_header'] = apply(libnetc.build_tcp, args, kwargs) def build_udp(self, *args, **kwargs): self.protocol_headers['udp_header'] = apply(libnetc.build_udp, args, kwargs) def build_dns(self, *args, **kwargs): self.payload = apply(libnetc.build_dns, args, kwargs) class interfacePtr : def __init__(self,this): self.this = this self.thisown = 0 def __del__(self): if self.thisown == 1 : libnetc.delete_interface(self.this) def open_link(self,arg0): val = libnetc.interface_open_link(self.this,arg0) return val def open_raw(self,arg0): val = libnetc.interface_open_raw(self.this,arg0) return val def write(self,arg0): if isinstance(arg0, packet): arg0=repr(arg0) val = libnetc.interface_write(self.this,arg0) return val def get_ipaddr(self): val = libnetc.interface_get_ipaddr(self.this) return val def get_hwaddr(self): val = libnetc.interface_get_hwaddr(self.this) return val def __setattr__(self,name,value): if name == "link" : libnetc.interface_link_set(self.this,value) return if name == "fd" : libnetc.interface_fd_set(self.this,value) return if name == "device" : libnetc.interface_device_set(self.this,value) return self.__dict__[name] = value def __getattr__(self,name): if name == "link" : return libnetc.interface_link_get(self.this) if name == "fd" : return libnetc.interface_fd_get(self.this) if name == "device" : return libnetc.interface_device_get(self.this) raise AttributeError,name def __repr__(self): return "" class interface(interfacePtr): def __init__(self) : self.this = libnetc.new_interface() self.thisown = 1 #-------------- FUNCTION WRAPPERS ------------------ build_arp = libnetc.build_arp build_dns = libnetc.build_dns build_ethernet = libnetc.build_ethernet build_icmp_echo = libnetc.build_icmp_echo build_icmp_mask = libnetc.build_icmp_mask build_icmp_unreach = libnetc.build_icmp_unreach build_icmp_timeexceed = libnetc.build_icmp_timeexceed build_icmp_timestamp = libnetc.build_icmp_timestamp build_icmp_redirect = libnetc.build_icmp_redirect build_ip = libnetc.build_ip build_tcp = libnetc.build_tcp build_udp = libnetc.build_udp select_device = libnetc.select_device host_lookup = libnetc.host_lookup name_resolve = libnetc.name_resolve #-------------- VARIABLE WRAPPERS ------------------ IPPROTO_IP = libnetc.IPPROTO_IP IPPROTO_TCP = libnetc.IPPROTO_TCP IPPROTO_UDP = libnetc.IPPROTO_UDP IPPROTO_ICMP = libnetc.IPPROTO_ICMP IPPROTO_IGMP = libnetc.IPPROTO_IGMP IPPROTO_OSPF = libnetc.IPPROTO_OSPF IPPROTO_OSPF_LSA = libnetc.IPPROTO_OSPF_LSA IPPROTO_VRRP = libnetc.IPPROTO_VRRP IPPROTO_RAW = libnetc.IPPROTO_RAW ARP_H = libnetc.ARP_H DNS_H = libnetc.DNS_H ETH_H = libnetc.ETH_H ICMP_H = libnetc.ICMP_H ICMP_ECHO_H = libnetc.ICMP_ECHO_H ICMP_MASK_H = libnetc.ICMP_MASK_H ICMP_UNREACH_H = libnetc.ICMP_UNREACH_H ICMP_TIMXCEED_H = libnetc.ICMP_TIMXCEED_H ICMP_REDIRECT_H = libnetc.ICMP_REDIRECT_H ICMP_TS_H = libnetc.ICMP_TS_H IGMP_H = libnetc.IGMP_H IP_H = libnetc.IP_H RIP_H = libnetc.RIP_H TCP_H = libnetc.TCP_H UDP_H = libnetc.UDP_H VRRP_H = libnetc.VRRP_H IP_MAXPACKET = libnetc.IP_MAXPACKET MAX_IPOPTLEN = libnetc.MAX_IPOPTLEN IP_OFFMASK = libnetc.IP_OFFMASK IP_DF = libnetc.IP_DF IP_MF = libnetc.IP_MF TH_URG = libnetc.TH_URG TH_ACK = libnetc.TH_ACK TH_PUSH = libnetc.TH_PUSH TH_RST = libnetc.TH_RST TH_SYN = libnetc.TH_SYN TH_FIN = libnetc.TH_FIN ICMP_ECHOREPLY = libnetc.ICMP_ECHOREPLY ICMP_UNREACH = libnetc.ICMP_UNREACH ICMP_SOURCEQUENCH = libnetc.ICMP_SOURCEQUENCH ICMP_REDIRECT = libnetc.ICMP_REDIRECT ICMP_ECHO = libnetc.ICMP_ECHO ICMP_ROUTERADVERT = libnetc.ICMP_ROUTERADVERT ICMP_ROUTERSOLICIT = libnetc.ICMP_ROUTERSOLICIT ICMP_TIMXCEED = libnetc.ICMP_TIMXCEED ICMP_PARAMPROB = libnetc.ICMP_PARAMPROB ICMP_TSTAMP = libnetc.ICMP_TSTAMP ICMP_TSTAMPREPLY = libnetc.ICMP_TSTAMPREPLY ICMP_IREQ = libnetc.ICMP_IREQ ICMP_IREQREPLY = libnetc.ICMP_IREQREPLY ICMP_MASKREQ = libnetc.ICMP_MASKREQ ICMP_MASKREPLY = libnetc.ICMP_MASKREPLY ICMP_UNREACH_NET = libnetc.ICMP_UNREACH_NET ICMP_UNREACH_HOST = libnetc.ICMP_UNREACH_HOST ICMP_UNREACH_PROTOCOL = libnetc.ICMP_UNREACH_PROTOCOL ICMP_UNREACH_PORT = libnetc.ICMP_UNREACH_PORT ICMP_UNREACH_NEEDFRAG = libnetc.ICMP_UNREACH_NEEDFRAG ICMP_UNREACH_SRCFAIL = libnetc.ICMP_UNREACH_SRCFAIL ICMP_UNREACH_NET_UNKNOWN = libnetc.ICMP_UNREACH_NET_UNKNOWN ICMP_UNREACH_HOST_UNKNOWN = libnetc.ICMP_UNREACH_HOST_UNKNOWN ICMP_UNREACH_ISOLATED = libnetc.ICMP_UNREACH_ISOLATED ICMP_UNREACH_NET_PROHIB = libnetc.ICMP_UNREACH_NET_PROHIB ICMP_UNREACH_HOST_PROHIB = libnetc.ICMP_UNREACH_HOST_PROHIB ICMP_UNREACH_TOSNET = libnetc.ICMP_UNREACH_TOSNET ICMP_UNREACH_TOSHOST = libnetc.ICMP_UNREACH_TOSHOST ICMP_UNREACH_FILTER_PROHIB = libnetc.ICMP_UNREACH_FILTER_PROHIB ICMP_UNREACH_HOST_PRECEDENCE = libnetc.ICMP_UNREACH_HOST_PRECEDENCE ICMP_UNREACH_PRECEDENCE_CUTOFF = libnetc.ICMP_UNREACH_PRECEDENCE_CUTOFF ICMP_REDIRECT_NET = libnetc.ICMP_REDIRECT_NET ICMP_REDIRECT_HOST = libnetc.ICMP_REDIRECT_HOST ICMP_REDIRECT_TOSNET = libnetc.ICMP_REDIRECT_TOSNET ICMP_REDIRECT_TOSHOST = libnetc.ICMP_REDIRECT_TOSHOST ICMP_TIMXCEED_INTRANS = libnetc.ICMP_TIMXCEED_INTRANS ICMP_TIMXCEED_REASS = libnetc.ICMP_TIMXCEED_REASS ICMP_PARAMPROB_OPTABSENT = libnetc.ICMP_PARAMPROB_OPTABSENT IGMP_MEMBERSHIP_QUERY = libnetc.IGMP_MEMBERSHIP_QUERY IGMP_V1_MEMBERSHIP_REPORT = libnetc.IGMP_V1_MEMBERSHIP_REPORT IGMP_V2_MEMBERSHIP_REPORT = libnetc.IGMP_V2_MEMBERSHIP_REPORT IGMP_LEAVE_GROUP = libnetc.IGMP_LEAVE_GROUP ARPHRD_ETHER = libnetc.ARPHRD_ETHER ARPOP_REQUEST = libnetc.ARPOP_REQUEST ARPOP_REPLY = libnetc.ARPOP_REPLY ARPOP_REVREQUEST = libnetc.ARPOP_REVREQUEST ARPOP_REVREPLY = libnetc.ARPOP_REVREPLY ARPOP_INVREQUEST = libnetc.ARPOP_INVREQUEST ARPOP_INVREPLY = libnetc.ARPOP_INVREPLY RIPCMD_REQUEST = libnetc.RIPCMD_REQUEST RIPCMD_RESPONSE = libnetc.RIPCMD_RESPONSE RIPCMD_TRACEON = libnetc.RIPCMD_TRACEON RIPCMD_TRACEOFF = libnetc.RIPCMD_TRACEOFF RIPCMD_POLL = libnetc.RIPCMD_POLL RIPCMD_POLLENTRY = libnetc.RIPCMD_POLLENTRY RIPCMD_MAX = libnetc.RIPCMD_MAX RIPVER_0 = libnetc.RIPVER_0 RIPVER_1 = libnetc.RIPVER_1 RIPVER_2 = libnetc.RIPVER_2 OSPF_H = libnetc.OSPF_H HELLO_H = libnetc.HELLO_H DBD_H = libnetc.DBD_H LSR_H = libnetc.LSR_H LSU_H = libnetc.LSU_H LSA_H = libnetc.LSA_H AUTH_H = libnetc.AUTH_H OSPF_CKSUM = libnetc.OSPF_CKSUM LS_RTR_LEN = libnetc.LS_RTR_LEN LS_NET_LEN = libnetc.LS_NET_LEN LS_SUM_LEN = libnetc.LS_SUM_LEN LS_AS_EXT_LEN = libnetc.LS_AS_EXT_LEN OSPF_UMD = libnetc.OSPF_UMD OSPF_HELLO = libnetc.OSPF_HELLO OSPF_DBD = libnetc.OSPF_DBD OSPF_LSR = libnetc.OSPF_LSR OSPF_LSU = libnetc.OSPF_LSU OSPF_LSA = libnetc.OSPF_LSA OSPF_AUTH_NULL = libnetc.OSPF_AUTH_NULL OSPF_AUTH_SIMPLE = libnetc.OSPF_AUTH_SIMPLE OSPF_AUTH_MD5 = libnetc.OSPF_AUTH_MD5 OPT_EBIT = libnetc.OPT_EBIT OPT_MCBIT = libnetc.OPT_MCBIT OPT_NPBIT = libnetc.OPT_NPBIT OPT_EABIT = libnetc.OPT_EABIT OPT_DCBIT = libnetc.OPT_DCBIT DBD_IBIT = libnetc.DBD_IBIT DBD_MBIT = libnetc.DBD_MBIT DBD_MSBIT = libnetc.DBD_MSBIT LS_TYPE_RTR = libnetc.LS_TYPE_RTR LS_TYPE_NET = libnetc.LS_TYPE_NET LS_TYPE_IP = libnetc.LS_TYPE_IP LS_TYPE_ASBR = libnetc.LS_TYPE_ASBR LS_TYPE_ASEXT = libnetc.LS_TYPE_ASEXT RTR_FLAGS_W = libnetc.RTR_FLAGS_W RTR_FLAGS_E = libnetc.RTR_FLAGS_E RTR_FLAGS_B = libnetc.RTR_FLAGS_B LINK_ID_NBR_ID = libnetc.LINK_ID_NBR_ID LINK_ID_IP_DES = libnetc.LINK_ID_IP_DES LINK_ID_SUB = libnetc.LINK_ID_SUB RTR_TYPE_PTP = libnetc.RTR_TYPE_PTP RTR_TYPE_TRANS = libnetc.RTR_TYPE_TRANS RTR_TYPE_STUB = libnetc.RTR_TYPE_STUB AS_E_BIT_ON = libnetc.AS_E_BIT_ON VRRP_TYPE_ADVERT = libnetc.VRRP_TYPE_ADVERT VRRP_AUTH_NONE = libnetc.VRRP_AUTH_NONE VRRP_AUTH_PASSWD = libnetc.VRRP_AUTH_PASSWD VRRP_AUTH_IPAH = libnetc.VRRP_AUTH_IPAH PRAND_MAX = libnetc.PRAND_MAX PR2 = libnetc.PR2 PR8 = libnetc.PR8 PR16 = libnetc.PR16 PRu16 = libnetc.PRu16 PR32 = libnetc.PR32 PRu32 = libnetc.PRu32 ERR_WARNING = libnetc.ERR_WARNING ERR_CRITICAL = libnetc.ERR_CRITICAL ERR_FATAL = libnetc.ERR_FATAL DONT_RESOLVE = libnetc.DONT_RESOLVE RESOLVE = libnetc.RESOLVE ETHER_ADDR_LEN = libnetc.ETHER_ADDR_LEN ETHERTYPE_PUP = libnetc.ETHERTYPE_PUP ETHERTYPE_IP = libnetc.ETHERTYPE_IP ETHERTYPE_ARP = libnetc.ETHERTYPE_ARP ETHERTYPE_REVARP = libnetc.ETHERTYPE_REVARP ETHERTYPE_VLAN = libnetc.ETHERTYPE_VLAN ETHERTYPE_LOOPBACK = libnetc.ETHERTYPE_LOOPBACK