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_ */
|