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