1 /******************************************************************************/
2 /*                                                                            */
3 /*   Copyright (c) International Business Machines  Corp., 2005, 2006         */
4 /*                                                                            */
5 /*   This program is free software;  you can redistribute it and/or modify    */
6 /*   it under the terms of the GNU General Public License as published by     */
7 /*   the Free Software Foundation; either version 2 of the License, or        */
8 /*   (at your option) any later version.                                      */
9 /*                                                                            */
10 /*   This program is distributed in the hope that it will be useful,          */
11 /*   but WITHOUT ANY WARRANTY;  without even the implied warranty of          */
12 /*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See                */
13 /*   the GNU General Public License for more details.                         */
14 /*                                                                            */
15 /*   You should have received a copy of the GNU General Public License        */
16 /*   along with this program;  if not, write to the Free Software             */
17 /*   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA  */
18 /*                                                                            */
19 /******************************************************************************/
20 
21 
22 /*
23  * File:
24  *	ns-traffic.h
25  *
26  * Description:
27  *	Header file for TCP/UDP traffic utilities
28  *
29  * Author:
30  *	Mitsuru Chinen <mitch@jp.ibm.com>
31  *
32  * History:
33  *	Oct 19 2005 - Created (Mitsuru Chinen)
34  *	May  1 2006 - Added functions for broken_ip, route, multicast tests
35  *---------------------------------------------------------------------------*/
36 
37 #ifndef _NS_TRAFFIC_H
38 #define _NS_TRAFFIC_H 1
39 
40 /*
41  * Gloval variables
42  */
43 #ifdef NS_COMMON
44 #  define EXTERN
45 #else
46 #  define EXTERN extern
47 #endif
48 EXTERN int debug;		/* If nonzero, output debug information. */
49 
50 /*
51  * Include headers
52  */
53 #include <netdb.h>
54 #include <net/if.h>
55 #include <net/if_arp.h>
56 #include <netinet/ip_icmp.h>
57 #include <netinet/ip6.h>
58 #include <netinet/icmp6.h>
59 #include <netpacket/packet.h>
60 #include <linux/if_ether.h>
61 
62 
63 /*
64  * Fixed Values
65  */
66 #define PORTNUMMIN		IPPORT_RESERVED + 1
67 #define PORTNUMMAX		0xFFFF
68 #define ETH_DATA_MAXSIZE	1500
69 #define IPV4_PACKET_ID		0xBEEF
70 #define IPV4_DEFAULT_TTL	64
71 #define IPV4_DEFAULT_FLAG	0x4000
72 #define IPV4_PAYLOAD_MAXSIZE	1480
73 #define IPV6_DEFAULT_HOPLIMIT	255
74 #define IPV6_PAYLOAD_MAXSIZE	1460
75 #define ICMP_ECHO_ID		0xCAFE
76 #define ICMPV4_DATA_MAXSIZE	1472
77 #define ICMPV6_DATA_MAXSIZE	1452
78 #define RDOPT_MAXSIZE		1412
79 
80 #define FAKE_VERSION	0x01
81 #define FAKE_IHL	0x02
82 #define FAKE_TOT_LEN	0x04
83 #define FAKE_PLEN	0x04
84 #define FAKE_FRAGMENT	0x08
85 #define FAKE_PROTOCOL	0x10
86 #define FAKE_NXT	0x10
87 #define FAKE_CHECK	0x20
88 #define FAKE_DADDR	0x40
89 
90 #define PROC_IFINET6_FILE		"/proc/net/if_inet6"
91 #define PROC_IFINET6_FILE_LINELENGTH	64
92 #define PROC_IFINET6_LINKLOCAL		0x20
93 
94 
95 /*
96  * Structure definition
97  */
98 struct eth_frame {
99     struct ethhdr hdr;
100     unsigned char data[ETH_DATA_MAXSIZE];
101 };
102 
103 struct arp_datagram {
104     struct arphdr hdr;
105     unsigned char ar_sha[ETH_ALEN];
106     unsigned char ar_sip[4];
107     unsigned char ar_tha[ETH_ALEN];
108     unsigned char ar_tip[4];
109 };
110 
111 struct ip4_datagram {
112     struct iphdr hdr;
113     unsigned char payload[IPV4_PAYLOAD_MAXSIZE];
114 };
115 
116 struct icmp4_segment {
117     struct icmphdr hdr;
118     unsigned char data[ICMPV4_DATA_MAXSIZE];
119 };
120 
121 struct ip6_datagram {
122     struct ip6_hdr hdr;
123     unsigned char payload[IPV6_PAYLOAD_MAXSIZE];
124 };
125 
126 struct pseudo_ip6_hdr {
127     struct in6_addr p_ip6_src;
128     struct in6_addr p_ip6_dst;
129     u_int32_t p_ip6_plen;
130     u_int16_t p_ip6_zero1;
131     u_int8_t p_ip6_zero2;
132     u_int8_t p_ip6_nxt;
133 };
134 
135 struct pseudo_ip6_datagram {
136     struct pseudo_ip6_hdr hdr;
137     unsigned char payload[IPV6_PAYLOAD_MAXSIZE];
138 };
139 
140 struct icmp6_segment {
141     struct icmp6_hdr hdr;
142     unsigned char data[ICMPV6_DATA_MAXSIZE];
143 };
144 
145 struct neighbor_sol {
146     struct nd_neighbor_solicit defs;
147     struct nd_opt_hdr sla_opt;
148     unsigned char src_laddr[ETH_ALEN];
149 };
150 
151 struct neighbor_adv {
152     struct nd_neighbor_advert defs;
153     struct nd_opt_hdr tla_opt;
154     unsigned char tgt_laddr[ETH_ALEN];
155 };
156 
157 struct neighbor_redirect {
158     struct nd_redirect defs;
159     struct nd_opt_rd_hdr rdopt_hdr;
160     unsigned rdopt_data[RDOPT_MAXSIZE];
161 };
162 
163 
164 struct hbh_router_alert {
165     uint8_t  nxthdr;
166     uint8_t  hbh_len;
167     uint8_t  alart_type;
168     uint8_t  alart_len;
169     uint16_t alart_data;
170     uint8_t  padn_type;
171     uint8_t  padn_len;
172     uint8_t  padn_data[0];
173 };
174 
175 
176 #if !defined(__LITTLE_ENDIAN_BITFIELD) || !defined(__BIG_ENDIAN_BITFIELD)
177 #  include <endian.h>
178 #endif
179 struct my_mldv2_query {
180     uint8_t type;
181     uint8_t code;
182     uint16_t cksum;
183     uint16_t maxdelay;
184     uint16_t reserved;
185     struct in6_addr addr;
186 #if __BYTE_ORDER == __LITTLE_ENDIAN
187     uint8_t qrv:3;
188     uint8_t suppress:1;
189     uint8_t resv:4;
190 #elif __BYTE_ORDER == __BIG_ENDIAN
191     uint8_t resv:4;
192     uint8_t suppress:1;
193     uint8_t qrv:3;
194 #else
195 #  error "Failed to detect endian"
196 #endif
197     uint8_t qqic;
198     uint16_t nsrcs;
199     struct in6_addr srcs[0];
200 };
201 
202 
203 /*
204  * Macros
205  */
206 #define MY_IGMPV3_QUERY_SIZE(numsrc) \
207 		(sizeof(struct igmpv3_query) + (numsrc) * sizeof(uint32_t))
208 
209 #define MY_MLDV2_QUERY_SIZE(numsrc) \
210 		(sizeof(struct my_mldv2_query) \
211 		 + (numsrc) * sizeof(struct in6_addr))
212 
213 #ifdef MLD_MAX_HOST_REPORT_DELAY
214 #  define MY_MLD_MAX_HOST_REPORT_DELAY	MLD_MAX_HOST_REPORT_DELAY
215 #else
216 #  define MY_MLD_MAX_HOST_REPORT_DELAY	1000
217 #endif
218 
219 #define IN6ADDR_ALLNODES_MULTICAST_INIT \
220 	    { { { 0xff,0x02,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } } }
221 
222 /*
223  * Functions in ns-common.c
224  */
225 void fatal_error(char *errmsg);
226 void maximize_sockbuf(int sd);
227 u_int16_t calc_checksum(u_int16_t *data, size_t size);
228 void fill_payload(unsigned char *payload_p, size_t size);
229 int rand_within(int first, int last);
230 u_int32_t bit_change_seed(size_t bitsize, size_t oversize);
231 int eth_pton(int af, const char *str, struct sockaddr_ll *ll);
232 void get_ifinfo(struct ifreq *ans, int sock_fd, const char *ifname, int query);
233 int strtotimespec(const char *str, struct timespec *ts_p);
234 int get_a_lla_byifindex(struct sockaddr_in6 *lla_p, int ifindex);
235 struct addrinfo *get_maddrinfo(sa_family_t family, const char *maddr, const char *portnum);
236 struct group_req *create_group_info(uint32_t ifindex, struct addrinfo *mainfo_p);
237 struct group_filter *create_source_filter(uint32_t ifindex, struct addrinfo *mainfo_p, uint32_t fmode, char *saddrs);
238 
239 #endif
240