1*9f20bfa6SDavid van Moolenbroek /* $NetBSD: dhcp-common.h,v 1.10 2015/07/09 10:15:34 roy Exp $ */ 2*9f20bfa6SDavid van Moolenbroek 3*9f20bfa6SDavid van Moolenbroek /* 4*9f20bfa6SDavid van Moolenbroek * dhcpcd - DHCP client daemon 5*9f20bfa6SDavid van Moolenbroek * Copyright (c) 2006-2015 Roy Marples <roy@marples.name> 6*9f20bfa6SDavid van Moolenbroek * All rights reserved 7*9f20bfa6SDavid van Moolenbroek 8*9f20bfa6SDavid van Moolenbroek * Redistribution and use in source and binary forms, with or without 9*9f20bfa6SDavid van Moolenbroek * modification, are permitted provided that the following conditions 10*9f20bfa6SDavid van Moolenbroek * are met: 11*9f20bfa6SDavid van Moolenbroek * 1. Redistributions of source code must retain the above copyright 12*9f20bfa6SDavid van Moolenbroek * notice, this list of conditions and the following disclaimer. 13*9f20bfa6SDavid van Moolenbroek * 2. Redistributions in binary form must reproduce the above copyright 14*9f20bfa6SDavid van Moolenbroek * notice, this list of conditions and the following disclaimer in the 15*9f20bfa6SDavid van Moolenbroek * documentation and/or other materials provided with the distribution. 16*9f20bfa6SDavid van Moolenbroek * 17*9f20bfa6SDavid van Moolenbroek * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18*9f20bfa6SDavid van Moolenbroek * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19*9f20bfa6SDavid van Moolenbroek * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20*9f20bfa6SDavid van Moolenbroek * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21*9f20bfa6SDavid van Moolenbroek * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22*9f20bfa6SDavid van Moolenbroek * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23*9f20bfa6SDavid van Moolenbroek * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24*9f20bfa6SDavid van Moolenbroek * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25*9f20bfa6SDavid van Moolenbroek * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26*9f20bfa6SDavid van Moolenbroek * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27*9f20bfa6SDavid van Moolenbroek * SUCH DAMAGE. 28*9f20bfa6SDavid van Moolenbroek */ 29*9f20bfa6SDavid van Moolenbroek 30*9f20bfa6SDavid van Moolenbroek #ifndef DHCPCOMMON_H 31*9f20bfa6SDavid van Moolenbroek #define DHCPCOMMON_H 32*9f20bfa6SDavid van Moolenbroek 33*9f20bfa6SDavid van Moolenbroek #include <arpa/inet.h> 34*9f20bfa6SDavid van Moolenbroek #include <netinet/in.h> 35*9f20bfa6SDavid van Moolenbroek 36*9f20bfa6SDavid van Moolenbroek #include <stdint.h> 37*9f20bfa6SDavid van Moolenbroek 38*9f20bfa6SDavid van Moolenbroek #include "common.h" 39*9f20bfa6SDavid van Moolenbroek #include "dhcpcd.h" 40*9f20bfa6SDavid van Moolenbroek 41*9f20bfa6SDavid van Moolenbroek /* Max MTU - defines dhcp option length */ 42*9f20bfa6SDavid van Moolenbroek #define MTU_MAX 1500 43*9f20bfa6SDavid van Moolenbroek #define MTU_MIN 576 44*9f20bfa6SDavid van Moolenbroek 45*9f20bfa6SDavid van Moolenbroek #define REQUEST (1 << 0) 46*9f20bfa6SDavid van Moolenbroek #define UINT8 (1 << 1) 47*9f20bfa6SDavid van Moolenbroek #define UINT16 (1 << 2) 48*9f20bfa6SDavid van Moolenbroek #define SINT16 (1 << 3) 49*9f20bfa6SDavid van Moolenbroek #define UINT32 (1 << 4) 50*9f20bfa6SDavid van Moolenbroek #define SINT32 (1 << 5) 51*9f20bfa6SDavid van Moolenbroek #define ADDRIPV4 (1 << 6) 52*9f20bfa6SDavid van Moolenbroek #define STRING (1 << 7) 53*9f20bfa6SDavid van Moolenbroek #define ARRAY (1 << 8) 54*9f20bfa6SDavid van Moolenbroek #define RFC3361 (1 << 9) 55*9f20bfa6SDavid van Moolenbroek #define RFC1035 (1 << 10) 56*9f20bfa6SDavid van Moolenbroek #define RFC3442 (1 << 11) 57*9f20bfa6SDavid van Moolenbroek #define RFC5969 (1 << 12) 58*9f20bfa6SDavid van Moolenbroek #define ADDRIPV6 (1 << 13) 59*9f20bfa6SDavid van Moolenbroek #define BINHEX (1 << 14) 60*9f20bfa6SDavid van Moolenbroek #define FLAG (1 << 15) 61*9f20bfa6SDavid van Moolenbroek #define NOREQ (1 << 16) 62*9f20bfa6SDavid van Moolenbroek #define EMBED (1 << 17) 63*9f20bfa6SDavid van Moolenbroek #define ENCAP (1 << 18) 64*9f20bfa6SDavid van Moolenbroek #define INDEX (1 << 19) 65*9f20bfa6SDavid van Moolenbroek #define OPTION (1 << 20) 66*9f20bfa6SDavid van Moolenbroek #define DOMAIN (1 << 21) 67*9f20bfa6SDavid van Moolenbroek #define ASCII (1 << 22) 68*9f20bfa6SDavid van Moolenbroek #define RAW (1 << 23) 69*9f20bfa6SDavid van Moolenbroek #define ESCSTRING (1 << 24) 70*9f20bfa6SDavid van Moolenbroek #define ESCFILE (1 << 25) 71*9f20bfa6SDavid van Moolenbroek #define BITFLAG (1 << 26) 72*9f20bfa6SDavid van Moolenbroek #define RESERVED (1 << 27) 73*9f20bfa6SDavid van Moolenbroek 74*9f20bfa6SDavid van Moolenbroek struct dhcp_opt { 75*9f20bfa6SDavid van Moolenbroek uint32_t option; /* Also used for IANA Enterpise Number */ 76*9f20bfa6SDavid van Moolenbroek int type; 77*9f20bfa6SDavid van Moolenbroek size_t len; 78*9f20bfa6SDavid van Moolenbroek char *var; 79*9f20bfa6SDavid van Moolenbroek 80*9f20bfa6SDavid van Moolenbroek int index; /* Index counter for many instances of the same option */ 81*9f20bfa6SDavid van Moolenbroek char bitflags[8]; 82*9f20bfa6SDavid van Moolenbroek 83*9f20bfa6SDavid van Moolenbroek /* Embedded options. 84*9f20bfa6SDavid van Moolenbroek * The option code is irrelevant here. */ 85*9f20bfa6SDavid van Moolenbroek struct dhcp_opt *embopts; 86*9f20bfa6SDavid van Moolenbroek size_t embopts_len; 87*9f20bfa6SDavid van Moolenbroek 88*9f20bfa6SDavid van Moolenbroek /* Encapsulated options */ 89*9f20bfa6SDavid van Moolenbroek struct dhcp_opt *encopts; 90*9f20bfa6SDavid van Moolenbroek size_t encopts_len; 91*9f20bfa6SDavid van Moolenbroek }; 92*9f20bfa6SDavid van Moolenbroek 93*9f20bfa6SDavid van Moolenbroek struct dhcp_opt *vivso_find(uint32_t, const void *); 94*9f20bfa6SDavid van Moolenbroek 95*9f20bfa6SDavid van Moolenbroek ssize_t dhcp_vendor(char *, size_t); 96*9f20bfa6SDavid van Moolenbroek 97*9f20bfa6SDavid van Moolenbroek void dhcp_print_option_encoding(const struct dhcp_opt *opt, int cols); 98*9f20bfa6SDavid van Moolenbroek #define add_option_mask(var, val) \ 99*9f20bfa6SDavid van Moolenbroek ((var)[(val) >> 3] = (uint8_t)((var)[(val) >> 3] | 1 << ((val) & 7))) 100*9f20bfa6SDavid van Moolenbroek #define del_option_mask(var, val) \ 101*9f20bfa6SDavid van Moolenbroek ((var)[(val) >> 3] = (uint8_t)((var)[(val) >> 3] & ~(1 << ((val) & 7)))) 102*9f20bfa6SDavid van Moolenbroek #define has_option_mask(var, val) \ 103*9f20bfa6SDavid van Moolenbroek ((var)[(val) >> 3] & (uint8_t)(1 << ((val) & 7))) 104*9f20bfa6SDavid van Moolenbroek int make_option_mask(const struct dhcp_opt *, size_t, 105*9f20bfa6SDavid van Moolenbroek const struct dhcp_opt *, size_t, 106*9f20bfa6SDavid van Moolenbroek uint8_t *, const char *, int); 107*9f20bfa6SDavid van Moolenbroek 108*9f20bfa6SDavid van Moolenbroek size_t encode_rfc1035(const char *src, uint8_t *dst); 109*9f20bfa6SDavid van Moolenbroek ssize_t decode_rfc1035(char *, size_t, const uint8_t *, size_t); 110*9f20bfa6SDavid van Moolenbroek ssize_t print_string(char *, size_t, int, const uint8_t *, size_t); 111*9f20bfa6SDavid van Moolenbroek int dhcp_set_leasefile(char *, size_t, int, const struct interface *); 112*9f20bfa6SDavid van Moolenbroek 113*9f20bfa6SDavid van Moolenbroek size_t dhcp_envoption(struct dhcpcd_ctx *, 114*9f20bfa6SDavid van Moolenbroek char **, const char *, const char *, struct dhcp_opt *, 115*9f20bfa6SDavid van Moolenbroek const uint8_t *(*dgetopt)(struct dhcpcd_ctx *, 116*9f20bfa6SDavid van Moolenbroek size_t *, unsigned int *, size_t *, 117*9f20bfa6SDavid van Moolenbroek const uint8_t *, size_t, struct dhcp_opt **), 118*9f20bfa6SDavid van Moolenbroek const uint8_t *od, size_t ol); 119*9f20bfa6SDavid van Moolenbroek void dhcp_zero_index(struct dhcp_opt *); 120*9f20bfa6SDavid van Moolenbroek 121*9f20bfa6SDavid van Moolenbroek #endif 122