aboutsummaryrefslogtreecommitdiff
path: root/tools/ifnet
diff options
context:
space:
mode:
Diffstat (limited to 'tools/ifnet')
-rwxr-xr-xtools/ifnet/convert_ifapi.sh279
1 files changed, 279 insertions, 0 deletions
diff --git a/tools/ifnet/convert_ifapi.sh b/tools/ifnet/convert_ifapi.sh
new file mode 100755
index 000000000000..13509cd7182c
--- /dev/null
+++ b/tools/ifnet/convert_ifapi.sh
@@ -0,0 +1,279 @@
+#!/bin/sh
+#
+# Copyright (c) 2014, 2019, 2020 Juniper Networks, Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+#
+
+#
+# Convert a NIC driver to use the procdural API.
+# It doesn't take care of all the # cases yet,
+# but still does about 95% of work.
+#
+# Author: Sreekanth Rupavatharam
+#
+
+MAX_PASSES=100
+
+if [ $# -lt 1 ]
+then
+ echo " $0 <driver source (e.g., if_em.c)>";
+ exit 1;
+fi
+
+# XXX - This needs to change if the data structure uses different name
+__ifp__="ifp";
+
+file=$1
+
+rotateCursor() {
+ case $toggle in
+ 1) c="\\" ;;
+ 2) c="|" ;;
+ 3) c="/" ;;
+ *) c="-" ;;
+ esac
+ toggle=$(((toggle + 1) % 4))
+ printf " %s \b\b\b" $c
+}
+
+# Handle the case where $__ifp__->if_blah = XX;
+handle_set() {
+ if echo $line | grep "$__ifp__->.* = " > /dev/null 2>&1
+ then
+ if echo $line | grep "\[$__ifp__->.* = " > /dev/null 2>&1; then
+ # Special case of array[ifp->member] = value
+ return 1
+ fi
+ word=`echo $line | awk -F "if_" ' { print $2 }' | awk -F" =" '{ print $1 }'`
+ value=`echo $line | awk -F "=" '{ print $2 }' | sed -e 's/;//g'`
+ new=`echo if_set$word"\($__ifp__,"$value");"`
+ new=`echo $new | sed -e 's/&/\\\&/'`
+ old=`echo $line|sed -e 's/^[ ]*//'`
+ line=`echo $line| sed -e's/'$old'/'$new'/g'`
+ return 0
+ fi
+ return 1
+}
+
+handle_inc() {
+ if echo $line | grep "$__ifp__->.*++\|++$__ifp__->.*" > /dev/null 2>&1
+ then
+ word=`echo $line | awk -F"if_" '{ print $2 }'|awk -F"\+" '{ print $1}'`
+ value=' 1';
+ old=`echo $line|sed -e 's/^[ ]*//'`
+ new=`echo if_inc$word"\($__ifp__,"$value");"`
+ new=`echo $new | sed -e 's/&/\\\&/'`
+ line=`echo $line| sed -e's/'$old'/'$new'/g'`
+ return 0;
+ fi
+ return 1;
+}
+
+handle_add() {
+ if echo $line | grep "$__ifp__->.*+= " > /dev/null 2>&1
+ then
+ word=`echo $line | awk -F"if_" '{ print $2 }'|awk '{ print $1}'`
+ value=`echo $line | awk -F"=" '{ print $2}' | sed -e 's/;//g'`
+ new=`echo if_inc$word"\($__ifp__,$value);"`
+ new=`echo $new | sed -e 's/&/\\\&/'`
+ old=`echo $line|sed -e 's/^[ ]*//'`
+ line=`echo $line| sed -e's/'$old'/'$new'/g'`
+ return 0
+ fi
+ return 1;
+
+}
+
+handle_or() {
+ if echo $line | grep "$__ifp__->.*|= " > /dev/null 2>&1
+ then
+ word=`echo $line | awk -F"if_" '{ print $2 }'|awk '{ print $1}'`
+ value=`echo $line | awk -F"=" '{ print $2}' | sed -e 's/;//g'`
+ new=`echo if_set${word}bit"($__ifp__,$value, 0);"`
+ new=`echo $new | sed -e 's/&/\\\&/'`
+ #line=`echo $line|sed -e 's/&/\\&/'`
+ old=`echo $line|sed -e 's/^[ ]*//'`
+ line=`echo $line| sed -e's/'$old'/'$new'/g'`
+ return 0;
+ fi
+ return 1;
+
+}
+
+handle_and() {
+ if echo $line |grep "$__ifp__->.*&= " > /dev/null 2>&1
+ then
+ word=`echo $line | awk -F"if_" '{ print $2 }'|awk '{ print $1}'`
+ value=`echo $line | awk -F"=" '{ print $2}' | sed -e 's/;//g'`
+ value=`echo $value | sed -e's/~//g'`
+ new=`echo if_set${word}bit"\($__ifp__, 0,$value);"`
+ new=`echo $new | sed -e 's/&/\\\&/'`
+ old=`echo $line|sed -e 's/^[ ]*//'`
+ line=`echo $line| sed -e's/'$old'/'$new'/g'`
+ return 0;
+ fi
+ return 1;
+
+}
+
+handle_toggle() {
+ if echo $line | grep "\^=" > /dev/null 2>&1
+ then
+ line=`echo $line | sed -e 's/'"$__ifp__"'->if_\(.*\) ^=\(.*\);/if_toggle\1('"$__ifp__"',\2);/g'`
+ return 0;
+ fi
+ return 1
+
+}
+
+# XXX - this needs updating
+handle_misc() {
+ if echo $line | grep "$__ifp__->\(if_capabilities\|if_flags\|if_softc\|if_capenable\|if_hwassist\|if_mtu\|if_drv_flags\|if_index\|if_alloctype\|if_dname\|if_xname\|if_addr\|if_hw_tsomax\|if_hw_tsomaxsegcount\|if_hw_tsomaxsegsize\)" > /dev/null 2>&1
+ then
+ word=`echo $line |awk -F"$__ifp__->if_" '{ print $2 }' | \
+ sed -e's/[^a-zA-Z0-9_]/\@/'|awk -F"\@" '{ print $1}'`
+ old=`echo "$__ifp__->if_"${word}`
+ new=`echo "if_get"${word}"($__ifp__)"`
+ new=`echo $new | sed -e 's/&/\\\&/'`
+ line=`echo $line| sed -e's/'$old'/'$new'/g' | sed -e 's/if_getxname/if_name/'`
+ return 0;
+ fi
+ return 1;
+
+}
+
+replace_str ()
+{
+ orig=$1
+ new=$2
+
+ if echo $line | grep "$orig" > /dev/null 2>&1
+ then
+ line=`echo $line | sed -e "s|$orig|$new|"`
+ else
+ return 1
+ fi
+}
+
+handle_special ()
+{
+ replace_str "(\*$__ifp__->if_input)" "if_input" || \
+ replace_str "IFQ_DRV_IS_EMPTY(&$__ifp__->if_snd)" \
+ "if_sendq_empty($__ifp__)" || \
+ replace_str "IFQ_DRV_PREPEND(&$__ifp__->if_snd" \
+ "if_sendq_prepend($__ifp__" || \
+ replace_str "IFQ_SET_READY(&$__ifp__->if_snd)" \
+ "if_setsendqready($__ifp__)" || \
+ replace_str "VLAN_CAPABILITIES($__ifp__)" \
+ "if_vlancap($__ifp__)" || \
+ replace_str "IFQ_SET_MAXLEN(&$__ifp__->if_snd," \
+ "if_setsendqlen($__ifp__," || \
+ replace_str "IFQ_DRV_DEQUEUE(&$__ifp__->if_snd, \(.*\))" \
+ "\1 = if_dequeue($__ifp__)"
+ replace_str "$__ifp__->if_vlantrunk != NULL" \
+ "if_vlantrunkinuse($__ifp__)"
+}
+
+handle_ifps() {
+ handle_set || handle_inc || handle_add || handle_or || handle_and || \
+ handle_toggle || handle_misc || handle_special
+}
+
+handle_renames ()
+{
+ replace_str "if_setinit(" "if_setinitfn(" || \
+ replace_str "if_setioctl(" "if_setioctlfn(" || \
+ replace_str "if_setqflush(" "if_setqflushfn(" || \
+ replace_str "if_settransmit(" "if_settransmitfn(" || \
+ replace_str "if_getdrv_flags(" "if_getdrvflags(" || \
+ replace_str "if_setdrv_flagsbit(" "if_setdrvflagbits(" || \
+ replace_str "if_setstart(" "if_setstartfn(" || \
+ replace_str "if_sethwassistbit(" "if_sethwassistbits(" || \
+ replace_str "ifmedia_init(" "ifmedia_init_drv("
+}
+
+check_ifp()
+{
+ case "$line" in
+ *"${__ifp__}->"*) return 0;; # Still an ifp to convert
+ esac
+ return 1
+}
+
+add_failed ()
+{
+ line="$line /* ${FAIL_PAT} */"
+ return 1
+}
+
+if [ -e $file.tmp ]
+then
+ rm $file.tmp
+fi
+IFS=
+echo -n "Conversion for $file started, please wait: "
+FAIL_PAT="XXX - IFAPI"
+count=0
+while read -r line
+do
+ rotateCursor
+
+ # There is an ifp, we need to process it
+ passes=0
+ while check_ifp
+ do
+ if handle_ifps
+ then
+ handle_renames
+ else
+ add_failed
+ break
+ fi
+ passes=$((passes + 1))
+ if [ $passes -ge $MAX_PASSES ]; then
+ add_failed
+ break
+ fi
+ done
+
+ # Replace the ifnet * with if_t
+ case "$line" in
+ *"struct ifnet"*)
+ line=`echo $line | sed -e 's/struct ifnet[ \t]*\*/if_t /g'` ;;
+ *"IF_LLADDR("*)
+ line=`echo $line | sed -e 's/IF_LLADDR(/if_getlladdr(/g'` ;;
+ esac
+ printf "%s\n" "$line" >> $file.tmp
+done < $1
+echo ""
+count=`grep $FAIL_PAT $file.tmp | wc -l`
+if [ $count -gt 0 ]
+then
+ echo "$count lines could not be converted to IFAPI"
+ echo "Look for /* $FAIL_PAT */ in the converted file"
+fi
+echo "original $file has been moved to $file.orig"
+mv $file $file.orig
+mv $file.tmp $file