1f1d078c3SMark McLoughlin /*
2f1d078c3SMark McLoughlin * QEMU System Emulator
3f1d078c3SMark McLoughlin *
4f1d078c3SMark McLoughlin * Copyright (c) 2003-2008 Fabrice Bellard
5f1d078c3SMark McLoughlin *
6f1d078c3SMark McLoughlin * Permission is hereby granted, free of charge, to any person obtaining a copy
7f1d078c3SMark McLoughlin * of this software and associated documentation files (the "Software"), to deal
8f1d078c3SMark McLoughlin * in the Software without restriction, including without limitation the rights
9f1d078c3SMark McLoughlin * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10f1d078c3SMark McLoughlin * copies of the Software, and to permit persons to whom the Software is
11f1d078c3SMark McLoughlin * furnished to do so, subject to the following conditions:
12f1d078c3SMark McLoughlin *
13f1d078c3SMark McLoughlin * The above copyright notice and this permission notice shall be included in
14f1d078c3SMark McLoughlin * all copies or substantial portions of the Software.
15f1d078c3SMark McLoughlin *
16f1d078c3SMark McLoughlin * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17f1d078c3SMark McLoughlin * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18f1d078c3SMark McLoughlin * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19f1d078c3SMark McLoughlin * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20f1d078c3SMark McLoughlin * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21f1d078c3SMark McLoughlin * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22f1d078c3SMark McLoughlin * THE SOFTWARE.
23f1d078c3SMark McLoughlin */
24f1d078c3SMark McLoughlin
25f1d078c3SMark McLoughlin #ifndef QEMU_NET_UTIL_H
26f1d078c3SMark McLoughlin #define QEMU_NET_UTIL_H
27f1d078c3SMark McLoughlin
28f1d078c3SMark McLoughlin
29e05ae1d9SMarc-André Lureau /*
30e05ae1d9SMarc-André Lureau * Structure of an internet header, naked of options.
31e05ae1d9SMarc-André Lureau */
32e05ae1d9SMarc-André Lureau struct ip {
33*e03b5686SMarc-André Lureau #if HOST_BIG_ENDIAN
34e05ae1d9SMarc-André Lureau uint8_t ip_v:4, /* version */
35e05ae1d9SMarc-André Lureau ip_hl:4; /* header length */
36e05ae1d9SMarc-André Lureau #else
37e05ae1d9SMarc-André Lureau uint8_t ip_hl:4, /* header length */
38e05ae1d9SMarc-André Lureau ip_v:4; /* version */
39e05ae1d9SMarc-André Lureau #endif
40e05ae1d9SMarc-André Lureau uint8_t ip_tos; /* type of service */
41e05ae1d9SMarc-André Lureau uint16_t ip_len; /* total length */
42e05ae1d9SMarc-André Lureau uint16_t ip_id; /* identification */
43e05ae1d9SMarc-André Lureau uint16_t ip_off; /* fragment offset field */
44e05ae1d9SMarc-André Lureau #define IP_DF 0x4000 /* don't fragment flag */
45e05ae1d9SMarc-André Lureau #define IP_MF 0x2000 /* more fragments flag */
46e05ae1d9SMarc-André Lureau #define IP_OFFMASK 0x1fff /* mask for fragmenting bits */
47e05ae1d9SMarc-André Lureau uint8_t ip_ttl; /* time to live */
48e05ae1d9SMarc-André Lureau uint8_t ip_p; /* protocol */
49e05ae1d9SMarc-André Lureau uint16_t ip_sum; /* checksum */
50e05ae1d9SMarc-André Lureau struct in_addr ip_src, ip_dst; /* source and dest address */
51e05ae1d9SMarc-André Lureau } QEMU_PACKED;
52e05ae1d9SMarc-André Lureau
in6_equal_net(const struct in6_addr * a,const struct in6_addr * b,int prefix_len)53e05ae1d9SMarc-André Lureau static inline bool in6_equal_net(const struct in6_addr *a,
54e05ae1d9SMarc-André Lureau const struct in6_addr *b,
55e05ae1d9SMarc-André Lureau int prefix_len)
56e05ae1d9SMarc-André Lureau {
57e05ae1d9SMarc-André Lureau if (memcmp(a, b, prefix_len / 8) != 0) {
58e05ae1d9SMarc-André Lureau return 0;
59e05ae1d9SMarc-André Lureau }
60e05ae1d9SMarc-André Lureau
61e05ae1d9SMarc-André Lureau if (prefix_len % 8 == 0) {
62e05ae1d9SMarc-André Lureau return 1;
63e05ae1d9SMarc-André Lureau }
64e05ae1d9SMarc-André Lureau
65e05ae1d9SMarc-André Lureau return a->s6_addr[prefix_len / 8] >> (8 - (prefix_len % 8))
66e05ae1d9SMarc-André Lureau == b->s6_addr[prefix_len / 8] >> (8 - (prefix_len % 8));
67e05ae1d9SMarc-André Lureau }
68e05ae1d9SMarc-André Lureau
69e05ae1d9SMarc-André Lureau #define TCPS_CLOSED 0 /* closed */
70e05ae1d9SMarc-André Lureau #define TCPS_LISTEN 1 /* listening for connection */
71e05ae1d9SMarc-André Lureau #define TCPS_SYN_SENT 2 /* active, have sent syn */
72e05ae1d9SMarc-André Lureau #define TCPS_SYN_RECEIVED 3 /* have send and received syn */
73e05ae1d9SMarc-André Lureau /* states < TCPS_ESTABLISHED are those where connections not established */
74e05ae1d9SMarc-André Lureau #define TCPS_ESTABLISHED 4 /* established */
75e05ae1d9SMarc-André Lureau #define TCPS_CLOSE_WAIT 5 /* rcvd fin, waiting for close */
76e05ae1d9SMarc-André Lureau /* states > TCPS_CLOSE_WAIT are those where user has closed */
77e05ae1d9SMarc-André Lureau #define TCPS_FIN_WAIT_1 6 /* have closed, sent fin */
78e05ae1d9SMarc-André Lureau #define TCPS_CLOSING 7 /* closed xchd FIN; await FIN ACK */
79e05ae1d9SMarc-André Lureau #define TCPS_LAST_ACK 8 /* had fin and close; await FIN ACK */
80e05ae1d9SMarc-André Lureau /* states > TCPS_CLOSE_WAIT && < TCPS_FIN_WAIT_2 await ACK of FIN */
81e05ae1d9SMarc-André Lureau #define TCPS_FIN_WAIT_2 9 /* have closed, fin is acked */
82e05ae1d9SMarc-André Lureau #define TCPS_TIME_WAIT 10 /* in 2*msl quiet wait after close */
83e05ae1d9SMarc-André Lureau
84f1d078c3SMark McLoughlin int net_parse_macaddr(uint8_t *macaddr, const char *p);
85f1d078c3SMark McLoughlin
86f1d078c3SMark McLoughlin #endif /* QEMU_NET_UTIL_H */
87