/* * netsniff-ng - the packet sniffing beast * Subject to the GPL, version 2. */ #include "oui.h" #include "protos.h" #include "pcap_io.h" #include "pkt_buff.h" #include "dissector.h" #include "dissector_sll.h" #include "dissector_eth.h" static char *pkt_type2str(uint8_t pkttype) { switch (pkttype) { case PACKET_HOST: return "host"; case PACKET_BROADCAST: return "broadcast"; case PACKET_MULTICAST: return "multicast"; case PACKET_OTHERHOST: return "other host"; case PACKET_OUTGOING: return "outgoing"; case PACKET_USER: return "user"; case PACKET_KERNEL: return "kernel"; } return "Unknown"; } static void sll_print_full(struct pkt_buff *pkt) { struct sockaddr_ll *sll = pkt->sll; char addr_str[40] = {}; tprintf(" [ Linux \"cooked\""); tprintf(" Pkt Type %d (%s)", sll->sll_pkttype, pkt_type2str(sll->sll_pkttype)); tprintf(", If Type %d (%s)", sll->sll_hatype, device_type2str(sll->sll_hatype)); tprintf(", Addr Len %d", sll->sll_halen); tprintf(", Src (%s)", device_addr2str(sll->sll_addr, sll->sll_halen, sll->sll_hatype, addr_str, sizeof(addr_str))); tprintf(", Proto 0x%x", ntohs(sll->sll_protocol)); tprintf(" ]\n"); switch (pcap_devtype_to_linktype(sll->sll_hatype)) { case LINKTYPE_EN10MB: case ___constant_swab32(LINKTYPE_EN10MB): pkt_set_dissector(pkt, ð_lay2, ntohs(sll->sll_protocol)); break; case LINKTYPE_NETLINK: case ___constant_swab32(LINKTYPE_NETLINK): pkt->dissector = &nlmsg_ops; break; default: tprintf(" [ Unknown protocol ]\n"); } } static void sll_print_less(struct pkt_buff *pkt) { struct sockaddr_ll *sll = pkt->sll; char addr_str[40] = {}; tprintf(" Pkt Type %d (%s)", sll->sll_pkttype, pkt_type2str(sll->sll_pkttype)); tprintf(", If Type %d (%s)", sll->sll_hatype, device_type2str(sll->sll_hatype)); tprintf(", Addr Len %d", sll->sll_halen); tprintf(", Src (%s)", device_addr2str(sll->sll_addr, sll->sll_halen, sll->sll_hatype, addr_str, sizeof(addr_str))); tprintf(", Proto 0x%x", ntohs(sll->sll_protocol)); } struct protocol sll_ops = { .key = 0, .print_full = sll_print_full, .print_less = sll_print_less, }; struct protocol *dissector_get_sll_entry_point(void) { return &sll_ops; } struct protocol *dissector_get_sll_exit_point(void) { return &none_ops; } void dissector_init_sll(int fnttype) { dissector_set_print_type(&sll_ops, fnttype); dissector_set_print_type(&none_ops, fnttype); dissector_init_oui(); } void dissector_cleanup_sll(void) { dissector_cleanup_oui(); } r>
diff options
context:
space:
mode:
authorAlex Williamson <alex.williamson@redhat.com>2016-03-31 16:34:37 -0600
committerBjorn Helgaas <bhelgaas@google.com>2016-04-19 18:54:16 -0500
commit1bf2bf229b64540f91ac6fa3af37c81249037a0b (patch)
tree1d3c35182ae61618d570691c5ce53fb6675695d4
parentc1d61c9bb163e696bf06850bcabbd26386554489 (diff)
PCI: Work around Intel Sunrise Point PCH incorrect ACS capability
Intel Sunrise Point root ports implement ACS but use dwords for the capability and control registers, putting the control register at the wrong offset. Use quirks to enable and test ACS for these devices, which match the standard functions modulo the broken control register offset. Note that lspci assumes devices implement ACS per spec, so it shows invalid ACS data for these devices. Signed-off-by: Alex Williamson <alex.williamson@redhat.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Diffstat