#define USI_VERSION 163
#ifndef _USIPP_H
#define _USIPP_H 1
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include "pcap/pcap.h"
#include "usi-structs.h"
#define ICMP_PORT 0
#ifdef USI_FREEBSD
#define PPP_LEN 24
#else
#define PPP_LEN 4
#endif
#define SLIP_LEN 24
#define MAXHOSTLEN 1000
class Datalink {
private:
int datalink, framelen;
pcap_t *pd;
bpf_u_int32 localnet, netmask;
struct bpf_program filter;
struct pcap_pkthdr phdr;
bool initialized;
protected:
char host[MAXHOSTLEN];
struct usipp::ether_header ether;
char filter_string[1000];
public:
Datalink();
Datalink(char *);
virtual ~Datalink();
char *get_hwsrc(char *, int);
char *get_hwdst(char *, int);
int get_etype();
int get_datalink();
int get_framelen();
const char *set_host(const char *);
virtual int init_device(char *, int, int);
virtual int setfilter(char *);
virtual int sniffpack(char *, int);
};
class ARP : public Datalink {
private:
struct usipp::ether_arp arphdr;
public:
ARP(char *, int); // device, promisc
virtual ~ARP();
char *get_sha(char *, int); // get source hardware-address
char *get_tha(char *, int); // get target
char *get_spa(int, char *, int);// get source protocol-adress
char *get_tpa(int, char *, int);// get target protcol-address
int get_op(); // get ARP-command
virtual int sniffpack();
};
class IP : public Datalink {
private:
struct usipp::iphdr iph;
char ipOptions[40];
struct sockaddr_in saddr;
int rawfd;
bool socketOpen;
char *reassemble(char *, int, int *);
public:
IP(const char*, u_int8_t); // IP("foo.foo");
IP(u_int32_t, u_int8_t);
virtual ~IP();
u_int8_t get_hlen();
u_int8_t get_vers();
u_int8_t get_tos();
u_int16_t get_totlen();
u_int16_t get_id();
u_int16_t get_fragoff();
u_int16_t get_fflags();
u_int8_t get_ttl();
u_int8_t get_proto();
u_int16_t get_sum();
u_int32_t get_src();
u_int32_t get_dst();
char *get_src(int, char *, int);
char *get_dst(int, char *, int);
int set_hlen(u_int8_t);
int set_vers(u_int8_t);
int set_tos(u_int8_t);
int set_totlen(u_int16_t);
int set_id(u_int16_t);
int set_fragoff(u_int16_t);
int set_fflags(u_int16_t);
int set_ttl(u_int8_t);
int set_proto(u_int8_t);
int set_sum(u_int16_t); // should NOT be used; just to be complete...
int set_src(u_int32_t);
int set_dst(u_int32_t);
int set_src(const char*);
int set_dst(const char*);
virtual int sendpack(void*, int);
virtual int sendpack(char*);
virtual int recvpack(void*, int);
virtual int sniffpack(void*, int);
virtual int init_device(char*, int, int);
friend unsigned short in_cksum(unsigned short*, int);
};
class ICMP : public IP {
private:
struct usipp::icmphdr icmphdr;
public:
ICMP(const char*);
virtual int sendpack(void*, int);
virtual int sendpack(char*);
virtual int recvpack(void*, int);
virtual int sniffpack(void*, int);
virtual int init_device(char*, int, int);
int set_type(u_int8_t);
int set_code(u_int8_t);
int set_icmpId(u_int16_t);
int set_seq(u_int16_t);
int set_gateway(u_int32_t);
int set_mtu(u_int16_t);
u_int8_t get_type();
u_int8_t get_code();
u_int16_t get_icmpId();
u_int16_t get_seq();
u_int32_t get_gateway();
u_int16_t get_mtu();
};
class UDP : public IP {
private:
struct usipp::udphdr udph;
struct usipp::pseudohdr pseudo;
public:
UDP(const char*);
u_int16_t get_srcport();
u_int16_t get_dstport();
u_int16_t get_len();
u_int16_t get_udpsum();
int set_srcport(u_int16_t);
int set_dstport(u_int16_t);
int set_len(u_int16_t);
int set_udpsum(u_int16_t);
virtual int sendpack(void*, int);
virtual int sendpack(char*);
virtual int recvpack(void*, int);
virtual int sniffpack(void*, int);
virtual int init_device(char*, int, int);
};
class TCP : public IP {
private:
struct usipp::tcphdr tcph;
char tcpOptions[40];
struct usipp::pseudohdr pseudo;
public:
TCP(const char*);
u_int16_t get_srcport();
u_int16_t get_dstport();
u_int32_t get_seq();
u_int32_t get_ack();
u_int8_t get_off();
u_int8_t get_flags();
u_int16_t get_win();
u_int16_t get_tcpsum();
u_int16_t get_urg();
int set_srcport(u_int16_t);
int set_dstport(u_int16_t);
int set_seq(u_int32_t);
int set_ack(u_int32_t);
int set_off(u_int8_t);
int set_flags(u_int8_t);
int set_win(u_int16_t);
int set_tcpsum(u_int16_t);
int set_urg(u_int16_t);
virtual int recvpack(void*, int);
virtual int sniffpack(void*, int);
virtual int sendpack(void*, int);
virtual int sendpack(char*);
virtual int init_device(char*, int, int);
};
class usifault {
public:
usifault() {}
~usifault() {}
};
typedef enum {
PERROR = 0,
HERROR,
PCAP,
STDERR
} errorFuncs;
extern bool exceptions;
extern int useException(bool);
extern void die(const char *, errorFuncs, int);
extern char *getMAC(const char *, char *, int);
extern char *setMAC(const char *, char *);
#endif // _USIPP_H