From: Guy Harris Date: Sun, 23 Jun 2013 21:03:38 +0000 (-0700) Subject: Fix build issues with the OpenFlow printer on some systems. X-Git-Tag: tcpdump-4.5.0~70 X-Git-Url: https://git.tcpdump.org/tcpdump/commitdiff_plain/a6c16ed8abc9d0a126a18a39279a9e7b3bde0ef3 Fix build issues with the OpenFlow printer on some systems. Don't assume we have . Instead, use the AC_TYPE_ macros to ensure we have the C99 intN_t and uintN_t types; we already include in tcpdump-stdinc.h iff we have it. Get rid of the structure declarations in openflow-1.0.h, as they have zero-length arrays (not supported by all the compilers people might be using) and as 1) they're only used in sizeof() and 2) after each one there's an assertion to check that sizeof() returns a specific numerical value so, instead, just #define various _LEN items to those numerical values and use them. Add an openflow.h header with a #define for the length of the basic header, and move the declaration of of10_header_body_print() there. --- diff --git a/Makefile.in b/Makefile.in index 3fb1da8d..28412bd3 100644 --- a/Makefile.in +++ b/Makefile.in @@ -167,6 +167,7 @@ HDR = \ nlpid.h \ ntp.h \ oakley.h \ + openflow.h \ openflow-1.0.h \ ospf.h \ ospf6.h \ diff --git a/config.h.in b/config.h.in index 3a2da984..6eba6072 100644 --- a/config.h.in +++ b/config.h.in @@ -283,6 +283,21 @@ /* define on AIX to get certain functions */ #undef _SUN +/* Define for Solaris 2.5.1 so the uint32_t typedef from , + , or is not used. If the typedef was allowed, the + #define below would cause a syntax error. */ +#undef _UINT32_T + +/* Define for Solaris 2.5.1 so the uint64_t typedef from , + , or is not used. If the typedef was allowed, the + #define below would cause a syntax error. */ +#undef _UINT64_T + +/* Define for Solaris 2.5.1 so the uint8_t typedef from , + , or is not used. If the typedef was allowed, the + #define below would cause a syntax error. */ +#undef _UINT8_T + /* define if your compiler allows __attribute__((format)) without a warning */ #undef __ATTRIBUTE___FORMAT_OK @@ -300,16 +315,20 @@ /* Define as token for inline if inlining supported */ #undef inline -/* Define to `short' if int16_t not defined. */ +/* Define to the type of a signed integer type of width exactly 16 bits if + such a type exists and the standard includes do not define it. */ #undef int16_t -/* Define to `int' if int32_t not defined. */ +/* Define to the type of a signed integer type of width exactly 32 bits if + such a type exists and the standard includes do not define it. */ #undef int32_t -/* Define to `long long' if int64_t not defined. */ +/* Define to the type of a signed integer type of width exactly 64 bits if + such a type exists and the standard includes do not define it. */ #undef int64_t -/* Define to `signed char' if int8_t not defined. */ +/* Define to the type of a signed integer type of width exactly 8 bits if such + a type exists and the standard includes do not define it. */ #undef int8_t /* Define to `unsigned short' if u_int16_t not defined. */ @@ -323,3 +342,19 @@ /* Define to `unsigned char' if u_int8_t not defined. */ #undef u_int8_t + +/* Define to the type of an unsigned integer type of width exactly 16 bits if + such a type exists and the standard includes do not define it. */ +#undef uint16_t + +/* Define to the type of an unsigned integer type of width exactly 32 bits if + such a type exists and the standard includes do not define it. */ +#undef uint32_t + +/* Define to the type of an unsigned integer type of width exactly 64 bits if + such a type exists and the standard includes do not define it. */ +#undef uint64_t + +/* Define to the type of an unsigned integer type of width exactly 8 bits if + such a type exists and the standard includes do not define it. */ +#undef uint8_t diff --git a/configure b/configure index a56eb7b0..db477471 100755 --- a/configure +++ b/configure @@ -9853,31 +9853,148 @@ if test -f /dev/bpf0 ; then V_GROUP=bpf fi +# +# Make sure we have definitions for all the C99 specified-width types +# (regardless of whether the environment is a C99 environment or not). -for ac_header in sys/bitypes.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for int8_t" >&5 +echo $ECHO_N "checking for int8_t... $ECHO_C" >&6; } +if test "${ac_cv_c_int8_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_c_int8_t=no + for ac_type in 'int8_t' 'int' 'long int' \ + 'long long int' 'short int' 'signed char'; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(0 < ($ac_type) (((($ac_type) 1 << (8 - 2)) - 1) * 2 + 1))]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(($ac_type) (((($ac_type) 1 << (8 - 2)) - 1) * 2 + 1) + < ($ac_type) (((($ac_type) 1 << (8 - 2)) - 1) * 2 + 2))]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + case $ac_type in + int8_t) ac_cv_c_int8_t=yes ;; + *) ac_cv_c_int8_t=$ac_type ;; +esac + fi -ac_res=`eval echo '${'$as_ac_Header'}'` - { echo "$as_me:$LINENO: result: $ac_res" >&5 -echo "${ECHO_T}$ac_res" >&6; } + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else - # Is the header compilable? -{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } -cat >conftest.$ac_ext <<_ACEOF + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_int8_t" != no && break + done +fi +{ echo "$as_me:$LINENO: result: $ac_cv_c_int8_t" >&5 +echo "${ECHO_T}$ac_cv_c_int8_t" >&6; } + case $ac_cv_c_int8_t in #( + no|yes) ;; #( + *) + +cat >>confdefs.h <<_ACEOF +#define int8_t $ac_cv_c_int8_t +_ACEOF +;; + esac + + + { echo "$as_me:$LINENO: checking for int16_t" >&5 +echo $ECHO_N "checking for int16_t... $ECHO_C" >&6; } +if test "${ac_cv_c_int16_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_c_int16_t=no + for ac_type in 'int16_t' 'int' 'long int' \ + 'long long int' 'short int' 'signed char'; do + cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default -#include <$ac_header> +int +main () +{ +static int test_array [1 - 2 * !(0 < ($ac_type) (((($ac_type) 1 << (16 - 2)) - 1) * 2 + 1))]; +test_array [0] = 0 + + ; + return 0; +} _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" @@ -9896,128 +10013,403 @@ eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then - ac_header_compiler=yes + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(($ac_type) (((($ac_type) 1 << (16 - 2)) - 1) * 2 + 1) + < ($ac_type) (((($ac_type) 1 << (16 - 2)) - 1) * 2 + 2))]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 - ac_header_compiler=no + case $ac_type in + int16_t) ac_cv_c_int16_t=yes ;; + *) ac_cv_c_int16_t=$ac_type ;; +esac + fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6; } +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 -# Is the header present? -{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } -cat >conftest.$ac_ext <<_ACEOF + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_int16_t" != no && break + done +fi +{ echo "$as_me:$LINENO: result: $ac_cv_c_int16_t" >&5 +echo "${ECHO_T}$ac_cv_c_int16_t" >&6; } + case $ac_cv_c_int16_t in #( + no|yes) ;; #( + *) + +cat >>confdefs.h <<_ACEOF +#define int16_t $ac_cv_c_int16_t +_ACEOF +;; + esac + + + { echo "$as_me:$LINENO: checking for int32_t" >&5 +echo $ECHO_N "checking for int32_t... $ECHO_C" >&6; } +if test "${ac_cv_c_int32_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_c_int32_t=no + for ac_type in 'int32_t' 'int' 'long int' \ + 'long long int' 'short int' 'signed char'; do + cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -#include <$ac_header> +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(0 < ($ac_type) (((($ac_type) 1 << (32 - 2)) - 1) * 2 + 1))]; +test_array [0] = 0 + + ; + return 0; +} _ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || test ! -s conftest.err - }; then - ac_header_preproc=yes + } && test -s conftest.$ac_objext; then + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(($ac_type) (((($ac_type) 1 << (32 - 2)) - 1) * 2 + 1) + < ($ac_type) (((($ac_type) 1 << (32 - 2)) - 1) * 2 + 2))]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 - ac_header_preproc=no + case $ac_type in + int32_t) ac_cv_c_int32_t=yes ;; + *) ac_cv_c_int32_t=$ac_type ;; +esac + fi -rm -f conftest.err conftest.$ac_ext -{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6; } +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ;; +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_int32_t" != no && break + done +fi +{ echo "$as_me:$LINENO: result: $ac_cv_c_int32_t" >&5 +echo "${ECHO_T}$ac_cv_c_int32_t" >&6; } + case $ac_cv_c_int32_t in #( + no|yes) ;; #( + *) + +cat >>confdefs.h <<_ACEOF +#define int32_t $ac_cv_c_int32_t +_ACEOF +;; + esac + + + { echo "$as_me:$LINENO: checking for int64_t" >&5 +echo $ECHO_N "checking for int64_t... $ECHO_C" >&6; } +if test "${ac_cv_c_int64_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_c_int64_t=no + for ac_type in 'int64_t' 'int' 'long int' \ + 'long long int' 'short int' 'signed char'; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(0 < ($ac_type) (((($ac_type) 1 << (64 - 2)) - 1) * 2 + 1))]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; esac -{ echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(($ac_type) (((($ac_type) 1 << (64 - 2)) - 1) * 2 + 1) + < ($ac_type) (((($ac_type) 1 << (64 - 2)) - 1) * 2 + 2))]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + case $ac_type in + int64_t) ac_cv_c_int64_t=yes ;; + *) ac_cv_c_int64_t=$ac_type ;; +esac + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_int64_t" != no && break + done +fi +{ echo "$as_me:$LINENO: result: $ac_cv_c_int64_t" >&5 +echo "${ECHO_T}$ac_cv_c_int64_t" >&6; } + case $ac_cv_c_int64_t in #( + no|yes) ;; #( + *) + +cat >>confdefs.h <<_ACEOF +#define int64_t $ac_cv_c_int64_t +_ACEOF +;; + esac + + + { echo "$as_me:$LINENO: checking for uint8_t" >&5 +echo $ECHO_N "checking for uint8_t... $ECHO_C" >&6; } +if test "${ac_cv_c_uint8_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - eval "$as_ac_Header=\$ac_header_preproc" + ac_cv_c_uint8_t=no + for ac_type in 'uint8_t' 'unsigned int' 'unsigned long int' \ + 'unsigned long long int' 'unsigned short int' 'unsigned char'; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(($ac_type) -1 >> (8 - 1) == 1)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + case $ac_type in + uint8_t) ac_cv_c_uint8_t=yes ;; + *) ac_cv_c_uint8_t=$ac_type ;; +esac + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + fi -ac_res=`eval echo '${'$as_ac_Header'}'` - { echo "$as_me:$LINENO: result: $ac_res" >&5 -echo "${ECHO_T}$ac_res" >&6; } +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_uint8_t" != no && break + done fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +{ echo "$as_me:$LINENO: result: $ac_cv_c_uint8_t" >&5 +echo "${ECHO_T}$ac_cv_c_uint8_t" >&6; } + case $ac_cv_c_uint8_t in #( + no|yes) ;; #( + *) + +cat >>confdefs.h <<\_ACEOF +#define _UINT8_T 1 _ACEOF -fi -done +cat >>confdefs.h <<_ACEOF +#define uint8_t $ac_cv_c_uint8_t +_ACEOF +;; + esac -{ echo "$as_me:$LINENO: checking for int8_t" >&5 -echo $ECHO_N "checking for int8_t... $ECHO_C" >&6; } -if test "${ac_cv_type_int8_t+set}" = set; then + { echo "$as_me:$LINENO: checking for uint16_t" >&5 +echo $ECHO_N "checking for uint16_t... $ECHO_C" >&6; } +if test "${ac_cv_c_uint16_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - cat >conftest.$ac_ext <<_ACEOF + ac_cv_c_uint16_t=no + for ac_type in 'uint16_t' 'unsigned int' 'unsigned long int' \ + 'unsigned long long int' 'unsigned short int' 'unsigned char'; do + cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default -#ifdef HAVE_SYS_BITYPES_H -#include -#endif - -typedef int8_t ac__type_new_; int main () { -if ((ac__type_new_ *) 0) - return 0; -if (sizeof (ac__type_new_)) - return 0; +static int test_array [1 - 2 * !(($ac_type) -1 >> (16 - 1) == 1)]; +test_array [0] = 0 + ; return 0; } @@ -10039,52 +10431,57 @@ eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then - ac_cv_type_int8_t=yes + case $ac_type in + uint16_t) ac_cv_c_uint16_t=yes ;; + *) ac_cv_c_uint16_t=$ac_type ;; +esac + else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 - ac_cv_type_int8_t=no + fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_uint16_t" != no && break + done fi -{ echo "$as_me:$LINENO: result: $ac_cv_type_int8_t" >&5 -echo "${ECHO_T}$ac_cv_type_int8_t" >&6; } -if test $ac_cv_type_int8_t = yes; then - : -else +{ echo "$as_me:$LINENO: result: $ac_cv_c_uint16_t" >&5 +echo "${ECHO_T}$ac_cv_c_uint16_t" >&6; } + case $ac_cv_c_uint16_t in #( + no|yes) ;; #( + *) -cat >>confdefs.h <<\_ACEOF -#define int8_t signed char + +cat >>confdefs.h <<_ACEOF +#define uint16_t $ac_cv_c_uint16_t _ACEOF +;; + esac -fi -{ echo "$as_me:$LINENO: checking for u_int8_t" >&5 -echo $ECHO_N "checking for u_int8_t... $ECHO_C" >&6; } -if test "${ac_cv_type_u_int8_t+set}" = set; then + { echo "$as_me:$LINENO: checking for uint32_t" >&5 +echo $ECHO_N "checking for uint32_t... $ECHO_C" >&6; } +if test "${ac_cv_c_uint32_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - cat >conftest.$ac_ext <<_ACEOF + ac_cv_c_uint32_t=no + for ac_type in 'uint32_t' 'unsigned int' 'unsigned long int' \ + 'unsigned long long int' 'unsigned short int' 'unsigned char'; do + cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default -#ifdef HAVE_SYS_BITYPES_H -#include -#endif - -typedef u_int8_t ac__type_new_; int main () { -if ((ac__type_new_ *) 0) - return 0; -if (sizeof (ac__type_new_)) - return 0; +static int test_array [1 - 2 * !(($ac_type) -1 >> (32 - 1) == 1)]; +test_array [0] = 0 + ; return 0; } @@ -10106,48 +10503,61 @@ eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then - ac_cv_type_u_int8_t=yes + case $ac_type in + uint32_t) ac_cv_c_uint32_t=yes ;; + *) ac_cv_c_uint32_t=$ac_type ;; +esac + else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 - ac_cv_type_u_int8_t=no + fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_uint32_t" != no && break + done fi -{ echo "$as_me:$LINENO: result: $ac_cv_type_u_int8_t" >&5 -echo "${ECHO_T}$ac_cv_type_u_int8_t" >&6; } -if test $ac_cv_type_u_int8_t = yes; then - : -else +{ echo "$as_me:$LINENO: result: $ac_cv_c_uint32_t" >&5 +echo "${ECHO_T}$ac_cv_c_uint32_t" >&6; } + case $ac_cv_c_uint32_t in #( + no|yes) ;; #( + *) cat >>confdefs.h <<\_ACEOF -#define u_int8_t unsigned char +#define _UINT32_T 1 _ACEOF -fi -{ echo "$as_me:$LINENO: checking for int16_t" >&5 -echo $ECHO_N "checking for int16_t... $ECHO_C" >&6; } -if test "${ac_cv_type_int16_t+set}" = set; then +cat >>confdefs.h <<_ACEOF +#define uint32_t $ac_cv_c_uint32_t +_ACEOF +;; + esac + + + { echo "$as_me:$LINENO: checking for uint64_t" >&5 +echo $ECHO_N "checking for uint64_t... $ECHO_C" >&6; } +if test "${ac_cv_c_uint64_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - cat >conftest.$ac_ext <<_ACEOF + ac_cv_c_uint64_t=no + for ac_type in 'uint64_t' 'unsigned int' 'unsigned long int' \ + 'unsigned long long int' 'unsigned short int' 'unsigned char'; do + cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default -typedef int16_t ac__type_new_; int main () { -if ((ac__type_new_ *) 0) - return 0; -if (sizeof (ac__type_new_)) - return 0; +static int test_array [1 - 2 * !(($ac_type) -1 >> (64 - 1) == 1)]; +test_array [0] = 0 + ; return 0; } @@ -10169,59 +10579,71 @@ eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then - ac_cv_type_int16_t=yes + case $ac_type in + uint64_t) ac_cv_c_uint64_t=yes ;; + *) ac_cv_c_uint64_t=$ac_type ;; +esac + else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 - ac_cv_type_int16_t=no + fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_uint64_t" != no && break + done fi -{ echo "$as_me:$LINENO: result: $ac_cv_type_int16_t" >&5 -echo "${ECHO_T}$ac_cv_type_int16_t" >&6; } -if test $ac_cv_type_int16_t = yes; then - : -else +{ echo "$as_me:$LINENO: result: $ac_cv_c_uint64_t" >&5 +echo "${ECHO_T}$ac_cv_c_uint64_t" >&6; } + case $ac_cv_c_uint64_t in #( + no|yes) ;; #( + *) cat >>confdefs.h <<\_ACEOF -#define int16_t short +#define _UINT64_T 1 _ACEOF - $ac_includes_default -#ifdef HAVE_SYS_BITYPES_H -#include -#endif -fi -{ echo "$as_me:$LINENO: checking for u_int16_t" >&5 -echo $ECHO_N "checking for u_int16_t... $ECHO_C" >&6; } -if test "${ac_cv_type_u_int16_t+set}" = set; then +cat >>confdefs.h <<_ACEOF +#define uint64_t $ac_cv_c_uint64_t +_ACEOF +;; + esac + + +# +# For now, we're using the old BSD-style u_intXX_t types, so check for +# them. +# +# We should probably migrate to the standard C uintXX_t types. +# + +for ac_header in sys/bitypes.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } else - cat >conftest.$ac_ext <<_ACEOF + # Is the header compilable? +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } +cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default -#ifdef HAVE_SYS_BITYPES_H -#include -#endif - -typedef u_int16_t ac__type_new_; -int -main () -{ -if ((ac__type_new_ *) 0) - return 0; -if (sizeof (ac__type_new_)) - return 0; - ; - return 0; -} +#include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" @@ -10240,31 +10662,107 @@ eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then - ac_cv_type_u_int16_t=yes + ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 - ac_cv_type_u_int16_t=no + ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } + +# Is the header present? +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no fi -{ echo "$as_me:$LINENO: result: $ac_cv_type_u_int16_t" >&5 -echo "${ECHO_T}$ac_cv_type_u_int16_t" >&6; } -if test $ac_cv_type_u_int16_t = yes; then - : + +rm -f conftest.err conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + + ;; +esac +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } -cat >>confdefs.h <<\_ACEOF -#define u_int16_t unsigned short +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi -{ echo "$as_me:$LINENO: checking for int32_t" >&5 -echo $ECHO_N "checking for int32_t... $ECHO_C" >&6; } -if test "${ac_cv_type_int32_t+set}" = set; then +done + + +{ echo "$as_me:$LINENO: checking for u_int8_t" >&5 +echo $ECHO_N "checking for u_int8_t... $ECHO_C" >&6; } +if test "${ac_cv_type_u_int8_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF @@ -10278,7 +10776,7 @@ $ac_includes_default #include #endif -typedef int32_t ac__type_new_; +typedef u_int8_t ac__type_new_; int main () { @@ -10307,31 +10805,31 @@ eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then - ac_cv_type_int32_t=yes + ac_cv_type_u_int8_t=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 - ac_cv_type_int32_t=no + ac_cv_type_u_int8_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -{ echo "$as_me:$LINENO: result: $ac_cv_type_int32_t" >&5 -echo "${ECHO_T}$ac_cv_type_int32_t" >&6; } -if test $ac_cv_type_int32_t = yes; then +{ echo "$as_me:$LINENO: result: $ac_cv_type_u_int8_t" >&5 +echo "${ECHO_T}$ac_cv_type_u_int8_t" >&6; } +if test $ac_cv_type_u_int8_t = yes; then : else cat >>confdefs.h <<\_ACEOF -#define int32_t int +#define u_int8_t unsigned char _ACEOF fi -{ echo "$as_me:$LINENO: checking for u_int32_t" >&5 -echo $ECHO_N "checking for u_int32_t... $ECHO_C" >&6; } -if test "${ac_cv_type_u_int32_t+set}" = set; then +{ echo "$as_me:$LINENO: checking for u_int16_t" >&5 +echo $ECHO_N "checking for u_int16_t... $ECHO_C" >&6; } +if test "${ac_cv_type_u_int16_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF @@ -10345,7 +10843,7 @@ $ac_includes_default #include #endif -typedef u_int32_t ac__type_new_; +typedef u_int16_t ac__type_new_; int main () { @@ -10374,31 +10872,31 @@ eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then - ac_cv_type_u_int32_t=yes + ac_cv_type_u_int16_t=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 - ac_cv_type_u_int32_t=no + ac_cv_type_u_int16_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -{ echo "$as_me:$LINENO: result: $ac_cv_type_u_int32_t" >&5 -echo "${ECHO_T}$ac_cv_type_u_int32_t" >&6; } -if test $ac_cv_type_u_int32_t = yes; then +{ echo "$as_me:$LINENO: result: $ac_cv_type_u_int16_t" >&5 +echo "${ECHO_T}$ac_cv_type_u_int16_t" >&6; } +if test $ac_cv_type_u_int16_t = yes; then : else cat >>confdefs.h <<\_ACEOF -#define u_int32_t unsigned int +#define u_int16_t unsigned short _ACEOF fi -{ echo "$as_me:$LINENO: checking for int64_t" >&5 -echo $ECHO_N "checking for int64_t... $ECHO_C" >&6; } -if test "${ac_cv_type_int64_t+set}" = set; then +{ echo "$as_me:$LINENO: checking for u_int32_t" >&5 +echo $ECHO_N "checking for u_int32_t... $ECHO_C" >&6; } +if test "${ac_cv_type_u_int32_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF @@ -10412,7 +10910,7 @@ $ac_includes_default #include #endif -typedef int64_t ac__type_new_; +typedef u_int32_t ac__type_new_; int main () { @@ -10441,24 +10939,24 @@ eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then - ac_cv_type_int64_t=yes + ac_cv_type_u_int32_t=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 - ac_cv_type_int64_t=no + ac_cv_type_u_int32_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -{ echo "$as_me:$LINENO: result: $ac_cv_type_int64_t" >&5 -echo "${ECHO_T}$ac_cv_type_int64_t" >&6; } -if test $ac_cv_type_int64_t = yes; then +{ echo "$as_me:$LINENO: result: $ac_cv_type_u_int32_t" >&5 +echo "${ECHO_T}$ac_cv_type_u_int32_t" >&6; } +if test $ac_cv_type_u_int32_t = yes; then : else cat >>confdefs.h <<\_ACEOF -#define int64_t long long +#define u_int32_t unsigned int _ACEOF fi @@ -10532,8 +11030,7 @@ fi # -# We can't just check for - some systems have one that -# doesn't define all the PRI[doxu]64 macros. +# Check for # for ac_header in inttypes.h @@ -10672,7 +11169,8 @@ if test `eval echo '${'$as_ac_Header'}'` = yes; then _ACEOF # - # OK, we have inttypes.h, but does it define those macros? + # OK, we have inttypes.h, but does it define all the PRI[doxu]64 macros? + # Some systems have an inttypes.h that doesn't define all of them. # { echo "$as_me:$LINENO: checking whether inttypes.h defines the PRI[doxu]64 macros" >&5 echo $ECHO_N "checking whether inttypes.h defines the PRI[doxu]64 macros... $ECHO_C" >&6; } diff --git a/configure.in b/configure.in index 138828e6..4c8059b8 100644 --- a/configure.in +++ b/configure.in @@ -868,15 +868,26 @@ if test -f /dev/bpf0 ; then V_GROUP=bpf fi +# +# Make sure we have definitions for all the C99 specified-width types +# (regardless of whether the environment is a C99 environment or not). +AC_TYPE_INT8_T +AC_TYPE_INT16_T +AC_TYPE_INT32_T +AC_TYPE_INT64_T +AC_TYPE_UINT8_T +AC_TYPE_UINT16_T +AC_TYPE_UINT32_T +AC_TYPE_UINT64_T + +# +# For now, we're using the old BSD-style u_intXX_t types, so check for +# them. +# +# We should probably migrate to the standard C uintXX_t types. +# AC_CHECK_HEADERS(sys/bitypes.h) -AC_CHECK_TYPE([int8_t], , - [AC_DEFINE([int8_t], [signed char], - [Define to `signed char' if int8_t not defined.])], - [AC_INCLUDES_DEFAULT -#ifdef HAVE_SYS_BITYPES_H -#include -#endif]) AC_CHECK_TYPE([u_int8_t], , [AC_DEFINE([u_int8_t], [unsigned char], [Define to `unsigned char' if u_int8_t not defined.])], @@ -884,13 +895,6 @@ AC_CHECK_TYPE([u_int8_t], , #ifdef HAVE_SYS_BITYPES_H #include #endif]) -AC_CHECK_TYPE([int16_t], , - [AC_DEFINE([int16_t], [short], - [Define to `short' if int16_t not defined.])] - [AC_INCLUDES_DEFAULT -#ifdef HAVE_SYS_BITYPES_H -#include -#endif]) AC_CHECK_TYPE([u_int16_t], , [AC_DEFINE([u_int16_t], [unsigned short], [Define to `unsigned short' if u_int16_t not defined.])], @@ -898,13 +902,6 @@ AC_CHECK_TYPE([u_int16_t], , #ifdef HAVE_SYS_BITYPES_H #include #endif]) -AC_CHECK_TYPE([int32_t], , - [AC_DEFINE([int32_t], [int], - [Define to `int' if int32_t not defined.])], - [AC_INCLUDES_DEFAULT -#ifdef HAVE_SYS_BITYPES_H -#include -#endif]) AC_CHECK_TYPE([u_int32_t], , [AC_DEFINE([u_int32_t], [unsigned int], [Define to `unsigned int' if u_int32_t not defined.])], @@ -912,13 +909,6 @@ AC_CHECK_TYPE([u_int32_t], , #ifdef HAVE_SYS_BITYPES_H #include #endif]) -AC_CHECK_TYPE([int64_t], , - [AC_DEFINE([int64_t], [long long], - [Define to `long long' if int64_t not defined.])], - [AC_INCLUDES_DEFAULT -#ifdef HAVE_SYS_BITYPES_H -#include -#endif]) AC_CHECK_TYPE([u_int64_t], , [AC_DEFINE([u_int64_t], [unsigned long long], [Define to `unsigned long long' if u_int64_t not defined.])], @@ -928,13 +918,13 @@ AC_CHECK_TYPE([u_int64_t], , #endif]) # -# We can't just check for - some systems have one that -# doesn't define all the PRI[doxu]64 macros. +# Check for # AC_CHECK_HEADERS(inttypes.h, [ # - # OK, we have inttypes.h, but does it define those macros? + # OK, we have inttypes.h, but does it define all the PRI[doxu]64 macros? + # Some systems have an inttypes.h that doesn't define all of them. # AC_MSG_CHECKING([[whether inttypes.h defines the PRI[doxu]64 macros]]) AC_COMPILE_IFELSE( diff --git a/interface.h b/interface.h index fa9d2905..93676919 100644 --- a/interface.h +++ b/interface.h @@ -238,8 +238,6 @@ extern const u_char * ns_nprint (register const u_char *, register const u_char extern void ntp_print(const u_char *, u_int); extern u_int null_if_print(const struct pcap_pkthdr *, const u_char *); extern void openflow_print(const u_char *, u_int); -extern const u_char *of10_header_body_print(const u_char *, const u_char *, - const uint8_t, const uint16_t, const uint32_t); extern void ospf_print(const u_char *, u_int, const u_char *); extern void olsr_print (const u_char *, u_int, int); extern void pimv1_print(const u_char *, u_int); diff --git a/openflow-1.0.h b/openflow-1.0.h index c0b5090d..f9490458 100644 --- a/openflow-1.0.h +++ b/openflow-1.0.h @@ -36,29 +36,6 @@ #ifndef OPENFLOW_OPENFLOW_H #define OPENFLOW_OPENFLOW_H 1 -#ifdef __KERNEL__ -#include -#else -#include -#endif - -#ifdef SWIG -#define OFP_ASSERT(EXPR) /* SWIG can't handle OFP_ASSERT. */ -#elif !defined(__cplusplus) -/* Build-time assertion for use in a declaration context. */ -#define OFP_ASSERT(EXPR) \ - extern int (*build_assert(void))[ sizeof(struct { \ - unsigned int build_assert_failed : (EXPR) ? 1 : -1; })] -#else /* __cplusplus */ -#define OFP_ASSERT(_EXPR) typedef int build_assert_failed[(_EXPR) ? 1 : -1] -#endif /* __cplusplus */ - -#ifndef SWIG -#define OFP_PACKED __attribute__((packed)) -#else -#define OFP_PACKED /* SWIG doesn't understand __attribute. */ -#endif - /* Version number: * Non-experimental versions released: 0x01 * Experimental versions released: 0x81 -- 0x99 @@ -137,24 +114,7 @@ enum ofp_type { }; -/* Header on all OpenFlow packets. */ -struct ofp_header { - uint8_t version; /* OFP_VERSION. */ - uint8_t type; /* One of the OFPT_ constants. */ - uint16_t length; /* Length including this ofp_header. */ - uint32_t xid; /* Transaction id associated with this packet. - Replies use the same id as was in the request - to facilitate pairing. */ -}; -OFP_ASSERT(sizeof(struct ofp_header) == 8); - -/* OFPT_HELLO. This message has an empty body, but implementations must - * ignore any data included in the body, to allow for future extensions. */ -struct ofp_hello { - struct ofp_header header; -}; - -#define OFP_DEFAULT_MISS_SEND_LEN 128 +#define OFP_DEFAULT_MISS_SEND_LEN 128 enum ofp_config_flags { /* Handling of IP fragments. */ @@ -164,14 +124,7 @@ enum ofp_config_flags { OFPC_FRAG_MASK = 3 }; -/* Switch configuration. */ -struct ofp_switch_config { - struct ofp_header header; - uint16_t flags; /* OFPC_* flags. */ - uint16_t miss_send_len; /* Max bytes of new flow that datapath should - send to the controller. */ -}; -OFP_ASSERT(sizeof(struct ofp_switch_config) == 12); +#define OF_SWITCH_CONFIG_LEN 12 /* Capabilities supported by the datapath. */ enum ofp_capabilities { @@ -234,46 +187,9 @@ enum ofp_port_features { OFPPF_PAUSE_ASYM = 1 << 11 /* Asymmetric pause. */ }; -/* Description of a physical port */ -struct ofp_phy_port { - uint16_t port_no; - uint8_t hw_addr[OFP_ETH_ALEN]; - char name[OFP_MAX_PORT_NAME_LEN]; /* Null-terminated */ - - uint32_t config; /* Bitmap of OFPPC_* flags. */ - uint32_t state; /* Bitmap of OFPPS_* flags. */ - - /* Bitmaps of OFPPF_* that describe features. All bits zeroed if - * unsupported or unavailable. */ - uint32_t curr; /* Current features. */ - uint32_t advertised; /* Features being advertised by the port. */ - uint32_t supported; /* Features supported by the port. */ - uint32_t peer; /* Features advertised by peer. */ -}; -OFP_ASSERT(sizeof(struct ofp_phy_port) == 48); - -/* Switch features. */ -struct ofp_switch_features { - struct ofp_header header; - uint64_t datapath_id; /* Datapath unique ID. The lower 48-bits are for - a MAC address, while the upper 16-bits are - implementer-defined. */ - - uint32_t n_buffers; /* Max packets buffered at once. */ +#define OF_PHY_PORT_LEN 48 - uint8_t n_tables; /* Number of tables supported by datapath. */ - uint8_t pad[3]; /* Align to 64-bits. */ - - /* Features. */ - uint32_t capabilities; /* Bitmap of support "ofp_capabilities". */ - uint32_t actions; /* Bitmap of supported "ofp_action_type"s. */ - - /* Port info.*/ - struct ofp_phy_port ports[0]; /* Port definitions. The number of ports - is inferred from the length field in - the header. */ -}; -OFP_ASSERT(sizeof(struct ofp_switch_features) == 32); +#define OF_SWITCH_FEATURES_LEN 32 /* What changed about the physical port */ enum ofp_port_reason { @@ -282,33 +198,9 @@ enum ofp_port_reason { OFPPR_MODIFY /* Some attribute of the port has changed. */ }; -/* A physical port has changed in the datapath */ -struct ofp_port_status { - struct ofp_header header; - uint8_t reason; /* One of OFPPR_*. */ - uint8_t pad[7]; /* Align to 64-bits. */ - struct ofp_phy_port desc; -}; -OFP_ASSERT(sizeof(struct ofp_port_status) == 64); - -/* Modify behavior of the physical port */ -struct ofp_port_mod { - struct ofp_header header; - uint16_t port_no; - uint8_t hw_addr[OFP_ETH_ALEN]; /* The hardware address is not - configurable. This is used to - sanity-check the request, so it must - be the same as returned in an - ofp_phy_port struct. */ - - uint32_t config; /* Bitmap of OFPPC_* flags. */ - uint32_t mask; /* Bitmap of OFPPC_* flags to be changed. */ - - uint32_t advertise; /* Bitmap of "ofp_port_features"s. Zero all - bits to prevent any action taking place. */ - uint8_t pad[4]; /* Pad to 64-bits. */ -}; -OFP_ASSERT(sizeof(struct ofp_port_mod) == 32); +#define OF_PORT_STATUS_LEN 64 + +#define OF_PORT_MOD_LEN 32 /* Why is this packet being sent to the controller? */ enum ofp_packet_in_reason { @@ -316,22 +208,7 @@ enum ofp_packet_in_reason { OFPR_ACTION /* Action explicitly output to controller. */ }; -/* Packet received on port (datapath -> controller). */ -struct ofp_packet_in { - struct ofp_header header; - uint32_t buffer_id; /* ID assigned by datapath. */ - uint16_t total_len; /* Full length of frame. */ - uint16_t in_port; /* Port on which frame was received. */ - uint8_t reason; /* Reason packet is being sent (one of OFPR_*) */ - uint8_t pad; - uint8_t data[0]; /* Ethernet frame, halfway through 32-bit word, - so the IP header is 32-bit aligned. The - amount of data is inferred from the length - field in the header. Because of padding, - offsetof(struct ofp_packet_in, data) == - sizeof(struct ofp_packet_in) - 2. */ -}; -OFP_ASSERT(sizeof(struct ofp_packet_in) == 20); +#define OF_PACKET_IN_LEN 20 enum ofp_action_type { OFPAT_OUTPUT, /* Output to switch port. */ @@ -349,110 +226,30 @@ enum ofp_action_type { OFPAT_VENDOR = 0xffff }; -/* Action structure for OFPAT_OUTPUT, which sends packets out 'port'. - * When the 'port' is the OFPP_CONTROLLER, 'max_len' indicates the max - * number of bytes to send. A 'max_len' of zero means no bytes of the - * packet should be sent.*/ -struct ofp_action_output { - uint16_t type; /* OFPAT_OUTPUT. */ - uint16_t len; /* Length is 8. */ - uint16_t port; /* Output port. */ - uint16_t max_len; /* Max length to send to controller. */ -}; -OFP_ASSERT(sizeof(struct ofp_action_output) == 8); +#define OF_ACTION_OUTPUT_LEN 8 /* The VLAN id is 12 bits, so we can use the entire 16 bits to indicate * special conditions. All ones is used to match that no VLAN id was * set. */ #define OFP_VLAN_NONE 0xffff -/* Action structure for OFPAT_SET_VLAN_VID. */ -struct ofp_action_vlan_vid { - uint16_t type; /* OFPAT_SET_VLAN_VID. */ - uint16_t len; /* Length is 8. */ - uint16_t vlan_vid; /* VLAN id. */ - uint8_t pad[2]; -}; -OFP_ASSERT(sizeof(struct ofp_action_vlan_vid) == 8); - -/* Action structure for OFPAT_SET_VLAN_PCP. */ -struct ofp_action_vlan_pcp { - uint16_t type; /* OFPAT_SET_VLAN_PCP. */ - uint16_t len; /* Length is 8. */ - uint8_t vlan_pcp; /* VLAN priority. */ - uint8_t pad[3]; -}; -OFP_ASSERT(sizeof(struct ofp_action_vlan_pcp) == 8); - -/* Action structure for OFPAT_SET_DL_SRC/DST. */ -struct ofp_action_dl_addr { - uint16_t type; /* OFPAT_SET_DL_SRC/DST. */ - uint16_t len; /* Length is 16. */ - uint8_t dl_addr[OFP_ETH_ALEN]; /* Ethernet address. */ - uint8_t pad[6]; -}; -OFP_ASSERT(sizeof(struct ofp_action_dl_addr) == 16); +#define OF_ACTION_VLAN_VID_LEN 8 -/* Action structure for OFPAT_SET_NW_SRC/DST. */ -struct ofp_action_nw_addr { - uint16_t type; /* OFPAT_SET_TW_SRC/DST. */ - uint16_t len; /* Length is 8. */ - uint32_t nw_addr; /* IP address. */ -}; -OFP_ASSERT(sizeof(struct ofp_action_nw_addr) == 8); - -/* Action structure for OFPAT_SET_TP_SRC/DST. */ -struct ofp_action_tp_port { - uint16_t type; /* OFPAT_SET_TP_SRC/DST. */ - uint16_t len; /* Length is 8. */ - uint16_t tp_port; /* TCP/UDP port. */ - uint8_t pad[2]; -}; -OFP_ASSERT(sizeof(struct ofp_action_tp_port) == 8); - -/* Action structure for OFPAT_SET_NW_TOS. */ -struct ofp_action_nw_tos { - uint16_t type; /* OFPAT_SET_TW_SRC/DST. */ - uint16_t len; /* Length is 8. */ - uint8_t nw_tos; /* IP ToS (DSCP field, 6 bits). */ - uint8_t pad[3]; -}; -OFP_ASSERT(sizeof(struct ofp_action_nw_tos) == 8); - -/* Action header for OFPAT_VENDOR. The rest of the body is vendor-defined. */ -struct ofp_action_vendor_header { - uint16_t type; /* OFPAT_VENDOR. */ - uint16_t len; /* Length is a multiple of 8. */ - uint32_t vendor; /* Vendor ID, which takes the same form - as in "struct ofp_vendor_header". */ -}; -OFP_ASSERT(sizeof(struct ofp_action_vendor_header) == 8); - -/* Action header that is common to all actions. The length includes the - * header and any padding used to make the action 64-bit aligned. - * NB: The length of an action *must* always be a multiple of eight. */ -struct ofp_action_header { - uint16_t type; /* One of OFPAT_*. */ - uint16_t len; /* Length of action, including this - header. This is the length of action, - including any padding to make it - 64-bit aligned. */ - uint8_t pad[4]; -}; -OFP_ASSERT(sizeof(struct ofp_action_header) == 8); - -/* Send packet (controller -> datapath). */ -struct ofp_packet_out { - struct ofp_header header; - uint32_t buffer_id; /* ID assigned by datapath (-1 if none). */ - uint16_t in_port; /* Packet's input port (OFPP_NONE if none). */ - uint16_t actions_len; /* Size of action array in bytes. */ - struct ofp_action_header actions[0]; /* Actions. */ - /* uint8_t data[0]; */ /* Packet data. The length is inferred - from the length field in the header. - (Only meaningful if buffer_id == -1.) */ -}; -OFP_ASSERT(sizeof(struct ofp_packet_out) == 16); +#define OF_ACTION_VLAN_PCP_LEN 8 + +#define OF_ACTION_DL_ADDR_LEN 16 + +#define OF_ACTION_NW_ADDR_LEN 8 + +#define OF_ACTION_TP_PORT_LEN 8 + +#define OF_ACTION_NW_TOS_LEN 8 + +#define OF_ACTION_VENDOR_HEADER_LEN 8 + +#define OF_ACTION_HEADER_LEN 8 + +#define OF_PACKET_OUT_LEN 16 enum ofp_flow_mod_command { OFPFC_ADD, /* New flow. */ @@ -516,26 +313,7 @@ enum ofp_flow_wildcards { */ #define OFP_VLAN_NONE 0xffff -/* Fields to match against flows */ -struct ofp_match { - uint32_t wildcards; /* Wildcard fields. */ - uint16_t in_port; /* Input switch port. */ - uint8_t dl_src[OFP_ETH_ALEN]; /* Ethernet source address. */ - uint8_t dl_dst[OFP_ETH_ALEN]; /* Ethernet destination address. */ - uint16_t dl_vlan; /* Input VLAN id. */ - uint8_t dl_vlan_pcp; /* Input VLAN priority. */ - uint8_t pad1[1]; /* Align to 64-bits */ - uint16_t dl_type; /* Ethernet frame type. */ - uint8_t nw_tos; /* IP ToS (actually DSCP field, 6 bits). */ - uint8_t nw_proto; /* IP protocol or lower 8 bits of - * ARP opcode. */ - uint8_t pad2[2]; /* Align to 64-bits */ - uint32_t nw_src; /* IP source address. */ - uint32_t nw_dst; /* IP destination address. */ - uint16_t tp_src; /* TCP/UDP source port. */ - uint16_t tp_dst; /* TCP/UDP destination port. */ -}; -OFP_ASSERT(sizeof(struct ofp_match) == 40); +#define OF_MATCH_LEN 40 /* The match fields for ICMP type and code use the transport source and * destination port fields, respectively. */ @@ -556,29 +334,7 @@ enum ofp_flow_mod_flags { OFPFF_EMERG = 1 << 2 /* Remark this is for emergency. */ }; -/* Flow setup and teardown (controller -> datapath). */ -struct ofp_flow_mod { - struct ofp_header header; - struct ofp_match match; /* Fields to match */ - uint64_t cookie; /* Opaque controller-issued identifier. */ - - /* Flow actions. */ - uint16_t command; /* One of OFPFC_*. */ - uint16_t idle_timeout; /* Idle time before discarding (seconds). */ - uint16_t hard_timeout; /* Max time before discarding (seconds). */ - uint16_t priority; /* Priority level of flow entry. */ - uint32_t buffer_id; /* Buffered packet to apply to (or -1). - Not meaningful for OFPFC_DELETE*. */ - uint16_t out_port; /* For OFPFC_DELETE* commands, require - matching entries to include this as an - output port. A value of OFPP_NONE - indicates no restriction. */ - uint16_t flags; /* One of OFPFF_*. */ - struct ofp_action_header actions[0]; /* The action length is inferred - from the length field in the - header. */ -}; -OFP_ASSERT(sizeof(struct ofp_flow_mod) == 72); +#define OF_FLOW_MOD_LEN 72 /* Why was this flow removed? */ enum ofp_flow_removed_reason { @@ -587,25 +343,7 @@ enum ofp_flow_removed_reason { OFPRR_DELETE /* Evicted by a DELETE flow mod. */ }; -/* Flow removed (datapath -> controller). */ -struct ofp_flow_removed { - struct ofp_header header; - struct ofp_match match; /* Description of fields. */ - uint64_t cookie; /* Opaque controller-issued identifier. */ - - uint16_t priority; /* Priority level of flow entry. */ - uint8_t reason; /* One of OFPRR_*. */ - uint8_t pad[1]; /* Align to 32-bits. */ - - uint32_t duration_sec; /* Time flow was alive in seconds. */ - uint32_t duration_nsec; /* Time flow was alive in nanoseconds beyond - duration_sec. */ - uint16_t idle_timeout; /* Idle timeout from original flow mod. */ - uint8_t pad2[2]; /* Align to 64-bits. */ - uint64_t packet_count; - uint64_t byte_count; -}; -OFP_ASSERT(sizeof(struct ofp_flow_removed) == 88); +#define OF_FLOW_REMOVED_LEN 88 /* Values for 'type' in ofp_error_message. These values are immutable: they * will not change in future versions of the protocol (although new values may @@ -684,16 +422,7 @@ enum ofp_queue_op_failed_code { OFPQOFC_EPERM /* Permissions error. */ }; -/* OFPT_ERROR: Error message (datapath -> controller). */ -struct ofp_error_msg { - struct ofp_header header; - - uint16_t type; - uint16_t code; - uint8_t data[0]; /* Variable-length data. Interpreted based - on the type and code. */ -}; -OFP_ASSERT(sizeof(struct ofp_error_msg) == 12); +#define OF_ERROR_MSG_LEN 12 enum ofp_stats_types { /* Description of this OpenFlow switch. @@ -733,154 +462,34 @@ enum ofp_stats_types { OFPST_VENDOR = 0xffff }; -struct ofp_stats_request { - struct ofp_header header; - uint16_t type; /* One of the OFPST_* constants. */ - uint16_t flags; /* OFPSF_REQ_* flags (none yet defined). */ - uint8_t body[0]; /* Body of the request. */ -}; -OFP_ASSERT(sizeof(struct ofp_stats_request) == 12); +#define OF_STATS_REQUEST_LEN 12 enum ofp_stats_reply_flags { OFPSF_REPLY_MORE = 1 << 0 /* More replies to follow. */ }; -struct ofp_stats_reply { - struct ofp_header header; - uint16_t type; /* One of the OFPST_* constants. */ - uint16_t flags; /* OFPSF_REPLY_* flags. */ - uint8_t body[0]; /* Body of the reply. */ -}; -OFP_ASSERT(sizeof(struct ofp_stats_reply) == 12); +#define OF_STATS_REPLY_LEN 12 #define DESC_STR_LEN 256 #define SERIAL_NUM_LEN 32 -/* Body of reply to OFPST_DESC request. Each entry is a NULL-terminated - * ASCII string. */ -struct ofp_desc_stats { - char mfr_desc[DESC_STR_LEN]; /* Manufacturer description. */ - char hw_desc[DESC_STR_LEN]; /* Hardware description. */ - char sw_desc[DESC_STR_LEN]; /* Software description. */ - char serial_num[SERIAL_NUM_LEN]; /* Serial number. */ - char dp_desc[DESC_STR_LEN]; /* Human readable description of datapath. */ -}; -OFP_ASSERT(sizeof(struct ofp_desc_stats) == 1056); - -/* Body for ofp_stats_request of type OFPST_FLOW. */ -struct ofp_flow_stats_request { - struct ofp_match match; /* Fields to match. */ - uint8_t table_id; /* ID of table to read (from ofp_table_stats), - 0xff for all tables or 0xfe for emergency. */ - uint8_t pad; /* Align to 32 bits. */ - uint16_t out_port; /* Require matching entries to include this - as an output port. A value of OFPP_NONE - indicates no restriction. */ -}; -OFP_ASSERT(sizeof(struct ofp_flow_stats_request) == 44); - -/* Body of reply to OFPST_FLOW request. */ -struct ofp_flow_stats { - uint16_t length; /* Length of this entry. */ - uint8_t table_id; /* ID of table flow came from. */ - uint8_t pad; - struct ofp_match match; /* Description of fields. */ - uint32_t duration_sec; /* Time flow has been alive in seconds. */ - uint32_t duration_nsec; /* Time flow has been alive in nanoseconds beyond - duration_sec. */ - uint16_t priority; /* Priority of the entry. Only meaningful - when this is not an exact-match entry. */ - uint16_t idle_timeout; /* Number of seconds idle before expiration. */ - uint16_t hard_timeout; /* Number of seconds before expiration. */ - uint8_t pad2[6]; /* Align to 64-bits. */ - uint64_t cookie; /* Opaque controller-issued identifier. */ - uint64_t packet_count; /* Number of packets in flow. */ - uint64_t byte_count; /* Number of bytes in flow. */ - struct ofp_action_header actions[0]; /* Actions. */ -}; -OFP_ASSERT(sizeof(struct ofp_flow_stats) == 88); - -/* Body for ofp_stats_request of type OFPST_AGGREGATE. */ -struct ofp_aggregate_stats_request { - struct ofp_match match; /* Fields to match. */ - uint8_t table_id; /* ID of table to read (from ofp_table_stats) - 0xff for all tables or 0xfe for emergency. */ - uint8_t pad; /* Align to 32 bits. */ - uint16_t out_port; /* Require matching entries to include this - as an output port. A value of OFPP_NONE - indicates no restriction. */ -}; -OFP_ASSERT(sizeof(struct ofp_aggregate_stats_request) == 44); - -/* Body of reply to OFPST_AGGREGATE request. */ -struct ofp_aggregate_stats_reply { - uint64_t packet_count; /* Number of packets in flows. */ - uint64_t byte_count; /* Number of bytes in flows. */ - uint32_t flow_count; /* Number of flows. */ - uint8_t pad[4]; /* Align to 64 bits. */ -}; -OFP_ASSERT(sizeof(struct ofp_aggregate_stats_reply) == 24); - -/* Body of reply to OFPST_TABLE request. */ -struct ofp_table_stats { - uint8_t table_id; /* Identifier of table. Lower numbered tables - are consulted first. */ - uint8_t pad[3]; /* Align to 32-bits. */ - char name[OFP_MAX_TABLE_NAME_LEN]; - uint32_t wildcards; /* Bitmap of OFPFW_* wildcards that are - supported by the table. */ - uint32_t max_entries; /* Max number of entries supported. */ - uint32_t active_count; /* Number of active entries. */ - uint64_t lookup_count; /* Number of packets looked up in table. */ - uint64_t matched_count; /* Number of packets that hit table. */ -}; -OFP_ASSERT(sizeof(struct ofp_table_stats) == 64); - -/* Body for ofp_stats_request of type OFPST_PORT. */ -struct ofp_port_stats_request { - uint16_t port_no; /* OFPST_PORT message must request statistics - * either for a single port (specified in - * port_no) or for all ports (if port_no == - * OFPP_NONE). */ - uint8_t pad[6]; -}; -OFP_ASSERT(sizeof(struct ofp_port_stats_request) == 8); - -/* Body of reply to OFPST_PORT request. If a counter is unsupported, set - * the field to all ones. */ -struct ofp_port_stats { - uint16_t port_no; - uint8_t pad[6]; /* Align to 64-bits. */ - uint64_t rx_packets; /* Number of received packets. */ - uint64_t tx_packets; /* Number of transmitted packets. */ - uint64_t rx_bytes; /* Number of received bytes. */ - uint64_t tx_bytes; /* Number of transmitted bytes. */ - uint64_t rx_dropped; /* Number of packets dropped by RX. */ - uint64_t tx_dropped; /* Number of packets dropped by TX. */ - uint64_t rx_errors; /* Number of receive errors. This is a super-set - of more specific receive errors and should be - greater than or equal to the sum of all - rx_*_err values. */ - uint64_t tx_errors; /* Number of transmit errors. This is a super-set - of more specific transmit errors and should be - greater than or equal to the sum of all - tx_*_err values (none currently defined.) */ - uint64_t rx_frame_err; /* Number of frame alignment errors. */ - uint64_t rx_over_err; /* Number of packets with RX overrun. */ - uint64_t rx_crc_err; /* Number of CRC errors. */ - uint64_t collisions; /* Number of collisions. */ -}; -OFP_ASSERT(sizeof(struct ofp_port_stats) == 104); - -/* Vendor extension. */ -struct ofp_vendor_header { - struct ofp_header header; /* Type OFPT_VENDOR. */ - uint32_t vendor; /* Vendor ID: - * - MSB 0: low-order bytes are IEEE OUI. - * - MSB != 0: defined by OpenFlow - * consortium. */ - /* Vendor-defined arbitrary additional data. */ -}; -OFP_ASSERT(sizeof(struct ofp_vendor_header) == 12); + +#define OF_DESC_STATS_LEN 1056 + +#define OF_FLOW_STATS_REQUEST_LEN 44 + +#define OF_FLOW_STATS_LEN 88 + +#define OF_AGGREGATE_STATS_REQUEST_LEN 44 + +#define OF_AGGREGATE_STATS_REPLY_LEN 24 + +#define OF_TABLE_STATS_LEN 64 + +#define OF_PORT_STATS_REQUEST_LEN 8 + +#define OF_PORT_STATS_LEN 104 + +#define OF_VENDOR_HEADER_LEN 12 /* All ones is used to indicate all queues in a port (for stats retrieval). */ #define OFPQ_ALL 0xffffffff @@ -895,76 +504,20 @@ enum ofp_queue_properties { * (i.e. max rate, precedence, etc). */ }; -/* Common description for a queue. */ -struct ofp_queue_prop_header { - uint16_t property; /* One of OFPQT_. */ - uint16_t len; /* Length of property, including this header. */ - uint8_t pad[4]; /* 64-bit alignemnt. */ -}; -OFP_ASSERT(sizeof(struct ofp_queue_prop_header) == 8); +#define OF_QUEUE_PROP_HEADER_LEN 8 -/* Min-Rate queue property description. */ -struct ofp_queue_prop_min_rate { - struct ofp_queue_prop_header prop_header; /* prop: OFPQT_MIN, len: 16. */ - uint16_t rate; /* In 1/10 of a percent; >1000 -> disabled. */ - uint8_t pad[6]; /* 64-bit alignment */ -}; -OFP_ASSERT(sizeof(struct ofp_queue_prop_min_rate) == 16); - -/* Full description for a queue. */ -struct ofp_packet_queue { - uint32_t queue_id; /* id for the specific queue. */ - uint16_t len; /* Length in bytes of this queue desc. */ - uint8_t pad[2]; /* 64-bit alignment. */ - struct ofp_queue_prop_header properties[0]; /* List of properties. */ -}; -OFP_ASSERT(sizeof(struct ofp_packet_queue) == 8); - -/* Query for port queue configuration. */ -struct ofp_queue_get_config_request { - struct ofp_header header; - uint16_t port; /* Port to be queried. Should refer - to a valid physical port (i.e. < OFPP_MAX) */ - uint8_t pad[2]; /* 32-bit alignment. */ -}; -OFP_ASSERT(sizeof(struct ofp_queue_get_config_request) == 12); - -/* Queue configuration for a given port. */ -struct ofp_queue_get_config_reply { - struct ofp_header header; - uint16_t port; - uint8_t pad[6]; - struct ofp_packet_queue queues[0]; /* List of configured queues. */ -}; -OFP_ASSERT(sizeof(struct ofp_queue_get_config_reply) == 16); - -/* OFPAT_ENQUEUE action struct: send packets to given queue on port. */ -struct ofp_action_enqueue { - uint16_t type; /* OFPAT_ENQUEUE. */ - uint16_t len; /* Len is 16. */ - uint16_t port; /* Port that queue belongs. Should - refer to a valid physical port - (i.e. < OFPP_MAX) or OFPP_IN_PORT. */ - uint8_t pad[6]; /* Pad for 64-bit alignment. */ - uint32_t queue_id; /* Where to enqueue the packets. */ -}; -OFP_ASSERT(sizeof(struct ofp_action_enqueue) == 16); +#define OF_QUEUE_PROP_MIN_RATE_LEN 16 -struct ofp_queue_stats_request { - uint16_t port_no; /* All ports if OFPT_ALL. */ - uint8_t pad[2]; /* Align to 32-bits. */ - uint32_t queue_id; /* All queues if OFPQ_ALL. */ -}; -OFP_ASSERT(sizeof(struct ofp_queue_stats_request) == 8); - -struct ofp_queue_stats { - uint16_t port_no; - uint8_t pad[2]; /* Align to 32-bits. */ - uint32_t queue_id; /* Queue i.d */ - uint64_t tx_bytes; /* Number of transmitted bytes. */ - uint64_t tx_packets; /* Number of transmitted packets. */ - uint64_t tx_errors; /* Number of packets dropped due to overrun. */ -}; -OFP_ASSERT(sizeof(struct ofp_queue_stats) == 32); +#define OF_PACKET_QUEUE_LEN 8 + +#define OF_QUEUE_GET_CONFIG_REQUEST_LEN 12 + +#define OF_QUEUE_GET_CONFIG_REPLY_LEN 16 + +#define OF_ACTION_ENQUEUE_LEN 16 + +#define OF_QUEUE_STATS_REQUEST_LEN 8 + +#define OF_QUEUE_STATS_LEN 32 #endif /* openflow/openflow.h */ diff --git a/print-openflow-1.0.c b/print-openflow-1.0.c index 3ce7f89b..08739f09 100644 --- a/print-openflow-1.0.c +++ b/print-openflow-1.0.c @@ -46,6 +46,7 @@ #include "addrtoname.h" #include "ethertype.h" #include "ipproto.h" +#include "openflow.h" #include "openflow-1.0.h" static const struct tok ofpt_str[] = { @@ -438,7 +439,7 @@ of10_phy_ports_print(const u_char *cp, const u_char *ep, u_int len) { const u_int len0 = len; while (len) { - if (len < sizeof(struct ofp_phy_port)) + if (len < OF_PHY_PORT_LEN) goto corrupt; /* port_no */ TCHECK2(*cp, 2); @@ -491,7 +492,7 @@ of10_phy_ports_print(const u_char *cp, const u_char *ep, u_int len) { of10_bitmap_print(ofppf_bm, EXTRACT_32BITS(cp), OFPPF_U); cp += 4; next_port: - len -= sizeof(struct ofp_phy_port); + len -= OF_PHY_PORT_LEN; } /* while */ return cp; @@ -514,7 +515,7 @@ of10_queue_props_print(const u_char *cp, const u_char *ep, u_int len) { while (len) { u_char plen_bogus = 0, skip = 0; - if (len < sizeof(struct ofp_queue_prop_header)) + if (len < OF_QUEUE_PROP_HEADER_LEN) goto corrupt; /* property */ TCHECK2(*cp, 2); @@ -526,7 +527,7 @@ of10_queue_props_print(const u_char *cp, const u_char *ep, u_int len) { plen = EXTRACT_16BITS(cp); cp += 2; printf(", len %u", plen); - if (plen < sizeof(struct ofp_queue_prop_header) || plen > len) + if (plen < OF_QUEUE_PROP_HEADER_LEN || plen > len) goto corrupt; /* pad */ TCHECK2(*cp, 4); @@ -534,10 +535,10 @@ of10_queue_props_print(const u_char *cp, const u_char *ep, u_int len) { /* property-specific constraints and decoding */ switch (property) { case OFPQT_NONE: - plen_bogus = plen != sizeof(struct ofp_queue_prop_header); + plen_bogus = plen != OF_QUEUE_PROP_HEADER_LEN; break; case OFPQT_MIN_RATE: - plen_bogus = plen != sizeof(struct ofp_queue_prop_min_rate); + plen_bogus = plen != OF_QUEUE_PROP_MIN_RATE_LEN; break; default: skip = 1; @@ -586,7 +587,7 @@ of10_queues_print(const u_char *cp, const u_char *ep, u_int len) { uint16_t desclen; while (len) { - if (len < sizeof(struct ofp_packet_queue)) + if (len < OF_PACKET_QUEUE_LEN) goto corrupt; /* queue_id */ TCHECK2(*cp, 4); @@ -597,18 +598,18 @@ of10_queues_print(const u_char *cp, const u_char *ep, u_int len) { desclen = EXTRACT_16BITS(cp); cp += 2; printf(", len %u", desclen); - if (desclen < sizeof(struct ofp_packet_queue) || desclen > len) + if (desclen < OF_PACKET_QUEUE_LEN || desclen > len) goto corrupt; /* pad */ TCHECK2(*cp, 2); cp += 2; /* properties */ if (vflag < 2) { - TCHECK2(*cp, desclen - sizeof(struct ofp_packet_queue)); - cp += desclen - sizeof(struct ofp_packet_queue); + TCHECK2(*cp, desclen - OF_PACKET_QUEUE_LEN); + cp += desclen - OF_PACKET_QUEUE_LEN; goto next_queue; } - if (ep == (cp = of10_queue_props_print(cp, ep, desclen - sizeof(struct ofp_packet_queue)))) + if (ep == (cp = of10_queue_props_print(cp, ep, desclen - OF_PACKET_QUEUE_LEN))) return ep; /* end of snapshot */ next_queue: len -= desclen; @@ -737,7 +738,7 @@ of10_actions_print(const char *pfx, const u_char *cp, const u_char *ep, while (len) { u_char alen_bogus = 0, skip = 0; - if (len < sizeof(struct ofp_action_header)) + if (len < OF_ACTION_HEADER_LEN) goto corrupt; /* type */ TCHECK2(*cp, 2); @@ -750,7 +751,7 @@ of10_actions_print(const char *pfx, const u_char *cp, const u_char *ep, cp += 2; printf(", len %u", alen); /* On action size underrun/overrun skip the rest of the action list. */ - if (alen < sizeof(struct ofp_action_header) || alen > len) + if (alen < OF_ACTION_HEADER_LEN || alen > len) goto corrupt; /* On action size inappropriate for the given type or invalid type just skip * the current action, as the basic length constraint has been met. */ @@ -920,7 +921,7 @@ of10_features_reply_print(const u_char *cp, const u_char *ep, const u_int len) { of10_bitmap_print(ofpat_bm, EXTRACT_32BITS(cp), OFPAT_U); cp += 4; /* ports */ - return of10_phy_ports_print(cp, ep, len - sizeof(struct ofp_switch_features)); + return of10_phy_ports_print(cp, ep, len - OF_SWITCH_FEATURES_LEN); trunc: printf(" [|openflow]"); @@ -976,7 +977,7 @@ of10_flow_mod_print(const u_char *cp, const u_char *ep, const u_int len) { of10_bitmap_print(ofpff_bm, EXTRACT_16BITS(cp), OFPFF_U); cp += 2; /* actions */ - return of10_actions_print("\n\t ", cp, ep, len - sizeof(struct ofp_flow_mod)); + return of10_actions_print("\n\t ", cp, ep, len - OF_FLOW_MOD_LEN); trunc: printf(" [|openflow]"); @@ -1037,7 +1038,7 @@ of10_stats_request_print(const u_char *cp, const u_char *ep, u_int len) { printf(" (bogus)"); cp += 2; /* type-specific body of one of fixed lengths */ - len -= sizeof(struct ofp_stats_request); + len -= OF_STATS_REQUEST_LEN; switch(type) { case OFPST_DESC: case OFPST_TABLE: @@ -1046,7 +1047,7 @@ of10_stats_request_print(const u_char *cp, const u_char *ep, u_int len) { return cp; case OFPST_FLOW: case OFPST_AGGREGATE: - if (len != sizeof(struct ofp_flow_stats_request)) + if (len != OF_FLOW_STATS_REQUEST_LEN) goto corrupt; /* match */ if (ep == (cp = of10_match_print("\n\t ", cp, ep))) @@ -1063,7 +1064,7 @@ of10_stats_request_print(const u_char *cp, const u_char *ep, u_int len) { printf(", out_port %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp))); return cp + 2; case OFPST_PORT: - if (len != sizeof(struct ofp_port_stats_request)) + if (len != OF_PORT_STATS_REQUEST_LEN) goto corrupt; /* port_no */ TCHECK2(*cp, 2); @@ -1073,7 +1074,7 @@ of10_stats_request_print(const u_char *cp, const u_char *ep, u_int len) { TCHECK2(*cp, 6); return cp + 6; case OFPST_QUEUE: - if (len != sizeof(struct ofp_queue_stats_request)) + if (len != OF_QUEUE_STATS_REQUEST_LEN) goto corrupt; /* port_no */ TCHECK2(*cp, 2); @@ -1103,7 +1104,7 @@ trunc: /* ibid */ static const u_char * of10_desc_stats_reply_print(const u_char *cp, const u_char *ep, const u_int len) { - if (len != sizeof(struct ofp_desc_stats)) + if (len != OF_DESC_STATS_LEN) goto corrupt; /* mfr_desc */ TCHECK2(*cp, DESC_STR_LEN); @@ -1153,13 +1154,13 @@ of10_flow_stats_reply_print(const u_char *cp, const u_char *ep, u_int len) { uint16_t entry_len; while (len) { - if (len < sizeof(struct ofp_flow_stats)) + if (len < OF_FLOW_STATS_LEN) goto corrupt; /* length */ TCHECK2(*cp, 2); entry_len = EXTRACT_16BITS(cp); printf("\n\t length %u", entry_len); - if (entry_len < sizeof(struct ofp_flow_stats) || entry_len > len) + if (entry_len < OF_FLOW_STATS_LEN || entry_len > len) goto corrupt; cp += 2; /* table_id */ @@ -1208,7 +1209,7 @@ of10_flow_stats_reply_print(const u_char *cp, const u_char *ep, u_int len) { printf(", byte_count %" PRIu64, EXTRACT_64BITS(cp)); cp += 8; /* actions */ - if (ep == (cp = of10_actions_print("\n\t ", cp, ep, entry_len - sizeof(struct ofp_flow_stats)))) + if (ep == (cp = of10_actions_print("\n\t ", cp, ep, entry_len - OF_FLOW_STATS_LEN))) return ep; /* end of snapshot */ len -= entry_len; @@ -1228,7 +1229,7 @@ trunc: static const u_char * of10_aggregate_stats_reply_print(const u_char *cp, const u_char *ep, const u_int len) { - if (len != sizeof(struct ofp_aggregate_stats_reply)) + if (len != OF_AGGREGATE_STATS_REPLY_LEN) goto corrupt; /* packet_count */ TCHECK2(*cp, 8); @@ -1262,7 +1263,7 @@ of10_table_stats_reply_print(const u_char *cp, const u_char *ep, u_int len) { const u_int len0 = len; while (len) { - if (len < sizeof(struct ofp_table_stats)) + if (len < OF_TABLE_STATS_LEN) goto corrupt; /* table_id */ TCHECK2(*cp, 1); @@ -1299,7 +1300,7 @@ of10_table_stats_reply_print(const u_char *cp, const u_char *ep, u_int len) { printf(", matched_count %" PRIu64, EXTRACT_64BITS(cp)); cp += 8; - len -= sizeof(struct ofp_table_stats); + len -= OF_TABLE_STATS_LEN; } /* while */ return cp; @@ -1319,15 +1320,15 @@ of10_port_stats_reply_print(const u_char *cp, const u_char *ep, u_int len) { const u_int len0 = len; while (len) { - if (len < sizeof(struct ofp_port_stats)) + if (len < OF_PORT_STATS_LEN) goto corrupt; /* port_no */ TCHECK2(*cp, 2); printf("\n\t port_no %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp))); cp += 2; if (vflag < 2) { - TCHECK2(*cp, sizeof(struct ofp_port_stats) - 2); - cp += sizeof(struct ofp_port_stats) - 2; + TCHECK2(*cp, OF_PORT_STATS_LEN - 2); + cp += OF_PORT_STATS_LEN - 2; goto next_port; } /* pad */ @@ -1382,7 +1383,7 @@ of10_port_stats_reply_print(const u_char *cp, const u_char *ep, u_int len) { printf(", collisions %" PRIu64, EXTRACT_64BITS(cp)); cp += 8; next_port: - len -= sizeof(struct ofp_port_stats); + len -= OF_PORT_STATS_LEN; } /* while */ return cp; @@ -1402,7 +1403,7 @@ of10_queue_stats_reply_print(const u_char *cp, const u_char *ep, u_int len) { const u_int len0 = len; while (len) { - if (len < sizeof(struct ofp_queue_stats)) + if (len < OF_QUEUE_STATS_LEN) goto corrupt; /* port_no */ TCHECK2(*cp, 2); @@ -1428,7 +1429,7 @@ of10_queue_stats_reply_print(const u_char *cp, const u_char *ep, u_int len) { printf(", tx_errors %" PRIu64, EXTRACT_64BITS(cp)); cp += 8; - len -= sizeof(struct ofp_queue_stats); + len -= OF_QUEUE_STATS_LEN; } /* while */ return cp; @@ -1469,7 +1470,7 @@ of10_stats_reply_print(const u_char *cp, const u_char *ep, const u_int len) { type == OFPST_VENDOR ? of10_vendor_data_print : NULL; if (decoder != NULL) - return decoder(cp, ep, len - sizeof(struct ofp_stats_reply)); + return decoder(cp, ep, len - OF_STATS_REPLY_LEN); } TCHECK2(*cp0, len); return cp0 + len; @@ -1498,13 +1499,13 @@ of10_packet_out_print(const u_char *cp, const u_char *ep, const u_int len) { TCHECK2(*cp, 2); actions_len = EXTRACT_16BITS(cp); cp += 2; - if (actions_len > len - sizeof(struct ofp_packet_out)) + if (actions_len > len - OF_PACKET_OUT_LEN) goto corrupt; /* actions */ if (ep == (cp = of10_actions_print("\n\t ", cp, ep, actions_len))) return ep; /* end of snapshot */ /* data */ - return of10_data_print(cp, ep, len - sizeof(struct ofp_packet_out) - actions_len); + return of10_data_print(cp, ep, len - OF_PACKET_OUT_LEN - actions_len); corrupt: /* skip the rest of the message body */ printf(" (corrupt)"); @@ -1538,8 +1539,8 @@ of10_packet_in_print(const u_char *cp, const u_char *ep, const u_int len) { TCHECK2(*cp, 1); cp += 1; /* data */ - /* 2 mock octets count in sizeof() but not in len */ - return of10_data_print(cp, ep, len - (sizeof(struct ofp_packet_in) - 2)); + /* 2 mock octets count in OF_PACKET_IN_LEN but not in len */ + return of10_data_print(cp, ep, len - (OF_PACKET_IN_LEN - 2)); trunc: printf(" [|openflow]"); @@ -1622,7 +1623,7 @@ of10_error_print(const u_char *cp, const u_char *ep, const u_int len) { printf(", code %s", tok2str(code_str, "invalid (0x%04x)", EXTRACT_16BITS(cp))); cp += 2; /* data */ - return of10_data_print(cp, ep, len - sizeof(struct ofp_error_msg)); + return of10_data_print(cp, ep, len - OF_ERROR_MSG_LEN); trunc: printf(" [|openflow]"); @@ -1650,14 +1651,14 @@ of10_header_body_print(const u_char *cp, const u_char *ep, const uint8_t type, case OFPT_GET_CONFIG_REQUEST: /* [OF10] Section 5.3.2 */ case OFPT_BARRIER_REQUEST: /* [OF10] Section 5.3.7 */ case OFPT_BARRIER_REPLY: /* ibid */ - if (len != sizeof(struct ofp_header)) + if (len != OF_HEADER_LEN) goto corrupt; break; /* OpenFlow header and fixed-size message body. */ case OFPT_SET_CONFIG: /* [OF10] Section 5.3.2 */ case OFPT_GET_CONFIG_REPLY: /* ibid */ - if (len != sizeof(struct ofp_switch_config)) + if (len != OF_SWITCH_CONFIG_LEN) goto corrupt; if (vflag < 1) goto next_message; @@ -1670,13 +1671,13 @@ of10_header_body_print(const u_char *cp, const u_char *ep, const uint8_t type, printf(", miss_send_len %u", EXTRACT_16BITS(cp)); return cp + 2; case OFPT_PORT_MOD: - if (len != sizeof(struct ofp_port_mod)) + if (len != OF_PORT_MOD_LEN) goto corrupt; if (vflag < 1) goto next_message; return of10_port_mod_print(cp, ep); case OFPT_QUEUE_GET_CONFIG_REQUEST: /* [OF10] Section 5.3.4 */ - if (len != sizeof(struct ofp_queue_get_config_request)) + if (len != OF_QUEUE_GET_CONFIG_REQUEST_LEN) goto corrupt; if (vflag < 1) goto next_message; @@ -1688,13 +1689,13 @@ of10_header_body_print(const u_char *cp, const u_char *ep, const uint8_t type, TCHECK2(*cp, 2); return cp + 2; case OFPT_FLOW_REMOVED: - if (len != sizeof(struct ofp_flow_removed)) + if (len != OF_FLOW_REMOVED_LEN) goto corrupt; if (vflag < 1) goto next_message; return of10_flow_removed_print(cp, ep); case OFPT_PORT_STATUS: /* [OF10] Section 5.4.3 */ - if (len != sizeof(struct ofp_port_status)) + if (len != OF_PORT_STATUS_LEN) goto corrupt; if (vflag < 1) goto next_message; @@ -1706,11 +1707,11 @@ of10_header_body_print(const u_char *cp, const u_char *ep, const uint8_t type, TCHECK2(*cp, 7); cp += 7; /* desc */ - return of10_phy_ports_print(cp, ep, sizeof(struct ofp_phy_port)); + return of10_phy_ports_print(cp, ep, OF_PHY_PORT_LEN); /* OpenFlow header, fixed-size message body and n * fixed-size data units. */ case OFPT_FEATURES_REPLY: - if (len < sizeof(struct ofp_switch_features)) + if (len < OF_SWITCH_FEATURES_LEN) goto corrupt; if (vflag < 1) goto next_message; @@ -1722,25 +1723,25 @@ of10_header_body_print(const u_char *cp, const u_char *ep, const uint8_t type, case OFPT_ECHO_REPLY: /* [OF10] Section 5.5.3 */ if (vflag < 1) goto next_message; - return of10_data_print(cp, ep, len - sizeof(struct ofp_header)); + return of10_data_print(cp, ep, len - OF_HEADER_LEN); /* OpenFlow header, fixed-size message body and variable-size data. */ case OFPT_ERROR: - if (len < sizeof(struct ofp_error_msg)) + if (len < OF_ERROR_MSG_LEN) goto corrupt; if (vflag < 1) goto next_message; return of10_error_print(cp, ep, len); case OFPT_VENDOR: /* [OF10] Section 5.5.4 */ - if (len < sizeof(struct ofp_vendor_header)) + if (len < OF_VENDOR_HEADER_LEN) goto corrupt; if (vflag < 1) goto next_message; - return of10_vendor_data_print(cp, ep, len - sizeof(struct ofp_header)); + return of10_vendor_data_print(cp, ep, len - OF_HEADER_LEN); case OFPT_PACKET_IN: - /* 2 mock octets count in sizeof() but not in len */ - if (len < sizeof(struct ofp_packet_in) - 2) + /* 2 mock octets count in OF_PACKET_IN_LEN but not in len */ + if (len < OF_PACKET_IN_LEN - 2) goto corrupt; if (vflag < 1) goto next_message; @@ -1750,7 +1751,7 @@ of10_header_body_print(const u_char *cp, const u_char *ep, const uint8_t type, /* b. OpenFlow header and one of the fixed-size message bodies. */ /* c. OpenFlow header, fixed-size message body and variable-size data. */ case OFPT_STATS_REQUEST: - if (len < sizeof(struct ofp_stats_request)) + if (len < OF_STATS_REQUEST_LEN) goto corrupt; if (vflag < 1) goto next_message; @@ -1761,7 +1762,7 @@ of10_header_body_print(const u_char *cp, const u_char *ep, const uint8_t type, /* c. OpenFlow header and n * variable-size data units. */ /* d. OpenFlow header, fixed-size message body and variable-size data. */ case OFPT_STATS_REPLY: - if (len < sizeof(struct ofp_stats_reply)) + if (len < OF_STATS_REPLY_LEN) goto corrupt; if (vflag < 1) goto next_message; @@ -1769,7 +1770,7 @@ of10_header_body_print(const u_char *cp, const u_char *ep, const uint8_t type, /* OpenFlow header and n * variable-size data units and variable-size data. */ case OFPT_PACKET_OUT: - if (len < sizeof(struct ofp_packet_out)) + if (len < OF_PACKET_OUT_LEN) goto corrupt; if (vflag < 1) goto next_message; @@ -1777,7 +1778,7 @@ of10_header_body_print(const u_char *cp, const u_char *ep, const uint8_t type, /* OpenFlow header, fixed-size message body and n * variable-size data units. */ case OFPT_FLOW_MOD: - if (len < sizeof(struct ofp_flow_mod)) + if (len < OF_FLOW_MOD_LEN) goto corrupt; if (vflag < 1) goto next_message; @@ -1785,7 +1786,7 @@ of10_header_body_print(const u_char *cp, const u_char *ep, const uint8_t type, /* OpenFlow header, fixed-size message body and n * variable-size data units. */ case OFPT_QUEUE_GET_CONFIG_REPLY: /* [OF10] Section 5.3.4 */ - if (len < sizeof(struct ofp_queue_get_config_reply)) + if (len < OF_QUEUE_GET_CONFIG_REPLY_LEN) goto corrupt; if (vflag < 1) goto next_message; @@ -1797,15 +1798,15 @@ of10_header_body_print(const u_char *cp, const u_char *ep, const uint8_t type, TCHECK2(*cp, 6); cp += 6; /* queues */ - return of10_queues_print(cp, ep, len - sizeof(struct ofp_queue_get_config_reply)); + return of10_queues_print(cp, ep, len - OF_QUEUE_GET_CONFIG_REPLY_LEN); } /* switch (type) */ goto next_message; corrupt: /* skip the message body */ printf(" (corrupt)"); next_message: - TCHECK2(*cp0, len0 - sizeof(struct ofp_header)); - return cp0 + len0 - sizeof(struct ofp_header); + TCHECK2(*cp0, len0 - OF_HEADER_LEN); + return cp0 + len0 - OF_HEADER_LEN; trunc: printf(" [|openflow]"); return ep; diff --git a/print-openflow.c b/print-openflow.c index 2a702dd0..5dbefac0 100644 --- a/print-openflow.c +++ b/print-openflow.c @@ -38,8 +38,8 @@ #include "interface.h" #include "extract.h" +#include "openflow.h" -#define OF_HEADER_LEN 8 #define OF_VER_1_0 0x01 static void