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 : 0); \
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
);
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
) {}
101 static inline void dissector_init_exit(int type
) {}
102 static void dissector_init_layer_2(int type
) {}
103 static void dissector_init_layer_3(int type
) {}
104 #endif /* __WITH_PROTOS */
112 static void dissector_init_ports(enum ports which
)
115 char buff
[128], *ptr
, *file
;
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
, &ptr
, 0);
150 if ((ptr
= strstr(buff
, ", ")))
152 ptr
= strtrim_right(ptr
, '\n');
153 ptr
= strtrim_right(ptr
, ' ');
155 p
->port
= xstrdup(ptr
);
158 pos
= insert_hash(p
->id
, p
, table
);
164 memset(buff
, 0, sizeof(buff
));
170 static int dissector_cleanup_ports(void *ptr
)
172 struct port
*tmp
, *p
= ptr
;
177 while ((tmp
= p
->next
)) {
189 void dissector_init_ethernet(int fnttype
)
191 dissector_init_entry(fnttype
);
192 dissector_init_layer_2(fnttype
);
193 dissector_init_layer_3(fnttype
);
194 dissector_init_exit(fnttype
);
197 dissector_init_oui();
199 dissector_init_ports(PORTS_UDP
);
200 dissector_init_ports(PORTS_TCP
);
201 dissector_init_ports(PORTS_ETHER
);
204 void dissector_cleanup_ethernet(void)
206 free_hash(ð_lay2
);
207 free_hash(ð_lay3
);
209 for_each_hash(ð_ether_types
, dissector_cleanup_ports
);
210 for_each_hash(ð_ports_udp
, dissector_cleanup_ports
);
211 for_each_hash(ð_ports_tcp
, dissector_cleanup_ports
);
213 free_hash(ð_ether_types
);
214 free_hash(ð_ports_udp
);
215 free_hash(ð_ports_tcp
);
218 dissector_cleanup_oui();