aboutsummaryrefslogtreecommitdiffstats
path: root/packet-ans.c
blob: e0b992808b4ba386ea15585e6e0efe27676a3e30 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/* packet-ans.c
 * Routines for Intel ANS probe dissection
 *
 * $Id: packet-ans.c,v 1.1 2003/03/23 19:32:19 gerald Exp $
 *
 * Ethereal - Network traffic analyzer
 * By Gerald Combs <gerald@ethereal.com>
 * Copyright 2003 Gerald Combs
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 *
 * The following information was graciously provided by Intel:
 * Offset    Size (bytes)    Contents	
 * 0         6               Destination Broadcast probes: {FF,FF,FF,FF,FF,FF} 
 *                           Multicast probes: {01,AA,00,00,00,00}	
 * 6         6               Source Matches the CurrentMACAddress of the 
 *                           adapter sending the probe.	
 * 8         2               Type Network order is 0x886D, Intel's reserved 
 *                           packet type.
 * 10 (0)    2               ApplicationID Network order is 0x0001, identifies 
 *                           it as fault tolerance probe.	
 * 12 (2)    2               RevID Network order, identifies the revision id 
 *                           of Teaming software.	
 * 16 (4)    4               ProbeSequenceNumber Ascending sequence number 
 *                           that identifies the current probing cycle.	
 * 20 (8)    2               SenderID Unique ID within a team identifying 
 *                           the member that originally sent the probe.	
 * 22 (10)   6               TeamID Unique ID identifying the team in charge 
 *                           of this probe.	
 * 28        Padding         Reserved	
 *
 */

#ifdef HAVE_CONFIG_H
# include "config.h"
#endif

#include <glib.h>

#include <epan/packet.h>
#include <epan/proto.h>
#include <etypes.h>

/* Initialize the protocol and registered fields */
static int proto_ans        = -1;

static int hf_ans_app_id    = -1;
static int hf_ans_rev_id    = -1;
static int hf_ans_seq_num   = -1;
static int hf_ans_sender_id = -1;
static int hf_ans_team_id   = -1;

/* Initialize the subtree pointers */
static gint ett_ans = -1;

/* Code to actually dissect the packets */
static void
dissect_ans(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
	proto_item  *ti;
	proto_tree  *ans_tree = NULL;
	guint16      sender_id;
	guint32      seq_num;
	gchar        team_id[6];

	if (check_col(pinfo->cinfo, COL_PROTOCOL))
		col_set_str(pinfo->cinfo, COL_PROTOCOL, "Intel ANS probe");

	if (check_col(pinfo->cinfo, COL_INFO)) {
		col_clear(pinfo->cinfo, COL_INFO);
		
		seq_num = tvb_get_ntohl(tvb, 4);
		sender_id = tvb_get_ntohs(tvb, 8);
		tvb_memcpy(tvb, team_id, 10, 6);

		col_append_fstr(pinfo->cinfo, COL_INFO, "Sequence: %u, Sender ID %u, Team ID %s",
			seq_num, sender_id, ether_to_str(team_id));
	}

	if (tree) {
		ti = proto_tree_add_item(tree, proto_ans, tvb, 0, -1, FALSE);
		ans_tree = proto_item_add_subtree(ti, ett_ans);

		proto_tree_add_item(ans_tree, hf_ans_app_id, tvb, 0, 2, FALSE);
		proto_tree_add_item(ans_tree, hf_ans_rev_id, tvb, 2, 2, FALSE);
		proto_tree_add_item(ans_tree, hf_ans_seq_num, tvb, 4, 4, FALSE);
		proto_tree_add_item(ans_tree, hf_ans_sender_id, tvb, 8, 2, FALSE);
		proto_tree_add_item(ans_tree, hf_ans_team_id, tvb, 10, 6, FALSE);
	}
}


void
proto_register_ans(void)
{
	static hf_register_info hf[] = {
		{ &hf_ans_app_id,
			{ "Application ID", "ans.app_id",
				FT_UINT16, BASE_HEX, NULL, 0,
				"Intel ANS Application ID", HFILL }
		},
		{ &hf_ans_rev_id,
			{ "Revision ID", "ans.rev_id",
				FT_UINT16, BASE_HEX, NULL, 0,
				"Intel ANS Revision ID", HFILL }
		},
		{ &hf_ans_seq_num,
			{ "Sequence Number", "ans.seq_num",
				FT_UINT32, BASE_DEC, NULL, 0,
				"Intel ANS Sequence Number", HFILL }
		},
		{ &hf_ans_sender_id,
			{ "Sender ID", "ans.sender_id",
				FT_UINT16, BASE_DEC, NULL, 0,
				"Intel ANS Sender ID", HFILL }
		},
		{ &hf_ans_team_id,
			{ "Team ID", "ans.team_id",
				FT_ETHER, BASE_HEX, NULL, 0,
				"Intel ANS Team ID", HFILL }
		},
	};

	static gint *ett[] = {
		&ett_ans,
	};

	proto_ans = proto_register_protocol("Intel ANS probe", "ANS", "ans");
	proto_register_field_array(proto_ans, hf, array_length(hf));
	proto_register_subtree_array(ett, array_length(ett));
}


void
proto_reg_handoff_ans(void)
{
	dissector_handle_t ans_handle;

	ans_handle = create_dissector_handle(dissect_ans, proto_ans);
	dissector_add("ethertype", ETHERTYPE_INTEL_ANS, ans_handle);
}