diff options
author | Caleb Chiu <work.chiu@gmail.com> | 2021-02-17 07:10:31 +0000 |
---|---|---|
committer | AndersBroman <a.broman58@gmail.com> | 2021-02-17 07:10:31 +0000 |
commit | 6581899a84299c2f5aaf336b85d48d4298509ac6 (patch) | |
tree | 63295b2b33b4883be963a10b29d5bec11fb3a1e1 /tools | |
parent | 3ad7f90a96f6767ba754c19151430470a6eab70d (diff) |
NCSI: Squash commits of NCSI and PCI-IDS
NCSI: Extends NCSI dissection based on DSP0222 Version: 1.2.0_2b
Add pci-ids.c and pci-ids.h for mapping PCI IDs(VID,DID,SID,SVID) to string.
Extends NCSI dissection to support DSP0222 Version: 1.2.0_2b.
Extends NCSI dissection to support Mellanox OEM commands.
NCSI: Use TFS for boolean mapped string and added AEN dissectors
1. Use the tfs defined in tfs.c
2. Refine the boolean mapped strings to be TFS style
3. Added dissectors for AEN
NSCI: Fixed erros with gcc 7.5.0
1. Fix compiling errors with gcc 7.5.0 under Ubuntu 18.04
2. Sloved complaints of git pre-commit hook
NCSI: Add "0x" prefix for displaying HEX values
There are codes display HEX values without prefix, added "0x" to fix that.
PCI-IDS: Added PCI ID file and python script to convert it to C codes
1. Added the PCI ID file pci.ids from https://pci-ids.ucw.cz/
2. Added pci-ids-convert.py to convert to epan/dissectors/pci-ids.c
PCI-IDS: Updated the PCI ID list to be Version 2021.01.11
NCSI: Remove trailing spaces and unused href entries
PCI-IDS: Use a fresh copy of pci.ids to generate pci-ids.c
1. Renamed pci-ids-convert.py to make-pci-ids.py
2. make-pci-ids.py uses a fresh copy of pic.ids to generate pci-ids.c
PCI-IDS: Move internal structure to C file
1. Move pci_id_t and pci_vid_index_t from header file to C file.
2. Refined the comments of pci-ids.c
3. Renamed local variable index (shadow variable) to idx
PCI-IDS: Refined binary search codes
PCI-IDS: Moved pci-ids.[ch] to epan/
Moved pci-ids.[ch] to epan/ as they ought to be
Diffstat (limited to 'tools')
-rw-r--r-- | tools/make-pci-ids.py | 226 |
1 files changed, 226 insertions, 0 deletions
diff --git a/tools/make-pci-ids.py b/tools/make-pci-ids.py new file mode 100644 index 0000000000..02c3d18889 --- /dev/null +++ b/tools/make-pci-ids.py @@ -0,0 +1,226 @@ +#!/usr/bin/env python3 +# +# make-pci-ids - Creates a file containing PCI IDs. +# It use the databases from +# https://github.com/pciutils/pciids/raw/master/pci.ids +# to create our file epan/dissectors/pci-ids.c +# +# Wireshark - Network traffic analyzer +# +# By Caleb Chiu <caleb.chiu@macnica.com> +# Copyright 2021 +# +# SPDX-License-Identifier: GPL-2.0-or-later +# + +import re +import string +import sys +import urllib.request, urllib.error, urllib.parse + +OUTPUT_FILE = "epan/pci-ids.c" + +code_prefix = """ * + * Generated by tools/make-pci-ids.py + * By Caleb Chiu <caleb.chiu@macnica.com> + * Copyright 2021 + * + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include <config.h> +#include \"pci-ids.h\" + +typedef struct +{ + guint16 vid; + guint16 did; + guint16 svid; + guint16 ssid; + gchar *name; + +} pci_id_t; + +typedef struct +{ + guint16 vid; + guint16 count; + pci_id_t *ids_ptr; + +} pci_vid_index_t; + +""" + +code_postfix = """ +static pci_vid_index_t *get_vid_index(guint16 vid) +{ + guint32 start_index = 0; + guint32 end_index = 0; + guint32 idx = 0; + + end_index = sizeof(pci_vid_index)/sizeof(pci_vid_index[0]); + + while(start_index != end_index) + { + if(end_index - start_index == 1) + { + if(pci_vid_index[start_index].vid == vid) + return &pci_vid_index[start_index]; + + break; + } + + idx = (start_index + end_index)/2; + + if(pci_vid_index[idx].vid < vid) + start_index = idx; + else + if(pci_vid_index[idx].vid > vid) + end_index = idx; + else + return &pci_vid_index[idx]; + + } + + return NULL; + +} + +const char *pci_id_str(guint16 vid, guint16 did, guint16 svid, guint16 ssid) +{ + unsigned int i; + static char *not_found = \"Not found\"; + pci_vid_index_t *index_ptr; + pci_id_t *ids_ptr; + + index_ptr = get_vid_index(vid); + + if(index_ptr == NULL) + return not_found; + + ids_ptr = index_ptr->ids_ptr; + for(i = 0; i < index_ptr->count; ids_ptr++, i++) + if(vid == ids_ptr->vid && + did == ids_ptr->did && + svid == ids_ptr->svid && + ssid == ids_ptr->ssid) + return ids_ptr->name; + return not_found; + +}""" + + +id_list=[] +count_list=[] + +def main(): + req_headers = { 'User-Agent': 'Wireshark make-pci-ids' } + req = urllib.request.Request('https://github.com/pciutils/pciids/raw/master/pci.ids', headers=req_headers) + response = urllib.request.urlopen(req) + lines = response.read().decode('UTF-8', 'replace').splitlines() + + foutput = open(OUTPUT_FILE, "w", encoding="utf-8") + + print("/* pci-ids.c\n *", file = foutput) + print(" * pci-ids.c is based on the pci.ids of The PCI ID Repository:", file = foutput) + vid = -1 + did = -1 + svid = -1 + ssvid = -1 + entries = 0; + line_num = 0; + + for line in lines: + line = line.strip('\n') + line_num += 1 + + if line_num <= 15: + line = line.replace('#', ' ', 1) + line = line.lstrip() + line = line.replace("GNU General Public License","GPL") + if line: + line = ' * ' + line + else: + line = ' *' + line + print(line, file = foutput) + if line_num == 15: + foutput.write(code_prefix) + + line = line.replace("\\","\\\\") + line = line.replace("\"","\\\"") + line = line.replace("?","?-") + tabs = len(line) - len(line.lstrip('\t')) + if tabs == 0: + #print line + words = line.split(" ", 1) + if len(words) < 2: + continue + if len(words[0]) != 4: + continue + if all(c in string.hexdigits for c in words[0]): + hex_int = int(words[0], 16) + if vid != -1: + print("};/* pci_vid_%04X[] */"% (vid), file = foutput) + print("\n", file = foutput) + count_list.append(entries) + vid = hex_int; + entries = 1; + did = -1 + svid = -1 + ssid = -1 + print("pci_id_t pci_vid_%04X[] = {"% (vid), file = foutput) + print("{0x%04X, 0xFFFF, 0xFFFF, 0xFFFF, \"%s(0x%04X)\"},"% (vid, words[1], vid), file = foutput) + id_list.append(vid); + continue; + + if tabs == 1: + line = line.strip('\t') + words = line.split(" ", 1) + if len(words) < 2: + continue + if len(words[0]) != 4: + continue + if all(c in string.hexdigits for c in words[0]): + hex_int = int(words[0], 16) + did = hex_int + svid = -1 + ssid = -1 + print("{0x%04X, 0x%04X, 0xFFFF, 0xFFFF, \"%s(0x%04X)\"},"% (vid, did, words[1], did), file = foutput) + entries += 1; + continue; + + if tabs == 2: + line = line.strip('\t') + words = line.split(" ", 2) + if len(words[0]) != 4: + continue + if all(c in string.hexdigits for c in words[0]): + hex_int = int(words[0], 16) + svid = hex_int + + if all(c in string.hexdigits for c in words[1]): + hex_int = int(words[1], 16) + ssid = hex_int + print("{0x%04X, 0x%04X, 0x%04X, 0x%04X, \"%s(0x%04X-0x%04X)\"},"% (vid, did, svid, ssid, words[2], svid, ssid), file = foutput) + entries += 1; + svid = -1 + ssid = -1 + continue; + + print("};/* pci_vid_%04X[] */"% (vid), file = foutput) + count_list.append(entries) + + print("\npci_vid_index_t pci_vid_index[] = {", file = foutput) + + length = len(id_list) + for i in range(length): + print("{0x%04X, %d, pci_vid_%04X },"% (id_list[i], count_list[i],id_list[i]), file = foutput) + + print("};/* We have %d VIDs */"% (length), file = foutput) + + foutput.write(code_postfix) + foutput.close() + +if __name__ == '__main__': + main() |