2 * netsniff-ng - the packet sniffing beast
3 * Copyright 2009, 2010 Daniel Borkmann.
4 * Subject to the GPL, version 2.
14 #include "dissector.h"
15 #include "dissector_eth.h"
18 struct hash_table eth_lay2
;
19 struct hash_table eth_lay3
;
21 static struct hash_table eth_ether_types
;
22 static struct hash_table eth_ports_udp
;
23 static struct hash_table eth_ports_tcp
;
31 #define __do_lookup_inline(id, struct_name, hash_ptr, struct_member) \
33 struct struct_name *entry = lookup_hash(id, hash_ptr); \
35 while (entry && id != entry->id) \
36 entry = entry->next; \
38 (entry && id == entry->id ? entry->struct_member : NULL); \
41 char *lookup_port_udp(unsigned int id
)
43 return __do_lookup_inline(id
, port
, ð_ports_udp
, port
);
46 char *lookup_port_tcp(unsigned int id
)
48 return __do_lookup_inline(id
, port
, ð_ports_tcp
, port
);
51 char *lookup_ether_type(unsigned int id
)
53 return __do_lookup_inline(id
, port
, ð_ether_types
, port
);
56 #ifdef HAVE_DISSECTOR_PROTOS
57 static inline void dissector_init_entry(int type
)
59 dissector_set_print_type(ðernet_ops
, type
);
62 static inline void dissector_init_exit(int type
)
64 dissector_set_print_type(&none_ops
, type
);
67 static void dissector_init_layer_2(int type
)
70 INSERT_HASH_PROTOS(arp_ops
, eth_lay2
);
71 INSERT_HASH_PROTOS(lldp_ops
, eth_lay2
);
72 INSERT_HASH_PROTOS(vlan_ops
, eth_lay2
);
73 INSERT_HASH_PROTOS(ipv4_ops
, eth_lay2
);
74 INSERT_HASH_PROTOS(ipv6_ops
, eth_lay2
);
75 INSERT_HASH_PROTOS(QinQ_ops
, eth_lay2
);
76 INSERT_HASH_PROTOS(mpls_uc_ops
, eth_lay2
);
77 for_each_hash_int(ð_lay2
, dissector_set_print_type
, type
);
80 static void dissector_init_layer_3(int type
)
83 INSERT_HASH_PROTOS(icmpv4_ops
, eth_lay3
);
84 INSERT_HASH_PROTOS(icmpv6_ops
, eth_lay3
);
85 INSERT_HASH_PROTOS(igmp_ops
, eth_lay3
);
86 INSERT_HASH_PROTOS(ip_auth_ops
, eth_lay3
);
87 INSERT_HASH_PROTOS(ip_esp_ops
, eth_lay3
);
88 INSERT_HASH_PROTOS(ipv6_dest_opts_ops
, eth_lay3
);
89 INSERT_HASH_PROTOS(ipv6_fragm_ops
, eth_lay3
);
90 INSERT_HASH_PROTOS(ipv6_hop_by_hop_ops
, eth_lay3
);
91 INSERT_HASH_PROTOS(ipv6_in_ipv4_ops
, eth_lay3
);
92 INSERT_HASH_PROTOS(ipv6_mobility_ops
, eth_lay3
);
93 INSERT_HASH_PROTOS(ipv6_no_next_header_ops
, eth_lay3
);
94 INSERT_HASH_PROTOS(ipv6_routing_ops
, eth_lay3
);
95 INSERT_HASH_PROTOS(tcp_ops
, eth_lay3
);
96 INSERT_HASH_PROTOS(udp_ops
, eth_lay3
);
97 for_each_hash_int(ð_lay3
, dissector_set_print_type
, type
);
100 static inline void dissector_init_entry(int type __maybe_unused
) {}
101 static inline void dissector_init_exit(int type __maybe_unused
) {}
102 static void dissector_init_layer_2(int type __maybe_unused
) {}
103 static void dissector_init_layer_3(int type __maybe_unused
) {}
112 static void dissector_init_ports(enum ports which
)
115 char buff
[128], *ptr
, *file
, *end
;
116 struct hash_table
*table
;
122 file
= PREFIX_STRING
"/etc/netsniff-ng/udp.conf";
123 table
= ð_ports_udp
;
126 file
= PREFIX_STRING
"/etc/netsniff-ng/tcp.conf";
127 table
= ð_ports_tcp
;
130 file
= PREFIX_STRING
"/etc/netsniff-ng/ether.conf";
131 table
= ð_ether_types
;
137 fp
= fopen(file
, "r");
139 panic("No %s found!\n", file
);
141 memset(buff
, 0, sizeof(buff
));
143 while (fgets(buff
, sizeof(buff
), fp
) != NULL
) {
144 buff
[sizeof(buff
) - 1] = 0;
147 p
= xmalloc(sizeof(*p
));
148 p
->id
= strtol(ptr
, &end
, 0);
149 /* not a valid line, skip */
150 if (p
->id
== 0 && end
== ptr
) {
155 ptr
= strstr(buff
, ", ");
163 ptr
= strtrim_right(ptr
, '\n');
164 ptr
= strtrim_right(ptr
, ' ');
166 p
->port
= xstrdup(ptr
);
169 pos
= insert_hash(p
->id
, p
, table
);
175 memset(buff
, 0, sizeof(buff
));
181 static int dissector_cleanup_ports(void *ptr
)
183 struct port
*tmp
, *p
= ptr
;
188 while ((tmp
= p
->next
)) {
200 void dissector_init_ethernet(int fnttype
)
202 dissector_init_entry(fnttype
);
203 dissector_init_layer_2(fnttype
);
204 dissector_init_layer_3(fnttype
);
205 dissector_init_exit(fnttype
);
208 dissector_init_oui();
210 dissector_init_ports(PORTS_UDP
);
211 dissector_init_ports(PORTS_TCP
);
212 dissector_init_ports(PORTS_ETHER
);
215 void dissector_cleanup_ethernet(void)
217 free_hash(ð_lay2
);
218 free_hash(ð_lay3
);
220 for_each_hash(ð_ether_types
, dissector_cleanup_ports
);
221 for_each_hash(ð_ports_udp
, dissector_cleanup_ports
);
222 for_each_hash(ð_ports_tcp
, dissector_cleanup_ports
);
224 free_hash(ð_ether_types
);
225 free_hash(ð_ports_udp
);
226 free_hash(ð_ports_tcp
);
229 dissector_cleanup_oui();