You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
dhtest/headers.h

374 lines
11 KiB

/*
* File - dhcp-headers.h
* dhcp-headers.h - header structure for dhcp packets
*/
#ifndef HEADERS_H
#include<sys/types.h>
#include<netinet/in.h>
#include <sys/time.h>
#include <time.h>
#define HEADERS_H
#define ETH_F_FMT "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx"
#define ETH_F_ARG(x) (x)[0], (x)[1], (x)[2], (x)[3], (x)[4], (x)[5]
#define ETH_F_PARG(x) &(x)[0], &(x)[1], &(x)[2], &(x)[3], &(x)[4], &(x)[5]
/*
* Functions used in functions.c
*/
int open_socket(void); /* Opens PF_PACKET socket*/
int set_promisc(void);
int clear_promisc(void);
int send_packet(int pkt_type); /* Sends DHCP packet socket*/
int recv_packet(int pkt_type); /* Receives DHCP packet on socket*/
int reset_dhopt_size(void); /* Resets the dhopt_size to zero */
void init_rand(void);
int set_rand_dhcp_xid(void); /* Sets a random DHCP xid */
int build_option53(int msg_type); /* Option53: MSGTYPE. Builds option53*/
int build_option55(void); /* Requested parameters list */
int build_option54(void); /* Builds server identifier on DHCP request */
int build_option50(void); /* Option50: Rqstd IP. Builds option50*/
int build_option51(void); /* Option51: Rqstd lease time. Builds option51*/
int build_option60_vci(void); /* Vendor class identifier */
int build_option12_hostname(void); /* Hostname */
int build_option81_fqdn(void); /* FQDN */
int build_optioneof(void); /* End of option */
int build_dhpacket(int pkt_type); /* Build DHCP disc, req packets */
int build_packet(int pkt_type); /* Builds ARP and ICMP reply packets */
int print_buff(u_int8_t *buff, int size);/* Debug routine */
int print_dhinfo(int pkt_type); /* Prints DHCP offer & ack informations */
int log_dhinfo(void); /* Logs DHCP IP info to log file */
int get_dhinfo(void); /* Reads log file for mac, ip, serv_ip info */
char *get_ip_str(u_int32_t ip); /* Convert in_addr to string */
u_int32_t get_interface_address(void); /* Return the IP address of the interface. */
int set_serv_id_opt50(void); /* Sets the server_ip and option50 ip */
void critical(const char *fmt, ...) __attribute__ ((noreturn, format (printf, 1, 2)));
/*
* Libnet defines header sizes for every builder function exported.
*/
#define ETHER_H 0x10 /* Ethernet header: 14 bytes */
#define ETHER_ADDR_LEN 0x6 /* Ethernet address len: 6 bytes */
#define IP_ADDR_LEN 0x4
#define VLAN_H 0x12 /* Ethernet header + vlan header*/
#define IP_H 0x20 /* IP header: 20 bytes */
#define UDP_H 0x8 /* UDP header: 8 bytes */
#define ICMP_H 0x8
#define ICMP_PAYLOAD 0x3c /* 60 bytes of ICMP payload */
#define DHCPV4_H 0xf0 /**< DHCP v4 header: 240 bytes */
#define ARP_H_LEN 0x08
/*
* ARP header
* Address Resolution Protocol
* Base header size: 8 bytes
*/
struct arp_hdr
{
u_int16_t ar_hrd; /* format of hardware address */
#define ARPHRD_NETROM 0 /* from KA9Q: NET/ROM pseudo */
#define ARPHRD_ETHER 1 /* Ethernet 10Mbps */
#define ARPHRD_EETHER 2 /* Experimental Ethernet */
#define ARPHRD_AX25 3 /* AX.25 Level 2 */
#define ARPHRD_PRONET 4 /* PROnet token ring */
#define ARPHRD_CHAOS 5 /* Chaosnet */
#define ARPHRD_IEEE802 6 /* IEEE 802.2 Ethernet/TR/TB */
#define ARPHRD_ARCNET 7 /* ARCnet */
#define ARPHRD_APPLETLK 8 /* APPLEtalk */
#define ARPHRD_LANSTAR 9 /* Lanstar */
#define ARPHRD_DLCI 15 /* Frame Relay DLCI */
#define ARPHRD_ATM 19 /* ATM */
#define ARPHRD_METRICOM 23 /* Metricom STRIP (new IANA id) */
#define ARPHRD_IPSEC 31 /* IPsec tunnel */
u_int16_t ar_pro; /* format of protocol address */
u_int8_t ar_hln; /* length of hardware address */
u_int8_t ar_pln; /* length of protocol addres */
u_int16_t ar_op; /* operation type */
#define ARPOP_REQUEST 1 /* req to resolve address */
#define ARPOP_REPLY 2 /* resp to previous request */
#define ARPOP_REVREQUEST 3 /* req protocol address given hardware */
#define ARPOP_REVREPLY 4 /* resp giving protocol address */
#define ARPOP_INVREQUEST 8 /* req to identify peer */
#define ARPOP_INVREPLY 9 /* resp identifying peer */
u_int8_t sender_mac[ETHER_ADDR_LEN];
union {
u_int8_t sender_ip[IP_ADDR_LEN];
u_int32_t sender_ip32;
};
u_int8_t target_mac[ETHER_ADDR_LEN];
union {
u_int8_t target_ip[IP_ADDR_LEN];
u_int32_t target_ip32;
};
};
/**
* IEEE 802.1Q (Virtual Local Area Network) VLAN header, static header
* size: 18 bytes
*/
struct vlan_eth_hdr
{
u_int8_t vlan_dhost[ETHER_ADDR_LEN]; /**< destination ethernet address */
u_int8_t vlan_shost[ETHER_ADDR_LEN]; /**< source ethernet address */
u_int16_t vlan_tpi; /**< tag protocol ID */
u_int16_t vlan_priority_c_vid; /**< priority | VLAN ID */
#define VLAN_PRIMASK 0x0007 /**< priority mask */
#define VLAN_CFIMASK 0x0001 /**< CFI mask */
#define VLAN_VIDMASK 0x0fff /**< vid mask */
u_int16_t vlan_len; /**< length or type (802.3 / Eth 2) */
};
/*
* IP header included from netinet/ip.h
*/
#include<netinet/ip.h>
/*
* ICMP header
* Internet Control Message Protocol
* Base header size: 4 bytes
*/
struct icmp_hdr
{
u_int8_t icmp_type; /* ICMP type */
#define ICMP_ECHOREPLY 0
#define ICMP_ECHO 8
u_int8_t icmp_code; /* ICMP code */
u_int16_t icmp_sum; /* ICMP Checksum */
u_int16_t id; /* ICMP id */
u_int16_t seq; /* ICMP sequence number */
};
/*
* UDP header included from netinet/udp.h
*/
#include<netinet/udp.h>
/*
* DHCP header
* Dynamic Host Configuration Protocol
* Static header size: f0 bytes
*/
struct dhcpv4_hdr
{
u_int8_t dhcp_opcode; /* opcode */
#define DHCP_REQUEST 0x1
#define DHCP_REPLY 0x2
u_int8_t dhcp_htype; /* hardware address type */
u_int8_t dhcp_hlen; /* hardware address length */
u_int8_t dhcp_hopcount; /* used by proxy servers */
u_int32_t dhcp_xid; /* transaction ID */
u_int16_t dhcp_secs; /* number of seconds since trying to bootstrap */
u_int16_t dhcp_flags; /* flags for DHCP, unused for BOOTP */
u_int32_t dhcp_cip; /* client's IP */
u_int32_t dhcp_yip; /* your IP */
u_int32_t dhcp_sip; /* server's IP */
u_int32_t dhcp_gip; /* gateway IP */
u_int8_t dhcp_chaddr[16]; /* client hardware address */
u_int8_t dhcp_sname[64]; /* server host name */
u_int8_t dhcp_file[128]; /* boot file name */
u_int32_t dhcp_magic; /* BOOTP magic header */
#define DHCP_MAGIC 0x63825363
#define BOOTP_MIN_LEN 0x12c
#define DHCP_PAD 0x00
#define DHCP_SUBNETMASK 0x01
#define DHCP_TIMEOFFSET 0x02
#define DHCP_ROUTER 0x03
#define DHCP_TIMESERVER 0x04
#define DHCP_NAMESERVER 0x05
#define DHCP_DNS 0x06
#define DHCP_LOGSERV 0x07
#define DHCP_COOKIESERV 0x08
#define DHCP_LPRSERV 0x09
#define DHCP_IMPSERV 0x0a
#define DHCP_RESSERV 0x0b
#define DHCP_HOSTNAME 0x0c
#define DHCP_BOOTFILESIZE 0x0d
#define DHCP_DUMPFILE 0x0e
#define DHCP_DOMAINNAME 0x0f
#define DHCP_SWAPSERV 0x10
#define DHCP_ROOTPATH 0x11
#define DHCP_EXTENPATH 0x12
#define DHCP_IPFORWARD 0x13
#define DHCP_SRCROUTE 0x14
#define DHCP_POLICYFILTER 0x15
#define DHCP_MAXASMSIZE 0x16
#define DHCP_IPTTL 0x17
#define DHCP_MTUTIMEOUT 0x18
#define DHCP_MTUTABLE 0x19
#define DHCP_MTUSIZE 0x1a
#define DHCP_LOCALSUBNETS 0x1b
#define DHCP_BROADCASTADDR 0x1c
#define DHCP_DOMASKDISCOV 0x1d
#define DHCP_MASKSUPPLY 0x1e
#define DHCP_DOROUTEDISC 0x1f
#define DHCP_ROUTERSOLICIT 0x20
#define DHCP_STATICROUTE 0x21
#define DHCP_TRAILERENCAP 0x22
#define DHCP_ARPTIMEOUT 0x23
#define DHCP_ETHERENCAP 0x24
#define DHCP_TCPTTL 0x25
#define DHCP_TCPKEEPALIVE 0x26
#define DHCP_TCPALIVEGARBAGE 0x27
#define DHCP_NISDOMAIN 0x28
#define DHCP_NISSERVERS 0x29
#define DHCP_NISTIMESERV 0x2a
#define DHCP_VENDSPECIFIC 0x2b
#define DHCP_NBNS 0x2c
#define DHCP_NBDD 0x2d
#define DHCP_NBTCPIP 0x2e
#define DHCP_NBTCPSCOPE 0x2f
#define DHCP_XFONT 0x30
#define DHCP_XDISPLAYMGR 0x31
#define DHCP_REQUESTEDIP 0x32
#define DHCP_LEASETIME 0x33
#define DHCP_OPTIONOVERLOAD 0x34
#define DHCP_MESSAGETYPE 0x35
#define DHCP_SERVIDENT 0x36
#define DHCP_PARAMREQUEST 0x37
#define DHCP_MESSAGE 0x38
#define DHCP_MAXMSGSIZE 0x39
#define DHCP_RENEWTIME 0x3a
#define DHCP_REBINDTIME 0x3b
#define DHCP_CLASSID 0x3c
#define DHCP_CLIENTID 0x3d
#define DHCP_NISPLUSDOMAIN 0x40
#define DHCP_NISPLUSSERVERS 0x41
#define DHCP_MOBILEIPAGENT 0x44
#define DHCP_SMTPSERVER 0x45
#define DHCP_POP3SERVER 0x46
#define DHCP_NNTPSERVER 0x47
#define DHCP_WWWSERVER 0x48
#define DHCP_FINGERSERVER 0x49
#define DHCP_IRCSERVER 0x4a
#define DHCP_STSERVER 0x4b
#define DHCP_STDASERVER 0x4c
#define DHCP_FQDN 0x51
#define DHCP_END 0xff
#define DHCP_MSGDISCOVER 0x01
#define DHCP_MSGOFFER 0x02
#define DHCP_MSGREQUEST 0x03
#define DHCP_MSGDECLINE 0x04
#define DHCP_MSGACK 0x05
#define DHCP_MSGNACK 0x06
#define DHCP_MSGRELEASE 0x07
#define DHCP_MSGINFORM 0x08
};
#ifndef ETHERTYPE_IP
#define ETHERTYPE_IP 0x0800 /* IP protocol */
#endif
#ifndef ETHERTYPE_VLAN
#define ETHERTYPE_VLAN 0x8100 /* IEEE 802.1Q VLAN tagging */
#endif
#define ETHERTYPE_ARP 0x806
#define SOCKET_ERR -1
#define PACK_SEND_ERR -1
#define PACK_RECV_ERR -2
#define DHCP_OFFR_RCVD 1
#define DHCP_DISC_RESEND 2
#define UNKNOWN_PACKET 3
#define DHCP_ACK_RCVD 4
#define DHCP_REQ_RESEND 5
#define DHCP_NAK_RCVD 6
#define ARP_ICMP_RCV 8
#define ARP_RCVD 9
#define ARP_MAP 10
#define ICMP_MAP 11
#define ICMP_RCVD 12
#define ARP_SEND 13
#define ICMP_SEND 14
#define LISTEN_TIMEOUT 15
/*
* FQDN options flags
*/
#define FQDN_N_FLAG 0x08
#define FQDN_E_FLAG 0x04
#define FQDN_O_FLAG 0x02
#define FQDN_S_FLAG 0x01a
/*
* Minimum DHCP packet size
*/
#define MINIMUM_PACKET_SIZE 300
/* format of the log/status file */
#define STATUS_MAGIC 0xD47E57
struct dhcp_status {
unsigned int magic;
unsigned char client_mac[ETHER_ADDR_LEN];
int have_ip;
u_int32_t client_ip, server_ip;
unsigned char server_mac[ETHER_ADDR_LEN];
time_t acquired_at;
unsigned int lease_time;
pid_t listen_pid;
};
//Defined in dhtest.c
extern int iface;
extern u_int16_t vlan;
extern u_int8_t l3_tos;
extern u_int16_t l2_hdr_size;
extern u_int16_t l3_hdr_size;
extern u_int16_t l4_hdr_size;
extern u_int16_t fqdn_n;
extern u_int16_t fqdn_s;
extern u_int32_t dhcp_xid;
extern int bcast_flag;
extern int timeout;
extern u_int8_t padding_flag;
extern const char *vci_buff;
extern const char *hostname_buff;
extern const char *fqdn_buff;
extern u_int32_t option51_lease_time;
extern u_int32_t port;
extern u_int8_t unicast_flag;
extern u_int8_t nagios_flag;
extern char *giaddr;
extern char *server_addr;
extern struct dhcpv4_hdr *dhcph_g;
extern u_char dhmac[ETHER_ADDR_LEN];
extern char dhmac_fname[];
extern char *iface_name;
extern char ip_str[128];
extern u_int32_t server_id, option50_ip;
extern u_int8_t dhcp_release_flag;
extern u_int32_t unicast_ip_address;
extern u_int32_t ip_address;
extern u_char ip_listen_flag;
extern struct timeval tval_listen;
extern u_int32_t listen_timeout;
extern int quiet;
extern time_t lease_expires_at;
#endif /* __HEADERS_H */
/* EOF */