1 #ifndef NMSG_IPREASM_H 2 #define NMSG_IPREASM_H 3 4 #define reasm_time_t _nmsg_ipreasm_time_t 5 #define reasm_ip _nmsg_ipreasm 6 #define reasm_ip_new _nmsg_ipreasm_new 7 #define reasm_ip_free _nmsg_ipreasm_free 8 #define reasm_ip_next _nmsg_ipreasm_next 9 #define reasm_ip_set_timeout _nmsg_ipreasm_set_timeout 10 #define reasm_ip_waiting _nmsg_ipreasm_waiting 11 #define reasm_ip_max_waiting _nmsg_ipreasm_max_waiting 12 #define reasm_ip_timed_out _nmsg_ipreasm_timed_out 13 #define reasm_ip_dropped_frags _nmsg_ipreasm_dropped_frags 14 15 /* 16 * Copyright (c) 2007 Jan Andres <jandres@gmx.net> 17 * 18 * Permission to use, copy, modify, and distribute this software for any 19 * purpose with or without fee is hereby granted, provided that the above 20 * copyright notice and this permission notice appear in all copies. 21 */ 22 23 #include <stdbool.h> 24 25 /* 26 * This is an abstract time stamp. ipreasm doesn't care whether it is 27 * in seconds, milliseconds, or nanodecades. All it does it add the 28 * configured timeout value to it, and then compare it to the timstamps 29 * of subsequent packets to decide whether a fragment has expired. 30 */ 31 typedef uint64_t reasm_time_t; 32 33 struct reasm_ip; 34 35 /* 36 * Functions to create and destroy the reassembly environment. 37 */ 38 struct reasm_ip *reasm_ip_new (void); 39 void reasm_ip_free (struct reasm_ip *reasm); 40 41 /* 42 * This is the main packet processing function. It inputs one packet, 43 * and MAY output one packet in turn. If the input was not a fragment, 44 * no output is generated, and false is returned. If the input was a 45 * fragment, true is returned. 46 * The unsigned pointed to by output_len should initially be set to the 47 * size of the buffer behind out_packet. On return, it will be set to 48 * the length of the packet returned, or 0 if no packet was returned 49 * (this will happen if a fragment is recognized, but reassembly of the 50 * corresponding packet has not completed yet). 51 * If frag_hdr_offset is not zero, for IPv6 packets, it specifies the 52 * offset into the packet at which the fragment header starts. 53 */ 54 bool reasm_ip_next (struct reasm_ip *reasm, const unsigned char *packet, 55 unsigned len, unsigned frag_hdr_offset, 56 reasm_time_t timestamp, unsigned char *out_packet, 57 unsigned *output_len); 58 59 /* 60 * Set the timeout after which a noncompleted reassembly expires, in 61 * abstract time units (see above for the definition of reasm_time_t). 62 */ 63 bool reasm_ip_set_timeout (struct reasm_ip *reasm, reasm_time_t timeout); 64 65 /* 66 * Query certain information about the current state. 67 */ 68 unsigned reasm_ip_waiting (const struct reasm_ip *reasm); 69 unsigned reasm_ip_max_waiting (const struct reasm_ip *reasm); 70 unsigned reasm_ip_timed_out (const struct reasm_ip *reasm); 71 unsigned reasm_ip_dropped_frags (const struct reasm_ip *reasm); 72 73 #endif /* NMSG_IPREASM_H */ 74