xref: /qemu/net/util.h (revision e03b5686)
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