2 * Definitions for IP packet disassembly structures and routines
4 * Wireshark - Network traffic analyzer
5 * By Gerald Combs <gerald@wireshark.org>
6 * Copyright 1998 Gerald Combs
8 * SPDX-License-Identifier: GPL-2.0-or-later
12 #ifndef __PACKET_IP_H__
13 #define __PACKET_IP_H__
15 #include "ws_symbol_export.h"
16 #include "packet-ipv6.h"
17 #include <epan/conversation.h>
20 * IP Version numbers, from
22 * https://www.iana.org/assignments/version-numbers/version-numbers.xhtml
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 */
32 extern const value_string ip_version_vals
[];
34 typedef struct _ws_ip4
36 uint8_t ip_ver
; /* 4 */
37 uint8_t ip_tos
; /* type of service */
38 uint32_t ip_len
; /* total length */
39 uint16_t ip_id
; /* identification */
40 uint16_t ip_off
; /* fragment offset */
41 uint8_t ip_ttl
; /* time-to-live */
42 uint8_t ip_proto
; /* protocol */
43 uint16_t ip_sum
; /* checksum */
44 address ip_src
; /* source address */
45 address ip_dst
; /* destination address */
46 uint32_t ip_stream
; /* track conversations */
49 #define WS_IP4_PTR(p) ((ws_ip4 *)(((p) && *(uint8_t *)(p) == 4) ? (p) : NULL))
51 /* Differentiated Services Codepoint */
52 #define IPDSFIELD_DSCP_MASK 0xFC
53 #define IPDSFIELD_DSCP(dsfield) (((dsfield) & IPDSFIELD_DSCP_MASK) >> 2)
55 /* Explicit Congestion Notification */
56 #define IPDSFIELD_ECN_MASK 0x03
57 #define IPDSFIELD_ECN(dsfield) ((dsfield) & IPDSFIELD_ECN_MASK)
59 bool ip_try_dissect(bool heur_first
, unsigned nxt
, tvbuff_t
*tvb
,
60 packet_info
*pinfo
, proto_tree
*tree
, void *iph
);
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
;
68 typedef struct _ws_ip6
70 uint8_t ip6_ver
; /* 6 */
71 uint8_t ip6_tc
; /* traffic class */
72 uint32_t ip6_flw
; /* flow label */
73 uint32_t ip6_len
; /* payload length */
74 uint8_t ip6_nxt
; /* next header */
75 uint8_t ip6_hop
; /* hop limit */
76 address ip6_src
; /* source address */
77 address ip6_dst
; /* destination address */
78 uint32_t ip6_stream
; /* track conversations */
81 #define WS_IP6_PTR(p) ((ws_ip6 *)(((p) && *(uint8_t *)(p) == 6) ? (p) : NULL))
84 struct ws_ip6_rthdr hdr
;
87 proto_item
*ti_segleft
;
90 typedef ws_ip6 ipv6_tap_info_t
;
92 /* Packet info for shared state between IPv6 header and extensions.
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).
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.
107 uint16_t ip6_plen
; /* header payload length (can be zero) */
109 proto_tree
*ipv6_tree
;
113 ipv6_pinfo_t
*p_get_ipv6_pinfo(packet_info
*pinfo
);
115 proto_tree
*p_ipv6_pinfo_select_root(packet_info
*pinfo
, proto_tree
*tree
);
117 ipv6_pinfo_t
*p_ipv6_pinfo_add_len(packet_info
*pinfo
, int exthdr_len
);
119 void ipv6_dissect_next(unsigned nxt
, tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*tree
, ws_ip6
*iph
);
122 ws_ip_protocol(void *iph
)
128 if ((ip4
= WS_IP4_PTR(iph
)) != NULL
)
129 return ip4
->ip_proto
;
130 if ((ip6
= WS_IP6_PTR(iph
)) != NULL
)
138 /* Initial frame starting this conversation
140 uint32_t initial_frame
;
145 WS_DLL_PUBLIC
struct ip_analysis
*get_ip_conversation_data(conversation_t
*conv
,
148 #endif /* __PACKET_IP_H__ */
151 * Editor modelines - https://www.wireshark.org/tools/modelines.html
156 * indent-tabs-mode: nil
159 * vi: set shiftwidth=4 tabstop=8 expandtab:
160 * :indentSize=4:tabSize=8:noTabs=true: