wireshark/tools/make-pci-ids.py

228 lines
5.9 KiB
Python
Raw Normal View History

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
2021-02-17 07:10:31 +00:00
#!/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;
}
"""
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
2021-02-17 07:10:31 +00:00
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()