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