1#! /bin/sh -e 2# SPDX-License-Identifier: BSD-3-Clause 3# Copyright 2021 Mellanox Technologies, Ltd 4 5# Parse rte_flow support of a driver directory, 6# and optionally show difference with a doc file in .ini format. 7 8dir=$1 # drivers/net/foo 9ref=$2 # doc/guides/nics/features/foo.ini 10 11if [ -z "$dir" ]; then 12 echo "directory argument is required" >&2 13 exit 1 14fi 15 16# test git-grep for -o (--only-matching) option 17if ! git grep -qo git -- $0 >/dev/null 2>&1; then 18 echo "git version >= 2.19 is required" >&2 19 exit 1 20fi 21 22# sorting order 23export LC_COLLATE=C 24 25# exclude exceptions 26exclude() # <pattern> 27{ 28 case $(basename $dir) in 29 bnxt) 30 filter=$(sed -n "/$1/{N;/TYPE_NOT_SUPPORTED/P;}" \ 31 $dir/tf_ulp/ulp_rte_handler_tbl.c | 32 grep -wo "$1[[:alnum:]_]*" | sort -u | 33 tr '\n' '|' | sed 's,.$,\n,') 34 exceptions='RTE_FLOW_ACTION_TYPE_SHARED' 35 grep -vE "$filter" | grep -vE $exceptions;; 36 *) cat 37 esac 38} 39 40# include exceptions 41include() # <pattern> 42{ 43 case $(basename $dir) in 44 esac 45} 46 47# generate INI section 48list() # <title> <pattern> 49{ 50 echo "[$1]" 51 git grep -who "$2[[:alnum:]_]*" $dir | 52 (exclude $2; include $2) | sort -u | 53 awk 'sub(/'$2'/, "") {printf "%-20s = Y\n", tolower($0)}' 54} 55 56rte_flow_support() # <category> 57{ 58 title="rte_flow $1s" 59 pattern=$(echo "RTE_FLOW_$1_TYPE_" | awk '{print toupper($0)}') 60 list "$title" "$pattern" | grep -vwE 'void|indirect|end' 61} 62 63if [ -z "$ref" ]; then # generate full tables 64 rte_flow_support item 65 echo 66 rte_flow_support action 67 exit 0 68fi 69 70# compare with reference input 71rte_flow_compare() # <category> 72{ 73 section="rte_flow $1s]" 74 { 75 rte_flow_support $1 76 sed -n "/$section/,/]/p" "$ref" | sed '/^$/d' 77 } | 78 sed '/]/d' | # ignore section title 79 sed 's, *=.*,,' | # ignore value (better in doc than generated one) 80 sort | uniq -u | # show differences 81 sed "s,^,$1 ," # prefix with category name 82} 83 84rte_flow_compare item 85rte_flow_compare action 86