2 * netsniff-ng - the packet sniffing beast
3 * Copyright 2009, 2010 Daniel Borkmann.
4 * Subject to the GPL, version 2.
13 #include "dissector.h"
14 #include "dissector_eth.h"
17 struct hash_table eth_lay2
;
18 struct hash_table eth_lay3
;
20 static struct hash_table eth_ether_types
;
21 static struct hash_table eth_ports_udp
;
22 static struct hash_table eth_ports_tcp
;
30 #define __do_lookup_inline(id, struct_name, hash_ptr, struct_member) \
32 struct struct_name *entry = lookup_hash(id, hash_ptr); \
34 while (entry && id != entry->id) \
35 entry = entry->next; \
37 (entry && id == entry->id ? entry->struct_member : 0); \
40 char *lookup_port_udp(unsigned int id
)
42 return __do_lookup_inline(id
, port
, ð_ports_udp
, port
);
45 char *lookup_port_tcp(unsigned int id
)
47 return __do_lookup_inline(id
, port
, ð_ports_tcp
, port
);
50 char *lookup_ether_type(unsigned int id
)
52 return __do_lookup_inline(id
, port
, ð_ether_types
, port
);
56 static inline void dissector_init_entry(int type
)
58 dissector_set_print_type(ðernet_ops
, type
);
61 static inline void dissector_init_exit(int type
)
63 dissector_set_print_type(&none_ops
, type
);
66 static void dissector_init_layer_2(int type
)
69 INSERT_HASH_PROTOS(arp_ops
, eth_lay2
);
70 INSERT_HASH_PROTOS(lldp_ops
, eth_lay2
);
71 INSERT_HASH_PROTOS(vlan_ops
, eth_lay2
);
72 INSERT_HASH_PROTOS(ipv4_ops
, eth_lay2
);
73 INSERT_HASH_PROTOS(ipv6_ops
, eth_lay2
);
74 INSERT_HASH_PROTOS(QinQ_ops
, eth_lay2
);
75 INSERT_HASH_PROTOS(mpls_uc_ops
, eth_lay2
);
76 for_each_hash_int(ð_lay2
, dissector_set_print_type
, type
);
79 static void dissector_init_layer_3(int type
)
82 INSERT_HASH_PROTOS(icmpv4_ops
, eth_lay3
);
83 INSERT_HASH_PROTOS(icmpv6_ops
, eth_lay3
);
84 INSERT_HASH_PROTOS(igmp_ops
, eth_lay3
);
85 INSERT_HASH_PROTOS(ip_auth_ops
, eth_lay3
);
86 INSERT_HASH_PROTOS(ip_esp_ops
, eth_lay3
);
87 INSERT_HASH_PROTOS(ipv6_dest_opts_ops
, eth_lay3
);
88 INSERT_HASH_PROTOS(ipv6_fragm_ops
, eth_lay3
);
89 INSERT_HASH_PROTOS(ipv6_hop_by_hop_ops
, eth_lay3
);
90 INSERT_HASH_PROTOS(ipv6_in_ipv4_ops
, eth_lay3
);
91 INSERT_HASH_PROTOS(ipv6_mobility_ops
, eth_lay3
);
92 INSERT_HASH_PROTOS(ipv6_no_next_header_ops
, eth_lay3
);
93 INSERT_HASH_PROTOS(ipv6_routing_ops
, eth_lay3
);
94 INSERT_HASH_PROTOS(tcp_ops
, eth_lay3
);
95 INSERT_HASH_PROTOS(udp_ops
, eth_lay3
);
96 for_each_hash_int(ð_lay3
, dissector_set_print_type
, type
);
99 static inline void dissector_init_entry(int type
) {}
100 static inline void dissector_init_exit(int type
) {}
101 static void dissector_init_layer_2(int type
) {}
102 static void dissector_init_layer_3(int type
) {}
103 #endif /* __WITH_PROTOS */
111 static void dissector_init_ports(enum ports which
)
114 char buff
[128], *ptr
, *file
;
115 struct hash_table
*table
;
121 file
= "/etc/netsniff-ng/udp.conf";
122 table
= ð_ports_udp
;
125 file
= "/etc/netsniff-ng/tcp.conf";
126 table
= ð_ports_tcp
;
129 file
= "/etc/netsniff-ng/ether.conf";
130 table
= ð_ether_types
;
136 fp
= fopen(file
, "r");
138 panic("No %s found!\n", file
);
140 memset(buff
, 0, sizeof(buff
));
142 while (fgets(buff
, sizeof(buff
), fp
) != NULL
) {
143 buff
[sizeof(buff
) - 1] = 0;
146 p
= xmalloc(sizeof(*p
));
147 p
->id
= strtol(ptr
, &ptr
, 0);
149 if ((ptr
= strstr(buff
, ", ")))
151 ptr
= strtrim_right(ptr
, '\n');
152 ptr
= strtrim_right(ptr
, ' ');
154 p
->port
= xstrdup(ptr
);
157 pos
= insert_hash(p
->id
, p
, table
);
163 memset(buff
, 0, sizeof(buff
));
169 static int dissector_cleanup_ports(void *ptr
)
171 struct port
*tmp
, *p
= ptr
;
176 while ((tmp
= p
->next
)) {
188 void dissector_init_ethernet(int fnttype
)
190 dissector_init_entry(fnttype
);
191 dissector_init_layer_2(fnttype
);
192 dissector_init_layer_3(fnttype
);
193 dissector_init_exit(fnttype
);
196 dissector_init_oui();
198 dissector_init_ports(PORTS_UDP
);
199 dissector_init_ports(PORTS_TCP
);
200 dissector_init_ports(PORTS_ETHER
);
203 void dissector_cleanup_ethernet(void)
205 free_hash(ð_lay2
);
206 free_hash(ð_lay3
);
208 for_each_hash(ð_ether_types
, dissector_cleanup_ports
);
209 for_each_hash(ð_ports_udp
, dissector_cleanup_ports
);
210 for_each_hash(ð_ports_tcp
, dissector_cleanup_ports
);
212 free_hash(ð_ether_types
);
213 free_hash(ð_ports_udp
);
214 free_hash(ð_ports_tcp
);
217 dissector_cleanup_oui();