Annotation of embedaddon/coova-chilli/src/dhcp.h, revision 1.1
1.1 ! misho 1: /*
! 2: * DHCP library functions
! 3: * Copyright (C) 2003, 2004, 2005 Mondru AB.
! 4: * Copyright (c) 2007 David Bird <david@coova.com>
! 5: *
! 6: * The contents of this file may be used under the terms of the GNU
! 7: * General Public License Version 2, provided that the above copyright
! 8: * notice and this permission notice is included in all copies or
! 9: * substantial portions of the software.
! 10: *
! 11: * The initial developer of the original code is
! 12: * Jens Jakobsen <jj@chillispot.org>
! 13: *
! 14: */
! 15:
! 16:
! 17: #ifndef _DHCP_H
! 18: #define _DHCP_H
! 19:
! 20: #include "pkt.h"
! 21: #include "garden.h"
! 22: #include "net.h"
! 23:
! 24: /* Option constants */
! 25: #define DHCP_OPTION_MAGIC_LEN 4
! 26:
! 27: #define DHCP_OPTION_PAD 0
! 28: #define DHCP_OPTION_SUBNET_MASK 1
! 29: #define DHCP_OPTION_ROUTER_OPTION 3
! 30: #define DHCP_OPTION_DNS 6
! 31: #define DHCP_OPTION_HOSTNAME 12
! 32: #define DHCP_OPTION_DOMAIN_NAME 15
! 33: #define DHCP_OPTION_INTERFACE_MTU 26
! 34: #define DHCP_OPTION_REQUESTED_IP 50
! 35: #define DHCP_OPTION_LEASE_TIME 51
! 36: #define DHCP_OPTION_MESSAGE_TYPE 53
! 37: #define DHCP_OPTION_SERVER_ID 54
! 38: #define DHCP_OPTION_PARAMETER_REQUEST_LIST 55
! 39: #define DHCP_OPTION_VENDOR_CLASS_IDENTIFIER 60
! 40: #define DHCP_OPTION_CLIENT_IDENTIFIER 61
! 41: #define DHCP_OPTION_CLIENT_FQDN 81
! 42:
! 43: /* !!highly experimental!! */
! 44: #define DHCP_OPTION_CALLED_STATION_ID 197
! 45: #define DHCP_OPTION_CAPTIVE_PORTAL_ACL 198
! 46: #define DHCP_OPTION_CAPTIVE_PORTAL_URL 199
! 47:
! 48: #define DHCP_OPTION_END 255
! 49:
! 50: /* BOOTP Message Types */
! 51: #define DHCP_BOOTREQUEST 1
! 52: #define DHCP_BOOTREPLY 2
! 53:
! 54: /* DHCP Message Types */
! 55: #define DHCPDISCOVER 1
! 56: #define DHCPOFFER 2
! 57: #define DHCPREQUEST 3
! 58: #define DHCPDECLINE 4
! 59: #define DHCPACK 5
! 60: #define DHCPNAK 6
! 61: #define DHCPRELEASE 7
! 62: #define DHCPINFORM 8
! 63:
! 64: /* UDP Ports */
! 65: #define DHCP_BOOTPS 67
! 66: #define DHCP_BOOTPC 68
! 67: #define DHCP_DNS 53
! 68:
! 69: /* TCP Ports */
! 70: #define DHCP_HTTP 80
! 71: #define DHCP_HTTPS 443
! 72:
! 73:
! 74: #define DHCP_ARP_REQUEST 1
! 75: #define DHCP_ARP_REPLY 2
! 76:
! 77: #define DHCP_DNS_HLEN 12
! 78:
! 79: struct dhcp_t; /* Forward declaration */
! 80:
! 81: /* Authentication states */
! 82: #define DHCP_AUTH_NONE 0
! 83: #define DHCP_AUTH_DROP 1
! 84: #define DHCP_AUTH_PASS 2
! 85: #define DHCP_AUTH_UNAUTH_TOS 3
! 86: #define DHCP_AUTH_AUTH_TOS 4
! 87: #define DHCP_AUTH_DNAT 5
! 88: #define DHCP_AUTH_SPLASH 6
! 89:
! 90: #define DHCP_DOMAIN_LEN 30
! 91:
! 92: #define DHCP_DNAT_MAX 64
! 93:
! 94: struct dhcp_conn_t {
! 95: int inuse; /* Free = 0; Inuse = 1 */
! 96: time_t lasttime; /* Last time we heard anything from client */
! 97: struct dhcp_conn_t *nexthash; /* Linked list part of hash table */
! 98: struct dhcp_conn_t *next; /* Next in linked list. 0: Last */
! 99: struct dhcp_conn_t *prev; /* Previous in linked list. 0: First */
! 100: struct dhcp_t *parent; /* Parent of all connections */
! 101: void *peer; /* Peer protocol handler */
! 102: uint8_t ourmac[PKT_ETH_ALEN]; /* Our MAC address */
! 103: uint8_t hismac[PKT_ETH_ALEN]; /* Peer's MAC address */
! 104: struct in_addr ourip; /* IP address to listen to */
! 105: struct in_addr hisip; /* Client IP address */
! 106: struct in_addr hismask; /* Client Network Mask */
! 107: struct in_addr dns1; /* Client DNS address */
! 108: struct in_addr dns2; /* Client DNS address */
! 109: char domain[DHCP_DOMAIN_LEN];/* Domain name to use for DNS lookups */
! 110: int authstate; /* 0: Unauthenticated, 1: Authenticated */
! 111: uint8_t unauth_cp; /* Unauthenticated codepoint */
! 112: uint8_t auth_cp; /* Authenticated codepoint */
! 113: int nextdnat; /* Next location to use for DNAT */
! 114: uint32_t dnatip[DHCP_DNAT_MAX]; /* Destination NAT destination IP address */
! 115: uint16_t dnatport[DHCP_DNAT_MAX]; /* Destination NAT source port */
! 116: uint8_t dnatmac[DHCP_DNAT_MAX][PKT_ETH_ALEN]; /* Destination NAT source mac */
! 117: /* uint16_t mtu; Maximum transfer unit */
! 118:
! 119: /*XXX: optional*/
! 120: struct {
! 121: uint8_t sname[DHCP_SNAME_LEN]; /* 64 Optional server host name, null terminated string.*/
! 122: uint8_t file[DHCP_FILE_LEN]; /* 128 Boot file name, null terminated string; "generic" name */
! 123: uint8_t options[DHCP_OPTIONS_LEN]; /* var Optional parameters field. */
! 124: size_t option_length;
! 125: } dhcp_opts;
! 126: };
! 127:
! 128:
! 129: /* ***********************************************************
! 130: * Information storage for each dhcp instance
! 131: *
! 132: * Normally each instance of the application corresponds to
! 133: * one instance of a dhcp instance.
! 134: *
! 135: *************************************************************/
! 136:
! 137: struct dhcp_t {
! 138:
! 139: /* network interfaces */
! 140: struct _net_interface ipif, arpif, eapif;
! 141:
! 142: int numconn; /* Maximum number of connections */
! 143: #if defined(__FreeBSD__) || defined (__APPLE__) || defined (__OpenBSD__)
! 144: char *rbuf;
! 145: size_t rbuf_max;
! 146: size_t rbuf_offset;
! 147: size_t rbuf_len;
! 148: #endif
! 149:
! 150: int debug; /* Set to print debug messages */
! 151: struct in_addr ourip; /* IP address to listen to */
! 152: int mtu; /* Maximum transfer unit */
! 153: uint32_t lease; /* Seconds before reneval */
! 154: int usemac; /* Use given mac address */
! 155: int promisc; /* Set interface in promisc mode */
! 156: int allowdyn; /* Allow allocation of IP address on DHCP request */
! 157: struct in_addr uamlisten; /* IP address to redirect HTTP requests to */
! 158: uint16_t uamport; /* TCP port to redirect HTTP requests to */
! 159: struct in_addr *authip; /* IP address of authentication server */
! 160: int authiplen; /* Number of authentication server IP addresses */
! 161: int anydns; /* Allow any dns server */
! 162:
! 163: int relayfd; /* DHCP relay socket, 0 if not relaying */
! 164:
! 165: /* Connection management */
! 166: struct dhcp_conn_t *conn;
! 167: struct dhcp_conn_t *firstfreeconn; /* First free in linked list */
! 168: struct dhcp_conn_t *lastfreeconn; /* Last free in linked list */
! 169: struct dhcp_conn_t *firstusedconn; /* First used in linked list */
! 170: struct dhcp_conn_t *lastusedconn; /* Last used in linked list */
! 171:
! 172: /* Hash related parameters */
! 173: int hashsize; /* Size of hash table */
! 174: int hashlog; /* Log2 size of hash table */
! 175: int hashmask; /* Bitmask for calculating hash */
! 176: struct dhcp_conn_t **hash; /* Hashsize array of pointer to member */
! 177:
! 178: pass_through pass_throughs[MAX_PASS_THROUGHS];
! 179: size_t num_pass_throughs;
! 180:
! 181: /* Call back functions */
! 182: int (*cb_data_ind) (struct dhcp_conn_t *conn, void *pack, size_t len);
! 183: int (*cb_eap_ind) (struct dhcp_conn_t *conn, void *pack, size_t len);
! 184: int (*cb_request) (struct dhcp_conn_t *conn, struct in_addr *addr, struct dhcp_fullpacket_t *pack, size_t len);
! 185: int (*cb_connect) (struct dhcp_conn_t *conn);
! 186: int (*cb_disconnect) (struct dhcp_conn_t *conn, int term_cause);
! 187: int (*cb_getinfo) (struct dhcp_conn_t *conn, bstring b, int fmt);
! 188: };
! 189:
! 190:
! 191: const char* dhcp_version();
! 192:
! 193: int dhcp_new(struct dhcp_t **dhcp, int numconn, char *interface,
! 194: int usemac, uint8_t *mac, int promisc,
! 195: struct in_addr *listen, int lease, int allowdyn,
! 196: struct in_addr *uamlisten, uint16_t uamport,
! 197: int useeapol);
! 198:
! 199: int dhcp_set(struct dhcp_t *dhcp, int debug);
! 200:
! 201: int dhcp_free(struct dhcp_t *dhcp);
! 202:
! 203: int dhcp_timeout(struct dhcp_t *this);
! 204:
! 205: struct timeval * dhcp_timeleft(struct dhcp_t *this, struct timeval *tvp);
! 206:
! 207:
! 208: int dhcp_validate(struct dhcp_t *this);
! 209:
! 210: int dhcp_set_addrs(struct dhcp_conn_t *conn,
! 211: struct in_addr *hisip, struct in_addr *hismask,
! 212: struct in_addr *ourip, struct in_addr *ourmask,
! 213: struct in_addr *dns1, struct in_addr *dns2, char *domain);
! 214:
! 215:
! 216: /* Called whenever a packet arrives */
! 217: int dhcp_decaps(struct dhcp_t *this);
! 218: int dhcp_relay_decaps(struct dhcp_t *this);
! 219: int dhcp_data_req(struct dhcp_conn_t *conn, void *pack, size_t len, int ethhdr);
! 220:
! 221: int dhcp_set_cb_data_ind(struct dhcp_t *this,
! 222: int (*cb_data_ind) (struct dhcp_conn_t *conn, void *pack, size_t len));
! 223:
! 224: int dhcp_set_cb_request(struct dhcp_t *this,
! 225: int (*cb_request) (struct dhcp_conn_t *conn, struct in_addr *addr, struct dhcp_fullpacket_t *pack, size_t len));
! 226:
! 227: int dhcp_set_cb_disconnect(struct dhcp_t *this,
! 228: int (*cb_disconnect) (struct dhcp_conn_t *conn, int term_cause));
! 229:
! 230: int dhcp_set_cb_connect(struct dhcp_t *this,
! 231: int (*cb_connect) (struct dhcp_conn_t *conn));
! 232:
! 233: int dhcp_set_cb_eap_ind(struct dhcp_t *this,
! 234: int (*cb_eap_ind) (struct dhcp_conn_t *conn, void *pack, size_t len));
! 235:
! 236: int dhcp_set_cb_getinfo(struct dhcp_t *this,
! 237: int (*cb_getinfo) (struct dhcp_conn_t *conn, bstring b, int fmt));
! 238:
! 239: int dhcp_hashget(struct dhcp_t *this, struct dhcp_conn_t **conn, uint8_t *hwaddr);
! 240:
! 241: int dhcp_newconn(struct dhcp_t *this, struct dhcp_conn_t **conn, uint8_t *hwaddr);
! 242:
! 243: int dhcp_freeconn(struct dhcp_conn_t *conn, int term_cause);
! 244:
! 245:
! 246: int dhcp_arp_ind(struct dhcp_t *this); /* ARP Indication */
! 247:
! 248: int dhcp_sendEAP(struct dhcp_conn_t *conn, void *pack, size_t len);
! 249:
! 250: int dhcp_sendEAPreject(struct dhcp_conn_t *conn, void *pack, size_t len);
! 251:
! 252: int dhcp_eapol_ind(struct dhcp_t *this);
! 253:
! 254: void dhcp_release_mac(struct dhcp_t *this, uint8_t *hwaddr, int term_cause);
! 255:
! 256: #define LIST_SHORT_FMT 0
! 257: #define LIST_LONG_FMT 1
! 258: #define LIST_JSON_FMT 2
! 259:
! 260: void dhcp_list(struct dhcp_t *this, bstring s, bstring pre, bstring post, int listfmt);
! 261:
! 262: void dhcp_print(struct dhcp_t *this, bstring s, int listfmt, struct dhcp_conn_t *conn);
! 263:
! 264: int dhcp_filterDNS(struct dhcp_conn_t *conn,
! 265: struct pkt_ippacket_t *pack,
! 266: size_t *plen);
! 267:
! 268: int dhcp_gettag(struct dhcp_packet_t *pack, size_t length,
! 269: struct dhcp_tag_t **tag, uint8_t tagtype);
! 270:
! 271: #endif /* !_DHCP_H */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>