xref: /freebsd/libexec/tftpd/tftp-utils.h (revision 4d09eb87)
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 /*
29e7ff5475SWarner Losh  */
30e7ff5475SWarner Losh #define	TIMEOUT		5
31e7ff5475SWarner Losh #define	MAX_TIMEOUTS	5
32e7ff5475SWarner Losh 
33e7ff5475SWarner Losh /* Generic values */
34e7ff5475SWarner Losh #define MAXSEGSIZE	65464		/* Maximum size of the data segment */
35e7ff5475SWarner Losh #define	MAXPKTSIZE	(MAXSEGSIZE + 4) /* Maximum size of the packet */
36e7ff5475SWarner Losh 
37e7ff5475SWarner Losh /* For the blksize option */
381acf0dbaSUlrich Spörlein #define BLKSIZE_MIN	8		/* Minimum size of the data segment */
39e7ff5475SWarner Losh #define BLKSIZE_MAX	MAXSEGSIZE	/* Maximum size of the data segment */
40e7ff5475SWarner Losh 
41e7ff5475SWarner Losh /* For the timeout option */
421acf0dbaSUlrich Spörlein #define TIMEOUT_MIN	0		/* Minimum timeout value */
43e7ff5475SWarner Losh #define TIMEOUT_MAX	255		/* Maximum timeout value */
44e7ff5475SWarner Losh #define MIN_TIMEOUTS	3
45e7ff5475SWarner Losh 
46fdf929ffSJohn Baldwin /* For the windowsize option */
47fdf929ffSJohn Baldwin #define	WINDOWSIZE	1
48fdf929ffSJohn Baldwin #define	WINDOWSIZE_MIN	1
49fdf929ffSJohn Baldwin #define	WINDOWSIZE_MAX	65535
50fdf929ffSJohn Baldwin 
51e7ff5475SWarner Losh extern int	timeoutpacket;
52e7ff5475SWarner Losh extern int	timeoutnetwork;
53e7ff5475SWarner Losh extern int	maxtimeouts;
54e7ff5475SWarner Losh int	settimeouts(int timeoutpacket, int timeoutnetwork, int maxtimeouts);
55e7ff5475SWarner Losh 
56e7ff5475SWarner Losh extern uint16_t	segsize;
57e7ff5475SWarner Losh extern uint16_t	pktsize;
58fdf929ffSJohn Baldwin extern uint16_t	windowsize;
59e7ff5475SWarner Losh 
60e7ff5475SWarner Losh extern int	acting_as_client;
61e7ff5475SWarner Losh 
62e7ff5475SWarner Losh /*
63e7ff5475SWarner Losh  */
64e7ff5475SWarner Losh void	unmappedaddr(struct sockaddr_in6 *sin6);
651ed44fccSDag-Erling Smørgrav size_t	get_field(int peer, char *buffer, size_t size);
66e7ff5475SWarner Losh 
67e7ff5475SWarner Losh /*
68e7ff5475SWarner Losh  * Packet types
69e7ff5475SWarner Losh  */
70e7ff5475SWarner Losh struct packettypes {
71e7ff5475SWarner Losh 	int	value;
7204ebad38SMarius Strobl 	const char *const name;
73e7ff5475SWarner Losh };
74e7ff5475SWarner Losh extern struct packettypes packettypes[];
7504ebad38SMarius Strobl const char *packettype(int);
76e7ff5475SWarner Losh 
77e7ff5475SWarner Losh /*
78e7ff5475SWarner Losh  * RP_
79e7ff5475SWarner Losh  */
80e7ff5475SWarner Losh struct rp_errors {
81e7ff5475SWarner Losh 	int	error;
8204ebad38SMarius Strobl 	const char *const desc;
83e7ff5475SWarner Losh };
84e7ff5475SWarner Losh extern struct rp_errors rp_errors[];
85e7ff5475SWarner Losh char	*rp_strerror(int error);
86e7ff5475SWarner Losh 
87e7ff5475SWarner Losh /*
88e7ff5475SWarner Losh  * Debug features
89e7ff5475SWarner Losh  */
90e7ff5475SWarner Losh #define	DEBUG_NONE	0x0000
91e7ff5475SWarner Losh #define DEBUG_PACKETS	0x0001
92e7ff5475SWarner Losh #define DEBUG_SIMPLE	0x0002
93e7ff5475SWarner Losh #define DEBUG_OPTIONS	0x0004
94e7ff5475SWarner Losh #define DEBUG_ACCESS	0x0008
95e7ff5475SWarner Losh struct debugs {
96e7ff5475SWarner Losh 	int	value;
9704ebad38SMarius Strobl 	const char *const name;
9804ebad38SMarius Strobl 	const char *const desc;
99e7ff5475SWarner Losh };
100e7ff5475SWarner Losh extern int	debug;
101e7ff5475SWarner Losh extern struct debugs debugs[];
102*4d09eb87SDag-Erling Smørgrav extern unsigned int packetdroppercentage;
103e7ff5475SWarner Losh int	debug_find(char *s);
104e7ff5475SWarner Losh int	debug_finds(char *s);
10504ebad38SMarius Strobl const char *debug_show(int d);
106e7ff5475SWarner Losh 
107e7ff5475SWarner Losh /*
108e7ff5475SWarner Losh  * Log routines
109e7ff5475SWarner Losh  */
110e7ff5475SWarner Losh #define DEBUG(s) tftp_log(LOG_DEBUG, "%s", s)
111e7ff5475SWarner Losh extern int tftp_logtostdout;
112e7ff5475SWarner Losh void	tftp_openlog(const char *ident, int logopt, int facility);
113e7ff5475SWarner Losh void	tftp_closelog(void);
114b713097aSMarius Strobl void	tftp_log(int priority, const char *message, ...) __printflike(2, 3);
115e7ff5475SWarner Losh 
116e7ff5475SWarner Losh /*
117e7ff5475SWarner Losh  * Performance figures
118e7ff5475SWarner Losh  */
119e7ff5475SWarner Losh struct tftp_stats {
120e7ff5475SWarner Losh 	size_t		amount;
121e7ff5475SWarner Losh 	int		rollovers;
122e7ff5475SWarner Losh 	uint32_t	blocks;
123e7ff5475SWarner Losh 	int		retries;
124e7ff5475SWarner Losh 	struct timeval	tstart;
125e7ff5475SWarner Losh 	struct timeval	tstop;
126e7ff5475SWarner Losh };
127e7ff5475SWarner Losh 
128e7ff5475SWarner Losh void	stats_init(struct tftp_stats *ts);
129e7ff5475SWarner Losh void	printstats(const char *direction, int verbose, struct tftp_stats *ts);
130