Initial revision
[obnox/wireshark/wip.git] / packet-ipv6.c
1 /* packet-ipv6.c
2  * Routines for IPv6 packet disassembly 
3  *
4  * Ethereal - Network traffic analyzer
5  * By Gerald Combs <gerald@zing.org>
6  * Copyright 1998 Gerald Combs
7  *
8  * 
9  * This program is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU General Public License
11  * as published by the Free Software Foundation; either version 2
12  * of the License, or (at your option) any later version.
13  * 
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  * 
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22  */
23
24 #ifdef HAVE_CONFIG_H
25 # include "config.h"
26 #endif
27
28 #include <gtk/gtk.h>
29 #include <pcap.h>
30
31 #include <stdio.h>
32
33 #ifdef HAVE_SYS_TYPES_H
34 # include <sys/types.h>
35 #endif
36
37 #ifdef HAVE_NETINET_IN_H
38 # include <netinet/in.h>
39 #endif
40
41 #include "ethereal.h"
42 #include "packet.h"
43 #include "packet-ipv6.h"
44 #include "etypes.h"
45
46 void
47 dissect_ipv6(const u_char *pd, int offset, frame_data *fd, GtkTree *tree) {
48   GtkWidget *ipv6_tree, *ti;
49
50   e_ipv6_header ipv6;
51
52   memcpy(&ipv6, (void *) &pd[offset], 8); 
53
54   if (fd->win_info[0]) {
55       switch(ipv6.next_header){
56           /*
57           case IP_PROTO_ICMP:
58           case IP_PROTO_IGMP:
59           case IP_PROTO_TCP:
60           case IP_PROTO_UDP:
61           case IP_PROTO_OSPF:
62           */
63           /* Names are set in the associated dissect_* routines */
64           /*    break; */
65          default:
66              strcpy(fd->win_info[3], "IPv6");
67              sprintf(fd->win_info[4], "IPv6 support is still under development (%d)", ipv6.next_header);
68       }
69   }
70   if (tree) {
71     /* !!! specify length */
72     ti = add_item_to_tree(GTK_WIDGET(tree), offset, 40,
73       "Internet Protocol Version 6");
74     ipv6_tree = gtk_tree_new();
75     add_subtree(ti, ipv6_tree, ETT_IPv6);
76
77     /* !!! warning: version also contains 4 Bit priority */
78     add_item_to_tree(ipv6_tree, offset,      1, "Version: %d Priority: %d", ipv6.version >> 4 , ipv6.version & 15);
79     add_item_to_tree(ipv6_tree, offset + 6,  1, "Next Header: %d", ipv6.next_header);
80     add_item_to_tree(ipv6_tree, offset + 4,  2, "Payload Length: %d", ntohs(ipv6.payload_length));
81   }
82
83   /* start of the new header (could be a extension header) */
84   offset += 40;
85   switch (ipv6.next_header) {
86       case IP_PROTO_ICMP:
87           dissect_icmp(pd, offset, fd, tree);
88           break;
89       case IP_PROTO_IGMP:
90           dissect_igmp(pd, offset, fd, tree);
91           break;
92       case IP_PROTO_TCP:
93           dissect_tcp(pd, offset, fd, tree);
94           break;
95       case IP_PROTO_UDP:
96           dissect_udp(pd, offset, fd, tree);
97           break;
98       case IP_PROTO_OSPF:
99           dissect_ospf(pd, offset, fd, tree);
100           break;
101       default:
102           dissect_data(pd, offset, fd, tree);
103   }
104 }
105