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
This commit is contained in:
Caleb Chiu 2021-02-17 07:10:31 +00:00 committed by AndersBroman
parent 3ad7f90a96
commit 6581899a84
5 changed files with 45560 additions and 112 deletions

View File

@ -120,6 +120,7 @@ set(LIBWIRESHARK_PUBLIC_HEADERS
packet.h
packet_info.h
params.h
pci-ids.h
plugin_if.h
ppptypes.h
print.h
@ -219,6 +220,7 @@ set(LIBWIRESHARK_NONGENERATED_FILES
oids.c
osi-utils.c
packet.c
pci-ids.c
plugin_if.c
print.c
print_stream.c

File diff suppressed because it is too large Load Diff

44154
epan/pci-ids.c Normal file

File diff suppressed because it is too large Load Diff

12
epan/pci-ids.h Normal file
View File

@ -0,0 +1,12 @@
/* pci-ids.h
*
* By Caleb Chiu <caleb.chiu@macnica.com>
* Copyright 2019
*
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#include <glib.h> //For g* types
extern const char *pci_id_str(guint16 vid, guint16 did, guint16 svid, guint16 ssid);

226
tools/make-pci-ids.py Normal file
View File

@ -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()