annotate src/gt_packet.h @ 0:d39e1d0d75b6

initial add
author paulo@hit-nxdomain.opendns.com
date Sat, 20 Feb 2010 21:18:28 -0800
parents
children
rev   line source
paulo@0 1 /*
paulo@0 2 * $Id: gt_packet.h,v 1.27 2004/05/02 10:09:41 hipnod Exp $
paulo@0 3 *
paulo@0 4 * Copyright (C) 2001-2003 giFT project (gift.sourceforge.net)
paulo@0 5 *
paulo@0 6 * This program is free software; you can redistribute it and/or modify it
paulo@0 7 * under the terms of the GNU General Public License as published by the
paulo@0 8 * Free Software Foundation; either version 2, or (at your option) any
paulo@0 9 * later version.
paulo@0 10 *
paulo@0 11 * This program is distributed in the hope that it will be useful, but
paulo@0 12 * WITHOUT ANY WARRANTY; without even the implied warranty of
paulo@0 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
paulo@0 14 * General Public License for more details.
paulo@0 15 */
paulo@0 16
paulo@0 17 #ifndef GIFT_GT_PACKET_H_
paulo@0 18 #define GIFT_GT_PACKET_H_
paulo@0 19
paulo@0 20 /*****************************************************************************/
paulo@0 21
paulo@0 22 #define PACKET_DEBUG gt_config_get_int("packet/debug=0")
paulo@0 23 #define PACKET_ASCII_LOG gt_config_get_str("packet/ascii_log_file=/dev/tty")
paulo@0 24
paulo@0 25 /*****************************************************************************/
paulo@0 26
paulo@0 27 #define GNUTELLA_HDR_LEN 23
paulo@0 28
paulo@0 29 #define GT_PACKET_INITIAL (48)
paulo@0 30 #define GT_PACKET_MAX (65536) /* smallest invalid, including header */
paulo@0 31
paulo@0 32 /*****************************************************************************/
paulo@0 33
paulo@0 34 struct gt_packet
paulo@0 35 {
paulo@0 36 uint32_t offset; /* Pointer within packet */
paulo@0 37 uint32_t len; /* size of packet structure */
paulo@0 38 uint32_t data_len; /* how big the packet data is */
paulo@0 39 uint32_t error; /* packet encountered memory error */
paulo@0 40
paulo@0 41 unsigned char *data; /* packet header + arbtrary packet data */
paulo@0 42 };
paulo@0 43
paulo@0 44 typedef struct gt_packet GtPacket;
paulo@0 45
paulo@0 46 typedef enum gt_packet_type
paulo@0 47 {
paulo@0 48 GT_MSG_PING = 0x00,
paulo@0 49 GT_MSG_PING_REPLY = 0x01,
paulo@0 50 GT_MSG_BYE = 0x02,
paulo@0 51 GT_MSG_QUERY_ROUTE = 0x30,
paulo@0 52 GT_MSG_VENDOR = 0x31,
paulo@0 53 GT_MSG_VENDOR_STD = 0x32,
paulo@0 54 GT_MSG_PUSH = 0x40,
paulo@0 55 GT_MSG_QUERY = 0x80,
paulo@0 56 GT_MSG_QUERY_REPLY = 0x81,
paulo@0 57 } gt_packet_type_t;
paulo@0 58
paulo@0 59 /*****************************************************************************/
paulo@0 60
paulo@0 61 #define VMSG_HDR_LEN (8)
paulo@0 62
paulo@0 63 typedef struct gt_vendor_msg
paulo@0 64 {
paulo@0 65 char vendor_id[4];
paulo@0 66 uint16_t id;
paulo@0 67 } gt_vendor_msg_t;
paulo@0 68
paulo@0 69 /*
paulo@0 70 * Pretend these global variables are enumerated constants...don't squint
paulo@0 71 * too hard and you won't see they are global variables.
paulo@0 72 */
paulo@0 73 extern const gt_vendor_msg_t *GT_VMSG_MESSAGES_SUPP,
paulo@0 74 *GT_VMSG_TCP_CONNECT_BACK,
paulo@0 75 *GT_VMSG_HOPS_FLOW,
paulo@0 76 *GT_VMSG_PUSH_PROXY_REQ,
paulo@0 77 *GT_VMSG_PUSH_PROXY_ACK;
paulo@0 78
paulo@0 79 /*****************************************************************************/
paulo@0 80
paulo@0 81 #define get_guid(pkt) ((pkt)[0])
paulo@0 82 #define get_command(pkt) ((pkt)[16])
paulo@0 83 #define get_ttl(pkt) ((pkt)[17])
paulo@0 84 #define get_hops(pkt) ((pkt)[18])
paulo@0 85
paulo@0 86 #define get_payload_len(pkt) \
paulo@0 87 (((pkt)[19]) | ((pkt)[20] << 8) | \
paulo@0 88 ((pkt)[21] << 16) | ((pkt)[22] << 24))
paulo@0 89
paulo@0 90 /*****************************************************************************/
paulo@0 91
paulo@0 92 /* handle little-endian ordering on the network */
paulo@0 93
paulo@0 94 #ifdef WORDS_BIGENDIAN
paulo@0 95 /*
paulo@0 96 * It's best to watch out for sign extension, so we copy to temporary
paulo@0 97 * unsigned variables here. In case the arguments are signed, all is
paulo@0 98 * well.
paulo@0 99 *
paulo@0 100 * NOTE: this depends on a gcc-extension. If someone wants to port to
paulo@0 101 * a big-endian, non-gcc compiler, more work here is needed.
paulo@0 102 *
paulo@0 103 * NOTE2: the uint{16,32}_t types are guaranteed to be _at least_ the
paulo@0 104 * number of bits they say they are (i think), so we discard possibly
paulo@0 105 * extra bits by using bitwise-and.
paulo@0 106 */
paulo@0 107 #define vtohl(x) \
paulo@0 108 ({ \
paulo@0 109 uint32_t _tmp = (x); \
paulo@0 110 (((_tmp & 0xff) << 24) | ((_tmp & 0xff00) << 8) | \
paulo@0 111 ((_tmp & 0xff0000) >> 8) | ((_tmp >> 24) & 0xff)); \
paulo@0 112 })
paulo@0 113
paulo@0 114 #define vtohs(x) \
paulo@0 115 ({ \
paulo@0 116 uint16_t _tmp = (x); \
paulo@0 117 (((_tmp & 0xff) << 8) | ((_tmp >> 8) & 0xff)); \
paulo@0 118 })
paulo@0 119 #else
paulo@0 120 #define vtohs(x) (x)
paulo@0 121 #define vtohl(x) (x)
paulo@0 122 #endif /* WORDS_BIGENDIAN */
paulo@0 123
paulo@0 124 #define htovs(x) vtohs(x)
paulo@0 125 #define htovl(x) vtohl(x)
paulo@0 126
paulo@0 127 /* endianness defines */
paulo@0 128 #define BIG 1
paulo@0 129 #define LITTLE 0
paulo@0 130
paulo@0 131 /*****************************************************************************/
paulo@0 132
paulo@0 133 #ifdef __GNUC__
paulo@0 134 #define FORMAT_ATTRIBUTE(kind, fmt_arg, first_arg) \
paulo@0 135 __attribute__ ((format (kind, fmt_arg, first_arg)))
paulo@0 136 #else
paulo@0 137 #define FORMAT_ATTRIBUTE(kind, fmt_arg, first_arg)
paulo@0 138 #endif
paulo@0 139
paulo@0 140 /*****************************************************************************/
paulo@0 141
paulo@0 142 GtPacket *gt_packet_new (uint8_t cmd, uint8_t ttl, gt_guid_t *guid);
paulo@0 143 GtPacket *gt_packet_reply (GtPacket *packet, uint8_t cmd);
paulo@0 144 GtPacket *gt_packet_vendor (const gt_vendor_msg_t *vmsg);
paulo@0 145 void gt_packet_free (GtPacket *packet);
paulo@0 146 int gt_packet_error (GtPacket *packet);
paulo@0 147 int gt_packet_seek (GtPacket *packet, int offset);
paulo@0 148
paulo@0 149 GtPacket *gt_packet_unserialize (unsigned char *data, size_t len);
paulo@0 150
paulo@0 151 /*****************************************************************************/
paulo@0 152
paulo@0 153 gt_guid_t *gt_packet_guid (GtPacket *packet);
paulo@0 154 uint32_t gt_packet_payload_len (GtPacket *packet);
paulo@0 155 uint32_t gt_packet_command (GtPacket *packet);
paulo@0 156 uint8_t gt_packet_hops (GtPacket *packet);
paulo@0 157 uint8_t gt_packet_ttl (GtPacket *packet);
paulo@0 158
paulo@0 159 /*****************************************************************************/
paulo@0 160
paulo@0 161 void gt_packet_set_guid (GtPacket *packet, gt_guid_t *guid);
paulo@0 162 void gt_packet_set_payload_len (GtPacket *packet, uint32_t len);
paulo@0 163 void gt_packet_set_command (GtPacket *packet, uint8_t cmd);
paulo@0 164 void gt_packet_set_hops (GtPacket *packet, uint8_t hops);
paulo@0 165 void gt_packet_set_ttl (GtPacket *packet, uint8_t ttl);
paulo@0 166
paulo@0 167 /*****************************************************************************/
paulo@0 168
paulo@0 169 uint32_t gt_packet_get_uint (GtPacket *packet, size_t size,
paulo@0 170 int endian, int swap);
paulo@0 171
paulo@0 172 uint8_t gt_packet_get_uint8 (GtPacket *packet);
paulo@0 173 uint16_t gt_packet_get_uint16 (GtPacket *packet);
paulo@0 174 uint32_t gt_packet_get_uint32 (GtPacket *packet);
paulo@0 175
paulo@0 176 in_addr_t gt_packet_get_ip (GtPacket *packet);
paulo@0 177 in_port_t gt_packet_get_port (GtPacket *packet);
paulo@0 178
paulo@0 179 char *gt_packet_get_str (GtPacket *packet);
paulo@0 180 unsigned char *gt_packet_get_ustr (GtPacket *packet, size_t len);
paulo@0 181
paulo@0 182 /*****************************************************************************/
paulo@0 183
paulo@0 184 int gt_packet_put_uint8 (GtPacket *packet, uint8_t byte);
paulo@0 185 int gt_packet_put_uint16 (GtPacket *packet, uint16_t bytes);
paulo@0 186 int gt_packet_put_uint32 (GtPacket *packet, uint32_t bytes);
paulo@0 187
paulo@0 188 int gt_packet_put_str (GtPacket *packet, const char *str);
paulo@0 189 int gt_packet_put_ustr (GtPacket *packet, const unsigned char *ustr,
paulo@0 190 size_t len);
paulo@0 191
paulo@0 192 int gt_packet_put_ip (GtPacket *packet, in_addr_t ip);
paulo@0 193 int gt_packet_put_port (GtPacket *packet, in_port_t port);
paulo@0 194
paulo@0 195 /*****************************************************************************/
paulo@0 196
paulo@0 197 int gt_packet_send (TCPC *c, GtPacket *packet);
paulo@0 198
paulo@0 199 int gt_packet_send_fmt (TCPC *c, uint8_t cmd,
paulo@0 200 gt_guid_t *guid, uint8_t ttl,
paulo@0 201 uint8_t hops, char *fmt, ...)
paulo@0 202 FORMAT_ATTRIBUTE (printf, 6, 7);
paulo@0 203
paulo@0 204 int gt_packet_reply_fmt (TCPC *c, GtPacket *packet,
paulo@0 205 uint8_t cmd, char *fmt, ...)
paulo@0 206 FORMAT_ATTRIBUTE (printf, 4, 5);
paulo@0 207
paulo@0 208
paulo@0 209 /*****************************************************************************/
paulo@0 210
paulo@0 211 void gt_packet_log (GtPacket *packet, struct tcp_conn *src, int sent);
paulo@0 212
paulo@0 213 /*****************************************************************************/
paulo@0 214
paulo@0 215 #endif /* GIFT_GT_PACKET_H_ */