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