#
# $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 "<C interface instance>"
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


syntax highlighted by Code2HTML, v. 0.9.1