Wireshark  4.3.0
The Wireshark network protocol analyzer
packet-ip.h
1 /* packet-ip.h
2  * Definitions for IP packet disassembly structures and routines
3  *
4  * Wireshark - Network traffic analyzer
5  * By Gerald Combs <gerald@wireshark.org>
6  * Copyright 1998 Gerald Combs
7  *
8  * SPDX-License-Identifier: GPL-2.0-or-later
9  */
10 
11 
12 #ifndef __PACKET_IP_H__
13 #define __PACKET_IP_H__
14 
15 #include "ws_symbol_export.h"
16 #include "packet-ipv6.h"
17 #include <epan/conversation.h>
18 
19 /*
20  * IP Version numbers, from
21  *
22  * https://www.iana.org/assignments/version-numbers/version-numbers.xhtml
23  */
24 #define IP_VERSION_NUM_RESERVED 0 /* Reserved */
25 #define IP_VERSION_NUM_INET 4 /* IP (IP version 4) */
26 #define IP_VERSION_NUM_ST 5 /* ST Datagram Mode */
27 #define IP_VERSION_NUM_INET6 6 /* IP6 (IP version 6) */
28 #define IP_VERSION_NUM_TPIX 7 /* TP/IX: The Next Internet */
29 #define IP_VERSION_NUM_PIP 8 /* The P Internet Protocol */
30 #define IP_VERSION_NUM_TUBA 9 /* TUBA */
31 
32 extern const value_string ip_version_vals[];
33 
34 typedef struct _ws_ip4
35 {
36  guint8 ip_ver; /* 4 */
37  guint8 ip_tos; /* type of service */
38  guint32 ip_len; /* total length */
39  guint16 ip_id; /* identification */
40  guint16 ip_off; /* fragment offset */
41  guint8 ip_ttl; /* time-to-live */
42  guint8 ip_proto; /* protocol */
43  guint16 ip_sum; /* checksum */
44  address ip_src; /* source address */
45  address ip_dst; /* destination address */
46  guint32 ip_stream; /* track conversations */
47 } ws_ip4;
48 
49 #define WS_IP4_PTR(p) ((ws_ip4 *)(((p) && *(guint8 *)(p) == 4) ? (p) : NULL))
50 
51 /* Differentiated Services Codepoint */
52 #define IPDSFIELD_DSCP_MASK 0xFC
53 #define IPDSFIELD_DSCP(dsfield) (((dsfield) & IPDSFIELD_DSCP_MASK) >> 2)
54 
55 /* Explicit Congestion Notification */
56 #define IPDSFIELD_ECN_MASK 0x03
57 #define IPDSFIELD_ECN(dsfield) ((dsfield) & IPDSFIELD_ECN_MASK)
58 
59 gboolean ip_try_dissect(gboolean heur_first, guint nxt, tvbuff_t *tvb,
60  packet_info *pinfo, proto_tree *tree, void *iph);
61 
62 /* Export the DSCP/ECN extended value-string table for other protocols */
63 WS_DLL_PUBLIC value_string_ext dscp_vals_ext;
64 WS_DLL_PUBLIC value_string_ext ecn_vals_ext;
65 WS_DLL_PUBLIC value_string_ext dscp_short_vals_ext;
66 WS_DLL_PUBLIC value_string_ext ecn_short_vals_ext;
67 
68 typedef struct _ws_ip6
69 {
70  guint8 ip6_ver; /* 6 */
71  guint8 ip6_tc; /* traffic class */
72  guint32 ip6_flw; /* flow label */
73  guint32 ip6_len; /* payload length */
74  guint8 ip6_nxt; /* next header */
75  guint8 ip6_hop; /* hop limit */
76  address ip6_src; /* source address */
77  address ip6_dst; /* destination address */
78  guint32 ip6_stream; /* track conversations */
79 } ws_ip6;
80 
81 #define WS_IP6_PTR(p) ((ws_ip6 *)(((p) && *(guint8 *)(p) == 6) ? (p) : NULL))
82 
83 struct ws_rthdr {
84  struct ws_ip6_rthdr hdr;
85  proto_item *ti_len;
86  proto_item *ti_type;
87  proto_item *ti_segleft;
88 };
89 
90 typedef ws_ip6 ipv6_tap_info_t;
91 
92 /* Packet info for shared state between IPv6 header and extensions.
93  *
94  * frag_plen: This is the IPv6 header payload length of a fragment packet
95  * minus per-fragment *extension* headers (anything up to and including the
96  * Fragment extension header).
97  *
98  * See RFC 8200 Section 4.5:
99  * The Per-Fragment headers must consist of the IPv6 header plus any
100  * extension headers that must be processed by nodes en route to the
101  * destination, that is, all headers up to and including the Routing
102  * header if present, else the Hop-by-Hop Options header if present,
103  * else no extension headers.
104  */
105 typedef struct {
106  guint32 jumbo_plen;
107  guint16 ip6_plen; /* header payload length (can be zero) */
108  gint frag_plen;
109  proto_tree *ipv6_tree;
110  gint ipv6_item_len;
111 } ipv6_pinfo_t;
112 
113 ipv6_pinfo_t *p_get_ipv6_pinfo(packet_info *pinfo);
114 
115 proto_tree *p_ipv6_pinfo_select_root(packet_info *pinfo, proto_tree *tree);
116 
117 ipv6_pinfo_t *p_ipv6_pinfo_add_len(packet_info *pinfo, int exthdr_len);
118 
119 void ipv6_dissect_next(guint nxt, tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, ws_ip6 *iph);
120 
121 static inline int
122 ws_ip_protocol(void *iph)
123 {
124  ws_ip4 *ip4;
125  ws_ip6 *ip6;
126 
127  if (iph != NULL) {
128  if ((ip4 = WS_IP4_PTR(iph)) != NULL)
129  return ip4->ip_proto;
130  if ((ip6 = WS_IP6_PTR(iph)) != NULL)
131  return ip6->ip6_nxt;
132  }
133  return -1;
134 }
135 
136 struct ip_analysis {
137 
138  /* Initial frame starting this conversation
139  */
140  guint32 initial_frame;
141 
142  guint32 stream;
143 };
144 
145 WS_DLL_PUBLIC struct ip_analysis *get_ip_conversation_data(conversation_t *conv,
146  packet_info *pinfo);
147 
148 #endif /* __PACKET_IP_H__ */
149 
150 /*
151  * Editor modelines - https://www.wireshark.org/tools/modelines.html
152  *
153  * Local variables:
154  * c-basic-offset: 4
155  * tab-width: 8
156  * indent-tabs-mode: nil
157  * End:
158  *
159  * vi: set shiftwidth=4 tabstop=8 expandtab:
160  * :indentSize=4:tabSize=8:noTabs=true:
161  */
Definition: address.h:56
Definition: packet_info.h:44
Definition: proto.h:904
Definition: value_string.h:170
Definition: value_string.h:26
Definition: packet-ip.h:35
Definition: packet-ip.h:69
Definition: conversation.h:220
Definition: packet-ip.h:136
Definition: packet-ip.h:105
Definition: stream.c:41
Definition: tvbuff-int.h:35
Definition: packet-ipv6.h:44
Definition: packet-ip.h:83