void squirrel_ethernet_frame(struct Squirrel *squirrel, struct NetFrame *frame, const unsigned char *px, unsigned length) { unsigned offset; unsigned ethertype; unsigned oui; if (length <= 14) { ; /*FRAMERR(frame, "wifi.data: too short\n");*/ return; } frame->src_mac = px+6; frame->dst_mac = px+0; offset = 12; /* Look for SAP header */ if (offset + 6 >= length) { FRAMERR(frame, "wifi.sap: too short\n"); return; } ethertype = ex16be(px+offset); offset += 2; switch (ethertype) { case 0x0800: squirrel_ip(squirrel, frame, px+offset, length-offset); break; case 0x0806: squirrel_arp(squirrel, frame, px+offset, length-offset); break; case 0x888e: /*802.11x authentication*/ //squirrel_802_1x_auth(squirrel, frame, px+offset, length-offset); break; case 0x86dd: /* IPv6*/ //squirrel_ipv6(squirrel, frame, px+offset, length-offset); break; case 0x809b: //squirrel_ipv6(squirrel, frame, px+offset, length-offset); break; case 0x872d: /* Cisco OWL */ break; case 0x9000: /* Loopback */ break; default: if (ethertype < 1518) { if (memcmp(px+offset, "\xaa\xaa\x03", 3) != 0) { return; } offset +=3 ; oui = ex24be(px+offset); if (squirrel->filter.snap_oui_count) { if (filter_has_port(squirrel->filter.snap_ouis, squirrel->filter.snap_oui_count, oui)) frame->flags.found.filtered = 1; } /* Look for OUI code */ switch (oui){ case 0x000000: /* fall through below */ break; case 0x004096: /* Cisco Wireless */ return; break; case 0x00000c: offset +=3; if (offset < length) { ;//squirrel_cisco00000c(squirrel, frame, px+offset, length-offset); } return; case 0x080007: break; /*apple*/ default: FRAMERR(frame, "Unknown SAP OUI: 0x%06x\n", oui); return; } offset +=3; /* EtherType */ if (offset+2 >= length) { FRAMERR(frame, "ethertype: packet too short\n"); return; } } if (ethertype == length-offset && ex16be(px+offset) == 0xAAAA) { ; } else FRAMERR_BADVAL(frame, "ethertype", ethertype); } }
void parse_atalk_nbp(struct Ferret *ferret, struct NetFrame *frame, const unsigned char *px, unsigned length) { struct { unsigned op; unsigned count; unsigned xid; } nbp; unsigned offset=0; if (length < 2) { FRAMERR(frame, "%s: truncated\n", "NBP"); return; } /* * Parse the header first */ nbp.op = (px[0]>>4)&0x0F; nbp.count = (px[0]>>0)&0x0F; nbp.xid = px[1]; offset = 2; /* * Parse all the name-bindings */ while (nbp.count) { unsigned atalk_addr; unsigned atalk_port; unsigned enumerator; unsigned object_len; const unsigned char *object; unsigned type_len; const unsigned char *type; unsigned zone_len; const unsigned char *zone; nbp.count--; if (offset + 6 > length) { FRAMERR(frame, "%s: truncated\n", "NBP"); return; } atalk_addr = ex24be(px+offset); offset += 3; atalk_port = px[offset++]; enumerator = px[offset++]; /* Extract the items */ extract_item(ferret, frame, px, length, &offset, &object, &object_len); extract_item(ferret, frame, px, length, &offset, &type, &type_len); extract_item(ferret, frame, px, length, &offset, &zone, &zone_len); if (offset > length) break; switch (nbp.op) { case 2: JOTDOWN(ferret, JOT_SRC("ID-ATALK", frame), JOT_PRINT("Lookup", type, type_len), JOT_PRINT("Object", object, object_len), JOT_PRINT("Zone", zone, zone_len), 0); break; default: FRAMERR(frame, "%s: not implemented\n", "NBP"); } } }