xref: /freebsd/libexec/tftpd/tftp-utils.h (revision 1ed44fcc)
1e6209940SPedro F. Giffuni /*-
24d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
3e6209940SPedro F. Giffuni  *
4e7ff5475SWarner Losh  * Copyright (C) 2008 Edwin Groothuis. All rights reserved.
5e7ff5475SWarner Losh  *
6e7ff5475SWarner Losh  * Redistribution and use in source and binary forms, with or without
7e7ff5475SWarner Losh  * modification, are permitted provided that the following conditions
8e7ff5475SWarner Losh  * are met:
9e7ff5475SWarner Losh  * 1. Redistributions of source code must retain the above copyright
10e7ff5475SWarner Losh  *    notice, this list of conditions and the following disclaimer.
11e7ff5475SWarner Losh  * 2. Redistributions in binary form must reproduce the above copyright
12e7ff5475SWarner Losh  *    notice, this list of conditions and the following disclaimer in the
13e7ff5475SWarner Losh  *    documentation and/or other materials provided with the distribution.
14e7ff5475SWarner Losh  *
15e7ff5475SWarner Losh  * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16e7ff5475SWarner Losh  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17e7ff5475SWarner Losh  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18e7ff5475SWarner Losh  * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
19e7ff5475SWarner Losh  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20e7ff5475SWarner Losh  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21e7ff5475SWarner Losh  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22e7ff5475SWarner Losh  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23e7ff5475SWarner Losh  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24e7ff5475SWarner Losh  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25e7ff5475SWarner Losh  * SUCH DAMAGE.
26e7ff5475SWarner Losh  */
27e7ff5475SWarner Losh 
28e7ff5475SWarner Losh #include <sys/cdefs.h>
29e7ff5475SWarner Losh /*
30e7ff5475SWarner Losh  */
31e7ff5475SWarner Losh #define	TIMEOUT		5
32e7ff5475SWarner Losh #define	MAX_TIMEOUTS	5
33e7ff5475SWarner Losh 
34e7ff5475SWarner Losh /* Generic values */
35e7ff5475SWarner Losh #define MAXSEGSIZE	65464		/* Maximum size of the data segment */
36e7ff5475SWarner Losh #define	MAXPKTSIZE	(MAXSEGSIZE + 4) /* Maximum size of the packet */
37e7ff5475SWarner Losh 
38e7ff5475SWarner Losh /* For the blksize option */
391acf0dbaSUlrich Spörlein #define BLKSIZE_MIN	8		/* Minimum size of the data segment */
40e7ff5475SWarner Losh #define BLKSIZE_MAX	MAXSEGSIZE	/* Maximum size of the data segment */
41e7ff5475SWarner Losh 
42e7ff5475SWarner Losh /* For the timeout option */
431acf0dbaSUlrich Spörlein #define TIMEOUT_MIN	0		/* Minimum timeout value */
44e7ff5475SWarner Losh #define TIMEOUT_MAX	255		/* Maximum timeout value */
45e7ff5475SWarner Losh #define MIN_TIMEOUTS	3
46e7ff5475SWarner Losh 
47fdf929ffSJohn Baldwin /* For the windowsize option */
48fdf929ffSJohn Baldwin #define	WINDOWSIZE	1
49fdf929ffSJohn Baldwin #define	WINDOWSIZE_MIN	1
50fdf929ffSJohn Baldwin #define	WINDOWSIZE_MAX	65535
51fdf929ffSJohn Baldwin 
52e7ff5475SWarner Losh extern int	timeoutpacket;
53e7ff5475SWarner Losh extern int	timeoutnetwork;
54e7ff5475SWarner Losh extern int	maxtimeouts;
55e7ff5475SWarner Losh int	settimeouts(int timeoutpacket, int timeoutnetwork, int maxtimeouts);
56e7ff5475SWarner Losh 
57e7ff5475SWarner Losh extern uint16_t	segsize;
58e7ff5475SWarner Losh extern uint16_t	pktsize;
59fdf929ffSJohn Baldwin extern uint16_t	windowsize;
60e7ff5475SWarner Losh 
61e7ff5475SWarner Losh extern int	acting_as_client;
62e7ff5475SWarner Losh 
63e7ff5475SWarner Losh /*
64e7ff5475SWarner Losh  */
65e7ff5475SWarner Losh void	unmappedaddr(struct sockaddr_in6 *sin6);
661ed44fccSDag-Erling Smørgrav size_t	get_field(int peer, char *buffer, size_t size);
67e7ff5475SWarner Losh 
68e7ff5475SWarner Losh /*
69e7ff5475SWarner Losh  * Packet types
70e7ff5475SWarner Losh  */
71e7ff5475SWarner Losh struct packettypes {
72e7ff5475SWarner Losh 	int	value;
7304ebad38SMarius Strobl 	const char *const name;
74e7ff5475SWarner Losh };
75e7ff5475SWarner Losh extern struct packettypes packettypes[];
7604ebad38SMarius Strobl const char *packettype(int);
77e7ff5475SWarner Losh 
78e7ff5475SWarner Losh /*
79e7ff5475SWarner Losh  * RP_
80e7ff5475SWarner Losh  */
81e7ff5475SWarner Losh struct rp_errors {
82e7ff5475SWarner Losh 	int	error;
8304ebad38SMarius Strobl 	const char *const desc;
84e7ff5475SWarner Losh };
85e7ff5475SWarner Losh extern struct rp_errors rp_errors[];
86e7ff5475SWarner Losh char	*rp_strerror(int error);
87e7ff5475SWarner Losh 
88e7ff5475SWarner Losh /*
89e7ff5475SWarner Losh  * Debug features
90e7ff5475SWarner Losh  */
91e7ff5475SWarner Losh #define	DEBUG_NONE	0x0000
92e7ff5475SWarner Losh #define DEBUG_PACKETS	0x0001
93e7ff5475SWarner Losh #define DEBUG_SIMPLE	0x0002
94e7ff5475SWarner Losh #define DEBUG_OPTIONS	0x0004
95e7ff5475SWarner Losh #define DEBUG_ACCESS	0x0008
96e7ff5475SWarner Losh struct debugs {
97e7ff5475SWarner Losh 	int	value;
9804ebad38SMarius Strobl 	const char *const name;
9904ebad38SMarius Strobl 	const char *const desc;
100e7ff5475SWarner Losh };
101e7ff5475SWarner Losh extern int	debug;
102e7ff5475SWarner Losh extern struct debugs debugs[];
103e7ff5475SWarner Losh extern int	packetdroppercentage;
104e7ff5475SWarner Losh int	debug_find(char *s);
105e7ff5475SWarner Losh int	debug_finds(char *s);
10604ebad38SMarius Strobl const char *debug_show(int d);
107e7ff5475SWarner Losh 
108e7ff5475SWarner Losh /*
109e7ff5475SWarner Losh  * Log routines
110e7ff5475SWarner Losh  */
111e7ff5475SWarner Losh #define DEBUG(s) tftp_log(LOG_DEBUG, "%s", s)
112e7ff5475SWarner Losh extern int tftp_logtostdout;
113e7ff5475SWarner Losh void	tftp_openlog(const char *ident, int logopt, int facility);
114e7ff5475SWarner Losh void	tftp_closelog(void);
115b713097aSMarius Strobl void	tftp_log(int priority, const char *message, ...) __printflike(2, 3);
116e7ff5475SWarner Losh 
117e7ff5475SWarner Losh /*
118e7ff5475SWarner Losh  * Performance figures
119e7ff5475SWarner Losh  */
120e7ff5475SWarner Losh struct tftp_stats {
121e7ff5475SWarner Losh 	size_t		amount;
122e7ff5475SWarner Losh 	int		rollovers;
123e7ff5475SWarner Losh 	uint32_t	blocks;
124e7ff5475SWarner Losh 	int		retries;
125e7ff5475SWarner Losh 	struct timeval	tstart;
126e7ff5475SWarner Losh 	struct timeval	tstop;
127e7ff5475SWarner Losh };
128e7ff5475SWarner Losh 
129e7ff5475SWarner Losh void	stats_init(struct tftp_stats *ts);
130e7ff5475SWarner Losh void	printstats(const char *direction, int verbose, struct tftp_stats *ts);
131