Annotation of embedaddon/dhcdrop/src/dhcdrop.h, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) 2009 by Chebotarev Roman <roma@ultranet.ru>
! 3: *
! 4: * This program is free software; you can redistribute it and/or modify
! 5: * it under the terms of the GNU General Public License as published by
! 6: * the Free Software Foundation; either version 2 of the License.
! 7: *
! 8: * This program is distributed in the hope that it will be useful,
! 9: * but WITHOUT ANY WARRANTY; without even the implied warranty of
! 10: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! 11: * GNU General Public License for more details.
! 12: *
! 13: * You should have received a copy of the GNU General Public License
! 14: * along with this program; if not, write to the Free Software
! 15: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
! 16: */
! 17:
! 18: #ifndef DHCDROP_H
! 19: #define DHCDROP_H
! 20:
! 21: #define RELEASE_DATE "05.08.2009"
! 22: #define PROG_NAME "DHCP-dropper"
! 23: #define BASE_VERSION PROG_NAME" v0.5"
! 24: #define VERSION BASE_VERSION
! 25:
! 26: #define COPYRIGHT VERSION" was written by Chebotarev Roman at "RELEASE_DATE"\n"
! 27: #define HOMEPAGE "Home page: http://www.netpatch.ru/en/dhcdrop.html"
! 28:
! 29:
! 30: /* Function for filling configuration structure 'params' from command line arguments */
! 31: void configure(const int argc, char **argv, struct config_params * params);
! 32:
! 33: /* Execute all programm actions */
! 34: int exec_action(const struct config_params * config);
! 35:
! 36: /* Discover available network interfaces.
! 37: * If 'num' not zero - return name of interface with index 'num' if success, 0 otherwise. */
! 38: char * interfaces_discover(const int num);
! 39:
! 40: /* Creating and launch children for generate DHCP flood. */
! 41: void send_flood(const struct config_params * params);
! 42:
! 43: /* Get ethernet address of illegal DHCP server in network.
! 44: * Retrun: 0 if server not found, ILLEGAL_SERV_FOUND if illegal server found. Error code otherwise. */
! 45: int get_dhcp_server(const struct config_params * config, /* Configuration parametrs. Can't be NULL */
! 46: pcap_t * pcap_socket, /* Pointer to pcap device. Can't be NULL */
! 47: struct dhcp_packet_net_header * net_header, /* Can't be NULL */
! 48: struct dhcp_packet * server_response, /* Function store DHCP response server here, */
! 49: /* can't be NULL */
! 50: uint16_t * response_length);
! 51:
! 52: /* Drop DHCP server specified in 'srv_etheraddr'. Return number of address recieved. */
! 53: int drop_dhcp_server(const struct config_params * config, /* Can't be NULL */
! 54: pcap_t * pcap_socket, /* Pointer to pcap device. Can't be NULL */
! 55: const char * srv_etheraddr); /* Ethrenet addres of DHCP server to dropping */
! 56:
! 57: /* Scanning network for search hosts with invalid IP configuration and send
! 58: * DHCPRELEASE for each found hosts to illegal DHCP server. Return zero if success, -1 otherwise */
! 59: int agressive_clean_leases(pcap_t * pcap_socket, /* Pointer to pcap device. Can't be NULL */
! 60: const struct config_params * config, /* Can't be NULL */
! 61: struct dhcp_packet_net_header * net_header, /* Network header from DHCP server response */
! 62: const struct dhcp_packet * srv_resp, /* Pointer to structure contain server DHCPOFFER response */
! 63: uint16_t resp_len); /* Length DHCPOFFER */
! 64:
! 65: /* ARP scan network on interface 'pcap_socket' in range specified by network/netmask. */
! 66: void scan_subnet(pcap_t * pcap_socket, /* Pointer to pcap device. Can't be NULL */
! 67: uint32_t from_ip, /* Source IP address. If == 0 - using random value */
! 68: const uint8_t * from_eth, /* Source ethernet address. */
! 69: const uint32_t network, /* Destination network */
! 70: const uint32_t netmask); /* Network mask */
! 71:
! 72: /* ARP scan network on interface 'pcap_socket' in IP range 'start_range' - 'end_range'
! 73: * Return zero if success, error code otherwise. */
! 74: int arp_scan(pcap_t * pcap_socket, /* Pointer to pcap device. Can't be NULL */
! 75: const uint32_t start_range, /* Start IP range. Host byte order! */
! 76: const uint32_t end_range, /* End IP range. Host byte order! */
! 77: uint32_t from_ip, /* Source IP address */
! 78: const uint8_t * from_ether); /* Source ethernet address */
! 79:
! 80: /* Return 0 if success, or error code otherwise. */
! 81: int send_arpreq(pcap_t * pcap_socket, /* Pointer to pcap device. Can't be NULL */
! 82: const uint32_t to_ip, /* Destination of ARP request */
! 83: const uint32_t from_ip, /* Source IP address */
! 84: const uint8_t * from_ether); /* Source ethernet address */
! 85:
! 86: /* Waiting ARP responses on interface 'pcap_socket' */
! 87: int get_arpresps(pcap_t * pcap_socket, /* Pointer to pcap device. Can't be NULL */
! 88: int timeout); /* Timeout in seconds */
! 89:
! 90: #ifdef _WIN32
! 91: /* Keyboard interrupt handler */
! 92: BOOL WINAPI int_sign(DWORD signal);
! 93:
! 94: /* Generate DHCP flood - one thread. Windows version. */
! 95: unsigned __stdcall start_flood( void* arg );
! 96:
! 97: #else
! 98: /* Keyboard interrupt handler */
! 99: int int_sign(int32_t signal);
! 100: /* Generate DHCP flood - one child. UNIX-like version. */
! 101: int start_flood( void* arg );
! 102: #endif
! 103:
! 104: /* Create new child process (for UNIX) or new thread (for Windows) for generate DHCP flood. */
! 105: void new_child(const struct flood_params * p, const int child_num);
! 106:
! 107: /* Wait unless all child DHCP flood processes (in UNIX)/ threads (in Windows) finished. */
! 108: void wait_children(const struct flood_params * p);
! 109:
! 110: /* Make filter expression for pcap_setfilter() function for discover
! 111: * DHCP servers in network. Return 0 if success, or error code otherwise. */
! 112: int make_serverdiscover_filter(char * out_filter, const int max_filter_len,
! 113: const struct config_params * config, const char * src_etheraddr);
! 114:
! 115: /* Make filter expression for pcap_setfilter() function for ARP scanning
! 116: * network. Return 0 if success, or error code otherwise. */
! 117: int make_arp_filter(char * out_filter, const int max_filter_len, const char * src_etheraddr);
! 118:
! 119: /* Make filter expression for pcap_setfilter() function to drop
! 120: * DHCP servers specified in 'server_ethaddr'. Using client Ethernet address
! 121: * specified in 'src_etheraddr'. Return 0 if success, or error code otherwise. */
! 122: int make_serverdrop_filter(char * out_filter, const int max_filter_len,
! 123: const struct config_params * config,
! 124: const char * src_etheraddr, const char * server_ethaddr);
! 125:
! 126: /* Set filter specified in 'filter_expression' to interface 'pcap_socket'.
! 127: * Return 0 if success, or error code otherwise. */
! 128: int set_pcap_filter(pcap_t * pcap_socket, char * filter_expression);
! 129:
! 130: /* Create and send DHCPDISCOVER from pseudo-client 'ether_src'.
! 131: * Return 0 if success, or error code otherwise. */
! 132: int send_dhcp_discover(pcap_t * pcap_socket, /* Can't be NULL */
! 133: const struct config_params * config, /* Can't be NULL */
! 134: uint8_t * ether_src, /* May be NULL */
! 135: const uint32_t xid);
! 136:
! 137: /* Create and send DHCPDISCOVER from pseudo-client 'ether_src' to DHCP server.
! 138: * Return 0 if success, or error code otherwise. */
! 139: int send_dhcp_request(pcap_t * pcap_socket, const struct config_params * config,
! 140: uint8_t * src_ether, /* Pseudo-client source ethernet address. Can't be NULL */
! 141: const uint32_t server_ip_address, /* DHCP server IP address. Can't be NULL */
! 142: const uint32_t req_ip_addr, /* Required client IP address. Can't be NULL */
! 143: const int32_t xid); /* DHCP transcaction XID */
! 144:
! 145: int send_dhcp_release(pcap_t * pcap_socket, const struct config_params * config,
! 146: const uint8_t * src_ether, /* Pseudo-client source ethernet address. Can't be NULL */
! 147: const uint32_t server_ip_address, /* DHCP server IP address. Can't be NULL */
! 148: const uint32_t cl_ip_addr, /* Released client IP address. Can't be NULL */
! 149: const int32_t xid
! 150: );
! 151:
! 152: /* Waiting DHCP response of type specified in 'resp_type' from server.
! 153: * Return: -1 if timeout; 0 if DHCP server responded or error code otherwise. */
! 154: int get_dhcp_response(pcap_t * pcap_socket, /* Can't be NULL */
! 155: const int timeout, const uint8_t resp_type, /* Timeout in seconds */
! 156: const uint32_t xid, /* DHCP transcaction XID */
! 157: struct dhcp_packet_net_header * net_header, /* Function store network header (Ethernet, IP, UDP)
! 158: here. Can't be NULL */
! 159: struct dhcp_packet * response, /* Function store DHCP response here. Can't be NULL */
! 160: int * dhcp_data_len); /* Function store DHCP data length here. Can't be NULL*/
! 161:
! 162: /* Function that implements a list of legal DHCP server list. */
! 163: struct ignored_mac_node * ignor_servers_list(
! 164: enum list_operations operation, /* Operation type. See enum 'list_operations'
! 165: in dhcdrop_types.h */
! 166: char * ether_addr); /* Ethernet address of DHCP server */
! 167:
! 168: /* Function that implements a list of legal IP networks on interface */
! 169: uint32_t legal_nets_list(enum list_operations operation, /* Operation type. See enum 'list_operations'
! 170: in dhcdrop_types.h */
! 171: const uint32_t * value); /* Network IP address */
! 172: /* Function that implements a list of hosts */
! 173: int hosts_list(enum list_operations operation, /* Operation type. See enum 'list_operations'
! 174: in dhcdrop_types.h */
! 175: uint32_t ip_addr, /* Host IP address */
! 176: uint8_t * ether_addr); /* Host ethernet address */
! 177:
! 178: /* Executed on programm finished. */
! 179: void cleanup(void);
! 180:
! 181: /* Misc functions */
! 182:
! 183: /* Decode and print DHCP message. Return DHCP message type is success, 0 otherwise. */
! 184: int decode_dhcp(const struct dhcp_packet * packet, const uint16_t dhcp_data_len);
! 185:
! 186: /* Print usage message. Print help message if 'help' != 0 */
! 187: void usage(const char help);
! 188:
! 189: /* Convert network mask to CIDR notation */
! 190: uint32_t to_cidr(uint32_t mask);
! 191:
! 192: /* Convert a numeric IP address to a string */
! 193: char *iptos(const uint32_t in);
! 194:
! 195: /* Print information about network interface */
! 196: void ifprint(const pcap_if_t *dev);
! 197:
! 198: /* Convert ethernet address specified in 'str_addr' to binary format and store to 'bin_addr'.
! 199: * Return >0 if success. */
! 200: int etheraddr_str_to_bin(const char * str_addr, uint8_t * bin_addr);
! 201:
! 202: /* Convert ethernet address specified in 'bin_addr' to string format and store to 'str_addr'.
! 203: * Return >0 if success. */
! 204: inline int etheraddr_bin_to_str(const uint8_t * bin_addr, char * str_addr);
! 205:
! 206: /* Replase all '-' symbols in string 'str_ether' to ':' */
! 207: inline void replace_semicolons(char * str_ether);
! 208:
! 209: /* Print ethernet address as hex-digits string */
! 210: inline void print_ether(const uint8_t * ether_addr);
! 211:
! 212: /* Create random ethernet address and store to string 'str_mac_addr' */
! 213: inline void rand_ether_addr(char * str_mac_addr);
! 214:
! 215: #endif /* ifdef DHCDROP_H*/
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>