[BACK]Return to dhcpleased.h CVS log [TXT][DIR] Up to [local] / src / sbin / dhcpleased

File: [local] / src / sbin / dhcpleased / dhcpleased.h (download)

Revision 1.16, Fri Jan 26 21:14:08 2024 UTC (4 months ago) by jan
Branch: MAIN
CVS Tags: OPENBSD_7_5_BASE, OPENBSD_7_5, HEAD
Changes since 1.15: +2 -2 lines

Put checksum flags in bpf_hdr to use them in userland dhcpleased.

Thus, dhcpleased accept non-calculated checksums which were verified by
hardware/hypervisor.

With tweaks from dlg@

ok bluhm@
mkay tobhe@

/*	$OpenBSD: dhcpleased.h,v 1.16 2024/01/26 21:14:08 jan Exp $	*/

/*
 * Copyright (c) 2017, 2021 Florian Obser <florian@openbsd.org>
 * Copyright (c) 2004 Esben Norby <norby@openbsd.org>
 * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#define	_PATH_LOCKFILE		"/dev/dhcpleased.lock"
#define	_PATH_CONF_FILE		"/etc/dhcpleased.conf"
#define	_PATH_DHCPLEASED_SOCKET	"/dev/dhcpleased.sock"
#define	DHCPLEASED_USER		"_dhcp"
#define	DHCPLEASED_RTA_LABEL	"dhcpleased"
#define	SERVER_PORT		67
#define	CLIENT_PORT		68
#define	_PATH_LEASE		"/var/db/dhcpleased/"
#define	LEASE_VERSION		"version: 2"
#define	LEASE_IP_PREFIX		"ip: "
#define	LEASE_NEXTSERVER_PREFIX	"next-server: "
#define	LEASE_BOOTFILE_PREFIX	"filename: "
#define	LEASE_HOSTNAME_PREFIX	"host-name: "
#define	LEASE_DOMAIN_PREFIX	"domain-name: "
#define	LEASE_SIZE		4096
/* MAXDNAME from arpa/namesr.h */
#define	DHCPLEASED_MAX_DNSSL	1025
#define	MAX_RDNS_COUNT		8 /* max nameserver in a RTM_PROPOSAL */

/* A 1500 bytes packet can hold less than 300 classless static routes */
#define	MAX_DHCP_ROUTES		256

#define	DHCP_COOKIE		{99, 130, 83, 99}

/* Possible values for hardware type (htype) field. */
#define	HTYPE_NONE		0
#define	HTYPE_ETHER		1
#define	HTYPE_IPSEC_TUNNEL	31

/* DHCP op code */
#define	DHCP_BOOTREQUEST		1
#define	DHCP_BOOTREPLY			2

/* DHCP Option codes: */
#define	DHO_PAD				0
#define	DHO_SUBNET_MASK			1
#define	DHO_TIME_OFFSET			2
#define	DHO_ROUTERS			3
#define	DHO_TIME_SERVERS		4
#define	DHO_NAME_SERVERS		5
#define	DHO_DOMAIN_NAME_SERVERS		6
#define	DHO_LOG_SERVERS			7
#define	DHO_COOKIE_SERVERS		8
#define	DHO_LPR_SERVERS			9
#define	DHO_IMPRESS_SERVERS		10
#define	DHO_RESOURCE_LOCATION_SERVERS	11
#define	DHO_HOST_NAME			12
#define	DHO_BOOT_SIZE			13
#define	DHO_MERIT_DUMP			14
#define	DHO_DOMAIN_NAME			15
#define	DHO_SWAP_SERVER			16
#define	DHO_ROOT_PATH			17
#define	DHO_EXTENSIONS_PATH		18
#define	DHO_IP_FORWARDING		19
#define	DHO_NON_LOCAL_SOURCE_ROUTING	20
#define	DHO_POLICY_FILTER		21
#define	DHO_MAX_DGRAM_REASSEMBLY	22
#define	DHO_DEFAULT_IP_TTL		23
#define	DHO_PATH_MTU_AGING_TIMEOUT	24
#define	DHO_PATH_MTU_PLATEAU_TABLE	25
#define	DHO_INTERFACE_MTU		26
#define	DHO_ALL_SUBNETS_LOCAL		27
#define	DHO_BROADCAST_ADDRESS		28
#define	DHO_PERFORM_MASK_DISCOVERY	29
#define	DHO_MASK_SUPPLIER		30
#define	DHO_ROUTER_DISCOVERY		31
#define	DHO_ROUTER_SOLICITATION_ADDRESS	32
#define	DHO_STATIC_ROUTES		33
#define	DHO_TRAILER_ENCAPSULATION	34
#define	DHO_ARP_CACHE_TIMEOUT		35
#define	DHO_IEEE802_3_ENCAPSULATION	36
#define	DHO_DEFAULT_TCP_TTL		37
#define	DHO_TCP_KEEPALIVE_INTERVAL	38
#define	DHO_TCP_KEEPALIVE_GARBAGE	39
#define	DHO_NIS_DOMAIN			40
#define	DHO_NIS_SERVERS			41
#define	DHO_NTP_SERVERS			42
#define	DHO_VENDOR_ENCAPSULATED_OPTIONS	43
#define	DHO_NETBIOS_NAME_SERVERS	44
#define	DHO_NETBIOS_DD_SERVER		45
#define	DHO_NETBIOS_NODE_TYPE		46
#define	DHO_NETBIOS_SCOPE		47
#define	DHO_FONT_SERVERS		48
#define	DHO_X_DISPLAY_MANAGER		49
#define	DHO_DHCP_REQUESTED_ADDRESS	50
#define	DHO_DHCP_LEASE_TIME		51
#define	DHO_DHCP_OPTION_OVERLOAD	52
#define	DHO_DHCP_MESSAGE_TYPE		53
#define	DHO_DHCP_SERVER_IDENTIFIER	54
#define	DHO_DHCP_PARAMETER_REQUEST_LIST	55
#define	DHO_DHCP_MESSAGE		56
#define	DHO_DHCP_MAX_MESSAGE_SIZE	57
#define	DHO_DHCP_RENEWAL_TIME		58
#define	DHO_DHCP_REBINDING_TIME		59
#define	DHO_DHCP_CLASS_IDENTIFIER	60
#define	DHO_DHCP_CLIENT_IDENTIFIER	61
#define	DHO_NISPLUS_DOMAIN		64
#define	DHO_NISPLUS_SERVERS		65
#define	DHO_TFTP_SERVER			66
#define	DHO_BOOTFILE_NAME		67
#define	DHO_MOBILE_IP_HOME_AGENT	68
#define	DHO_SMTP_SERVER			69
#define	DHO_POP_SERVER			70
#define	DHO_NNTP_SERVER			71
#define	DHO_WWW_SERVER			72
#define	DHO_FINGER_SERVER		73
#define	DHO_IRC_SERVER			74
#define	DHO_STREETTALK_SERVER		75
#define	DHO_STREETTALK_DIRECTORY_ASSISTANCE_SERVER	76
#define	DHO_DHCP_USER_CLASS_ID		77
#define	DHO_RELAY_AGENT_INFORMATION	82
#define	DHO_NDS_SERVERS			85
#define	DHO_NDS_TREE_NAME		86
#define	DHO_NDS_CONTEXT			87
#define	DHO_IPV6_ONLY_PREFERRED		108
#define	DHO_DOMAIN_SEARCH		119
#define	DHO_CLASSLESS_STATIC_ROUTES	121
#define	DHO_TFTP_CONFIG_FILE		144
#define	DHO_VOIP_CONFIGURATION_SERVER	150
#define	DHO_CLASSLESS_MS_STATIC_ROUTES	249
#define	DHO_AUTOPROXY_SCRIPT		252
#define	DHO_END				255
#define	DHO_COUNT			256	/* # of DHCP options */

/* DHCP message types. */
#define	DHCPDISCOVER	1
#define	DHCPOFFER	2
#define	DHCPREQUEST	3
#define	DHCPDECLINE	4
#define	DHCPACK		5
#define	DHCPNAK		6
#define	DHCPRELEASE	7
#define	DHCPINFORM	8

/* Ignore parts of DHCP lease */
#define	IGN_ROUTES	1
#define	IGN_DNS		2

#define	MAX_SERVERS	16	/* max servers that can be ignored per if */

#define	IMSG_DATA_SIZE(imsg)	((imsg).hdr.len - IMSG_HEADER_SIZE)
#define	DHCP_SNAME_LEN		64
#define	DHCP_FILE_LEN		128

struct dhcp_hdr {
	uint8_t		op;	/* Message opcode/type */
	uint8_t		htype;	/* Hardware addr type (see net/if_types.h) */
	uint8_t		hlen;	/* Hardware addr length */
	uint8_t		hops;	/* Number of relay agent hops from client */
	uint32_t	xid;	/* Transaction ID */
	uint16_t	secs;	/* Seconds since client started looking */
	uint16_t	flags;	/* Flag bits */
	struct in_addr	ciaddr;	/* Client IP address (if already in use) */
	struct in_addr	yiaddr;	/* Client IP address */
	struct in_addr	siaddr;	/* IP address of next server to talk to */
	struct in_addr	giaddr;	/* DHCP relay agent IP address */
	uint8_t		chaddr[16];		/* Client hardware address */
	char		sname[DHCP_SNAME_LEN];	/* Server name */
	char		file[DHCP_FILE_LEN];	/* Boot filename */
};

struct imsgev {
	struct imsgbuf	 ibuf;
	void		(*handler)(int, short, void *);
	struct event	 ev;
	short		 events;
};

struct dhcp_route {
	struct in_addr		 dst;
	struct in_addr		 mask;
	struct in_addr		 gw;
};

enum imsg_type {
	IMSG_NONE,
#ifndef	SMALL
	IMSG_CTL_LOG_VERBOSE,
	IMSG_CTL_SHOW_INTERFACE_INFO,
	IMSG_CTL_SEND_REQUEST,
	IMSG_CTL_RELOAD,
	IMSG_CTL_END,
	IMSG_RECONF_CONF,
	IMSG_RECONF_IFACE,
	IMSG_RECONF_VC_ID,
	IMSG_RECONF_C_ID,
	IMSG_RECONF_H_NAME,
	IMSG_RECONF_END,
#endif	/* SMALL */
	IMSG_SEND_DISCOVER,
	IMSG_SEND_REQUEST,
	IMSG_SOCKET_IPC,
	IMSG_OPEN_BPFSOCK,
	IMSG_BPFSOCK,
	IMSG_UDPSOCK,
	IMSG_CLOSE_UDPSOCK,
	IMSG_ROUTESOCK,
	IMSG_CONTROLFD,
	IMSG_STARTUP,
	IMSG_UPDATE_IF,
	IMSG_REMOVE_IF,
	IMSG_DHCP,
	IMSG_CONFIGURE_INTERFACE,
	IMSG_DECONFIGURE_INTERFACE,
	IMSG_PROPOSE_RDNS,
	IMSG_WITHDRAW_RDNS,
	IMSG_WITHDRAW_ROUTES,
	IMSG_REPROPOSE_RDNS,
	IMSG_REQUEST_REBOOT,
};

#ifndef	SMALL
struct ctl_engine_info {
	uint32_t		if_index;
	int			running;
	int			link_state;
	char			state[sizeof("IF_INIT_REBOOT")];
	struct timespec		request_time;
	struct in_addr		server_identifier;
	struct in_addr		dhcp_server; /* for unicast */
	struct in_addr		requested_ip;
	struct in_addr		mask;
	struct dhcp_route	routes[MAX_DHCP_ROUTES];
	int			routes_len;
	struct in_addr		nameservers[MAX_RDNS_COUNT];
	uint32_t		lease_time;
	uint32_t		renewal_time;
	uint32_t		rebinding_time;
};

struct iface_conf {
	SIMPLEQ_ENTRY(iface_conf)	 entry;
	char				 name[IF_NAMESIZE];
	uint8_t				*vc_id;
	int				 vc_id_len;
	uint8_t				*c_id;
	int				 c_id_len;
	char				*h_name;
	int				 ignore;
	struct in_addr			 ignore_servers[MAX_SERVERS];
	int				 ignore_servers_len;
	int				 prefer_ipv6;
};

struct dhcpleased_conf {
	SIMPLEQ_HEAD(iface_conf_head, iface_conf)	iface_list;
};

#endif	/* SMALL */

struct imsg_ifinfo {
	uint32_t		if_index;
	int			rdomain;
	int			running;
	int			link_state;
	struct ether_addr	hw_address;
	char			lease[LEASE_SIZE];
};

struct imsg_propose_rdns {
	uint32_t		if_index;
	int			rdomain;
	int			rdns_count;
	struct in_addr		rdns[MAX_RDNS_COUNT];
};

struct imsg_dhcp {
	uint32_t		if_index;
	ssize_t			len;
	uint16_t		csumflags;
	uint8_t			packet[1500];
};

struct imsg_req_dhcp {
	uint32_t		if_index;
	uint32_t		xid;
	struct in_addr		ciaddr;
	struct in_addr		requested_ip;
	struct in_addr		server_identifier;
	struct in_addr		dhcp_server;
};

/* dhcpleased.c */
void			 imsg_event_add(struct imsgev *);
int			 imsg_compose_event(struct imsgev *, uint16_t, uint32_t,
			     pid_t, int, void *, uint16_t);
#ifndef	SMALL
void			 config_clear(struct dhcpleased_conf *);
struct dhcpleased_conf	*config_new_empty(void);
void			 merge_config(struct dhcpleased_conf *, struct
			     dhcpleased_conf *);
const char	*sin_to_str(struct sockaddr_in *);

/* frontend.c */
struct iface_conf	*find_iface_conf(struct iface_conf_head *, char *);
int			*changed_ifaces(struct dhcpleased_conf *, struct
			     dhcpleased_conf *);

/* printconf.c */
void	print_config(struct dhcpleased_conf *);

/* parse.y */
struct dhcpleased_conf	*parse_config(const char *);
int			 cmdline_symset(char *);
#else
#define	sin_to_str(x...)	""
#endif	/* SMALL */