- switch (routing_mode) {
- case RMODE_ROUTER:
- type = ntohs(*((uint16_t *)(&packet->data[12])));
- switch (type) {
- case 0x0800:
- if(packet->len < 34) {
- ifdebug(TRAFFIC) logger(LOG_WARNING, _("Read too short packet"));
- return;
- }
-
- n = route_ipv4(packet);
- break;
-
- case 0x86DD:
- if(packet->len < 54) {
- ifdebug(TRAFFIC) logger(LOG_WARNING, _("Read too short packet"));
- return;
- }
-
- if(packet->data[20] == IPPROTO_ICMPV6 && packet->len >= 62 && packet->data[54] == ND_NEIGHBOR_SOLICIT) {
- route_neighborsol(packet);
- return;
- }
- n = route_ipv6(packet);
- break;
-
- case 0x0806:
- if(packet->len < 42) {
- ifdebug(TRAFFIC) logger(LOG_WARNING, _("Read too short packet"));
- return;
- }
-
- route_arp(packet);
- return;
-
- default:
- ifdebug(TRAFFIC) logger(LOG_WARNING, _("Cannot route packet: unknown type %hx"), type);
- return;
- }
- if(n)
- send_packet(n, packet);
- break;
-
- case RMODE_SWITCH:
- n = route_mac(packet);
- if(n)
- send_packet(n, packet);
- else
- broadcast_packet(myself, packet);
- break;
-
- case RMODE_HUB:
- broadcast_packet(myself, packet);
- break;
- }