mirror of https://github.com/sipwise/dhtest.git
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.
374 lines
11 KiB
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 */
|