]> The Tcpdump Group git mirrors - tcpdump/commitdiff
Merge pull request #324 from lykkja/geonet_and_calmfast
authorMichael Richardson <[email protected]>
Tue, 2 Jul 2013 19:41:24 +0000 (12:41 -0700)
committerMichael Richardson <[email protected]>
Tue, 2 Jul 2013 19:41:24 +0000 (12:41 -0700)
Geonet and calmfast

Makefile.in
config.h.in
configure
configure.in
interface.h
openflow-1.0.h [deleted file]
openflow.h [new file with mode: 0644]
print-openflow-1.0.c
print-openflow.c

index f805bf684604978c0945eeecdc92d49ec31926a7..85824b901edaaeda8e377ee705cb2610714f20a8 100644 (file)
@@ -167,7 +167,7 @@ HDR = \
        nlpid.h \
        ntp.h \
        oakley.h \
-       openflow-1.0.h \
+       openflow.h \
        ospf.h \
        ospf6.h \
        oui.h \
index 3a2da984944eb547681b58b42a8177a07368f993..6eba6072438651298c1d2f4453dd69be939ba187 100644 (file)
 /* define on AIX to get certain functions */
 #undef _SUN
 
+/* Define for Solaris 2.5.1 so the uint32_t typedef from <sys/synch.h>,
+   <pthread.h>, or <semaphore.h> 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 <sys/synch.h>,
+   <pthread.h>, or <semaphore.h> 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 <sys/synch.h>,
+   <pthread.h>, or <semaphore.h> 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
 
 /* 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. */
 
 /* 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
index a56eb7b073095a3ed0f1140bab363ac82ba1cd8f..db4774719375bda46bb94fc0420cc0d7d2fe4f7c 100755 (executable)
--- 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 <sys/bitypes.h>
-#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 <sys/bitypes.h>
-#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 <sys/bitypes.h>
-#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 <sys/bitypes.h>
-#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 <sys/bitypes.h>
 #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 <sys/bitypes.h>
 #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 <sys/bitypes.h>
 #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 <inttypes.h> - some systems have one that
-# doesn't define all the PRI[doxu]64 macros.
+# Check for <inttypes.h>
 #
 
 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; }
index 138828e6182fb7878993339779cc9dfb937f6d08..4c8059b88578aef6e42c62aa9f829a90aa3b4639 100644 (file)
@@ -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 <sys/bitypes.h>
-#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 <sys/bitypes.h>
 #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 <sys/bitypes.h>
-#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 <sys/bitypes.h>
 #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 <sys/bitypes.h>
-#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 <sys/bitypes.h>
 #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 <sys/bitypes.h>
-#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 <inttypes.h> - some systems have one that
-# doesn't define all the PRI[doxu]64 macros.
+# Check for <inttypes.h>
 #
 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(
index fa9d290582e4ae73d1ff59fd4ebfa06023f1db68..9367691997b46909b71de8f10b3a506c7dcd4488 100644 (file)
@@ -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
deleted file mode 100644 (file)
index c0b5090..0000000
+++ /dev/null
@@ -1,970 +0,0 @@
-/* Copyright (c) 2008 The Board of Trustees of The Leland Stanford
- * Junior University
- *
- * We are making the OpenFlow specification and associated documentation
- * (Software) available for public use and benefit with the expectation
- * that others will use, modify and enhance the Software and contribute
- * those enhancements back to the community. However, since we would
- * like to make the Software available for broadest use, with as few
- * restrictions as possible permission is hereby granted, free of
- * charge, to any person obtaining a copy of this Software to deal in
- * the Software under the copyrights without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- * The name and trademarks of copyright holder(s) may NOT be used in
- * advertising or publicity pertaining to the Software or any
- * derivatives without specific, written prior permission.
- */
-
-/* OpenFlow: protocol between controller and datapath. */
-
-#ifndef OPENFLOW_OPENFLOW_H
-#define OPENFLOW_OPENFLOW_H 1
-
-#ifdef __KERNEL__
-#include <linux/types.h>
-#else
-#include <stdint.h>
-#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
- */
-/* The most significant bit being set in the version field indicates an
- * experimental OpenFlow version.
- */
-#define OFP_VERSION   0x01
-
-#define OFP_MAX_TABLE_NAME_LEN 32
-#define OFP_MAX_PORT_NAME_LEN  16
-
-#define OFP_TCP_PORT  6633
-#define OFP_SSL_PORT  6633
-
-#define OFP_ETH_ALEN 6          /* Bytes in an Ethernet address. */
-
-/* Port numbering.  Physical ports are numbered starting from 1. */
-enum ofp_port {
-    /* Maximum number of physical switch ports. */
-    OFPP_MAX = 0xff00,
-
-    /* Fake output "ports". */
-    OFPP_IN_PORT    = 0xfff8,  /* Send the packet out the input port.  This
-                                  virtual port must be explicitly used
-                                  in order to send back out of the input
-                                  port. */
-    OFPP_TABLE      = 0xfff9,  /* Perform actions in flow table.
-                                  NB: This can only be the destination
-                                  port for packet-out messages. */
-    OFPP_NORMAL     = 0xfffa,  /* Process with normal L2/L3 switching. */
-    OFPP_FLOOD      = 0xfffb,  /* All physical ports except input port and
-                                  those disabled by STP. */
-    OFPP_ALL        = 0xfffc,  /* All physical ports except input port. */
-    OFPP_CONTROLLER = 0xfffd,  /* Send to controller. */
-    OFPP_LOCAL      = 0xfffe,  /* Local openflow "port". */
-    OFPP_NONE       = 0xffff   /* Not associated with a physical port. */
-};
-
-enum ofp_type {
-    /* Immutable messages. */
-    OFPT_HELLO,               /* Symmetric message */
-    OFPT_ERROR,               /* Symmetric message */
-    OFPT_ECHO_REQUEST,        /* Symmetric message */
-    OFPT_ECHO_REPLY,          /* Symmetric message */
-    OFPT_VENDOR,              /* Symmetric message */
-
-    /* Switch configuration messages. */
-    OFPT_FEATURES_REQUEST,    /* Controller/switch message */
-    OFPT_FEATURES_REPLY,      /* Controller/switch message */
-    OFPT_GET_CONFIG_REQUEST,  /* Controller/switch message */
-    OFPT_GET_CONFIG_REPLY,    /* Controller/switch message */
-    OFPT_SET_CONFIG,          /* Controller/switch message */
-
-    /* Asynchronous messages. */
-    OFPT_PACKET_IN,           /* Async message */
-    OFPT_FLOW_REMOVED,        /* Async message */
-    OFPT_PORT_STATUS,         /* Async message */
-
-    /* Controller command messages. */
-    OFPT_PACKET_OUT,          /* Controller/switch message */
-    OFPT_FLOW_MOD,            /* Controller/switch message */
-    OFPT_PORT_MOD,            /* Controller/switch message */
-
-    /* Statistics messages. */
-    OFPT_STATS_REQUEST,       /* Controller/switch message */
-    OFPT_STATS_REPLY,         /* Controller/switch message */
-
-    /* Barrier messages. */
-    OFPT_BARRIER_REQUEST,     /* Controller/switch message */
-    OFPT_BARRIER_REPLY,       /* Controller/switch message */
-
-    /* Queue Configuration messages. */
-    OFPT_QUEUE_GET_CONFIG_REQUEST,  /* Controller/switch message */
-    OFPT_QUEUE_GET_CONFIG_REPLY     /* Controller/switch message */
-
-};
-
-/* 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
-
-enum ofp_config_flags {
-    /* Handling of IP fragments. */
-    OFPC_FRAG_NORMAL   = 0,  /* No special handling for fragments. */
-    OFPC_FRAG_DROP     = 1,  /* Drop fragments. */
-    OFPC_FRAG_REASM    = 2,  /* Reassemble (only if OFPC_IP_REASM set). */
-    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);
-
-/* Capabilities supported by the datapath. */
-enum ofp_capabilities {
-    OFPC_FLOW_STATS     = 1 << 0,  /* Flow statistics. */
-    OFPC_TABLE_STATS    = 1 << 1,  /* Table statistics. */
-    OFPC_PORT_STATS     = 1 << 2,  /* Port statistics. */
-    OFPC_STP            = 1 << 3,  /* 802.1d spanning tree. */
-    OFPC_RESERVED       = 1 << 4,  /* Reserved, must be zero. */
-    OFPC_IP_REASM       = 1 << 5,  /* Can reassemble IP fragments. */
-    OFPC_QUEUE_STATS    = 1 << 6,  /* Queue statistics. */
-    OFPC_ARP_MATCH_IP   = 1 << 7   /* Match IP addresses in ARP pkts. */
-};
-
-/* Flags to indicate behavior of the physical port.  These flags are
- * used in ofp_phy_port to describe the current configuration.  They are
- * used in the ofp_port_mod message to configure the port's behavior.
- */
-enum ofp_port_config {
-    OFPPC_PORT_DOWN    = 1 << 0,  /* Port is administratively down. */
-
-    OFPPC_NO_STP       = 1 << 1,  /* Disable 802.1D spanning tree on port. */
-    OFPPC_NO_RECV      = 1 << 2,  /* Drop all packets except 802.1D spanning
-                                     tree packets. */
-    OFPPC_NO_RECV_STP  = 1 << 3,  /* Drop received 802.1D STP packets. */
-    OFPPC_NO_FLOOD     = 1 << 4,  /* Do not include this port when flooding. */
-    OFPPC_NO_FWD       = 1 << 5,  /* Drop packets forwarded to port. */
-    OFPPC_NO_PACKET_IN = 1 << 6   /* Do not send packet-in msgs for port. */
-};
-
-/* Current state of the physical port.  These are not configurable from
- * the controller.
- */
-enum ofp_port_state {
-    OFPPS_LINK_DOWN   = 1 << 0, /* No physical link present. */
-
-    /* The OFPPS_STP_* bits have no effect on switch operation.  The
-     * controller must adjust OFPPC_NO_RECV, OFPPC_NO_FWD, and
-     * OFPPC_NO_PACKET_IN appropriately to fully implement an 802.1D spanning
-     * tree. */
-    OFPPS_STP_LISTEN  = 0 << 8, /* Not learning or relaying frames. */
-    OFPPS_STP_LEARN   = 1 << 8, /* Learning but not relaying frames. */
-    OFPPS_STP_FORWARD = 2 << 8, /* Learning and relaying frames. */
-    OFPPS_STP_BLOCK   = 3 << 8, /* Not part of spanning tree. */
-    OFPPS_STP_MASK    = 3 << 8  /* Bit mask for OFPPS_STP_* values. */
-};
-
-/* Features of physical ports available in a datapath. */
-enum ofp_port_features {
-    OFPPF_10MB_HD    = 1 << 0,  /* 10 Mb half-duplex rate support. */
-    OFPPF_10MB_FD    = 1 << 1,  /* 10 Mb full-duplex rate support. */
-    OFPPF_100MB_HD   = 1 << 2,  /* 100 Mb half-duplex rate support. */
-    OFPPF_100MB_FD   = 1 << 3,  /* 100 Mb full-duplex rate support. */
-    OFPPF_1GB_HD     = 1 << 4,  /* 1 Gb half-duplex rate support. */
-    OFPPF_1GB_FD     = 1 << 5,  /* 1 Gb full-duplex rate support. */
-    OFPPF_10GB_FD    = 1 << 6,  /* 10 Gb full-duplex rate support. */
-    OFPPF_COPPER     = 1 << 7,  /* Copper medium. */
-    OFPPF_FIBER      = 1 << 8,  /* Fiber medium. */
-    OFPPF_AUTONEG    = 1 << 9,  /* Auto-negotiation. */
-    OFPPF_PAUSE      = 1 << 10, /* Pause. */
-    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. */
-
-    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);
-
-/* What changed about the physical port */
-enum ofp_port_reason {
-    OFPPR_ADD,              /* The port was added. */
-    OFPPR_DELETE,           /* The port was removed. */
-    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);
-
-/* Why is this packet being sent to the controller? */
-enum ofp_packet_in_reason {
-    OFPR_NO_MATCH,          /* No matching flow. */
-    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);
-
-enum ofp_action_type {
-    OFPAT_OUTPUT,           /* Output to switch port. */
-    OFPAT_SET_VLAN_VID,     /* Set the 802.1q VLAN id. */
-    OFPAT_SET_VLAN_PCP,     /* Set the 802.1q priority. */
-    OFPAT_STRIP_VLAN,       /* Strip the 802.1q header. */
-    OFPAT_SET_DL_SRC,       /* Ethernet source address. */
-    OFPAT_SET_DL_DST,       /* Ethernet destination address. */
-    OFPAT_SET_NW_SRC,       /* IP source address. */
-    OFPAT_SET_NW_DST,       /* IP destination address. */
-    OFPAT_SET_NW_TOS,       /* IP ToS (DSCP field, 6 bits). */
-    OFPAT_SET_TP_SRC,       /* TCP/UDP source port. */
-    OFPAT_SET_TP_DST,       /* TCP/UDP destination port. */
-    OFPAT_ENQUEUE,          /* Output to queue.  */
-    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);
-
-/* 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);
-
-/* 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);
-
-enum ofp_flow_mod_command {
-    OFPFC_ADD,              /* New flow. */
-    OFPFC_MODIFY,           /* Modify all matching flows. */
-    OFPFC_MODIFY_STRICT,    /* Modify entry strictly matching wildcards */
-    OFPFC_DELETE,           /* Delete all matching flows. */
-    OFPFC_DELETE_STRICT    /* Strictly match wildcards and priority. */
-};
-
-/* Flow wildcards. */
-enum ofp_flow_wildcards {
-    OFPFW_IN_PORT  = 1 << 0,  /* Switch input port. */
-    OFPFW_DL_VLAN  = 1 << 1,  /* VLAN id. */
-    OFPFW_DL_SRC   = 1 << 2,  /* Ethernet source address. */
-    OFPFW_DL_DST   = 1 << 3,  /* Ethernet destination address. */
-    OFPFW_DL_TYPE  = 1 << 4,  /* Ethernet frame type. */
-    OFPFW_NW_PROTO = 1 << 5,  /* IP protocol. */
-    OFPFW_TP_SRC   = 1 << 6,  /* TCP/UDP source port. */
-    OFPFW_TP_DST   = 1 << 7,  /* TCP/UDP destination port. */
-
-    /* IP source address wildcard bit count.  0 is exact match, 1 ignores the
-     * LSB, 2 ignores the 2 least-significant bits, ..., 32 and higher wildcard
-     * the entire field.  This is the *opposite* of the usual convention where
-     * e.g. /24 indicates that 8 bits (not 24 bits) are wildcarded. */
-    OFPFW_NW_SRC_SHIFT = 8,
-    OFPFW_NW_SRC_BITS = 6,
-    OFPFW_NW_SRC_MASK = ((1 << OFPFW_NW_SRC_BITS) - 1) << OFPFW_NW_SRC_SHIFT,
-    OFPFW_NW_SRC_ALL = 32 << OFPFW_NW_SRC_SHIFT,
-
-    /* IP destination address wildcard bit count.  Same format as source. */
-    OFPFW_NW_DST_SHIFT = 14,
-    OFPFW_NW_DST_BITS = 6,
-    OFPFW_NW_DST_MASK = ((1 << OFPFW_NW_DST_BITS) - 1) << OFPFW_NW_DST_SHIFT,
-    OFPFW_NW_DST_ALL = 32 << OFPFW_NW_DST_SHIFT,
-
-    OFPFW_DL_VLAN_PCP = 1 << 20,  /* VLAN priority. */
-    OFPFW_NW_TOS = 1 << 21,  /* IP ToS (DSCP field, 6 bits). */
-
-    /* Wildcard all fields. */
-    OFPFW_ALL = ((1 << 22) - 1)
-};
-
-/* The wildcards for ICMP type and code fields use the transport source
- * and destination port fields, respectively. */
-#define OFPFW_ICMP_TYPE OFPFW_TP_SRC
-#define OFPFW_ICMP_CODE OFPFW_TP_DST
-
-/* Values below this cutoff are 802.3 packets and the two bytes
- * following MAC addresses are used as a frame length.  Otherwise, the
- * two bytes are used as the Ethernet type.
- */
-#define OFP_DL_TYPE_ETH2_CUTOFF   0x0600
-
-/* Value of dl_type to indicate that the frame does not include an
- * Ethernet type.
- */
-#define OFP_DL_TYPE_NOT_ETH_TYPE  0x05ff
-
-/* The VLAN id is 12-bits, so we can use the entire 16 bits to indicate
- * special conditions.  All ones indicates that no VLAN id was set.
- */
-#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);
-
-/* The match fields for ICMP type and code use the transport source and
- * destination port fields, respectively. */
-#define icmp_type tp_src
-#define icmp_code tp_dst
-
-/* Value used in "idle_timeout" and "hard_timeout" to indicate that the entry
- * is permanent. */
-#define OFP_FLOW_PERMANENT 0
-
-/* By default, choose a priority in the middle. */
-#define OFP_DEFAULT_PRIORITY 0x8000
-
-enum ofp_flow_mod_flags {
-    OFPFF_SEND_FLOW_REM = 1 << 0,  /* Send flow removed message when flow
-                                    * expires or is deleted. */
-    OFPFF_CHECK_OVERLAP = 1 << 1,  /* Check for overlapping entries first. */
-    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);
-
-/* Why was this flow removed? */
-enum ofp_flow_removed_reason {
-    OFPRR_IDLE_TIMEOUT,         /* Flow idle time exceeded idle_timeout. */
-    OFPRR_HARD_TIMEOUT,         /* Time exceeded hard_timeout. */
-    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);
-
-/* 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
- * be added). */
-enum ofp_error_type {
-    OFPET_HELLO_FAILED,         /* Hello protocol failed. */
-    OFPET_BAD_REQUEST,          /* Request was not understood. */
-    OFPET_BAD_ACTION,           /* Error in action description. */
-    OFPET_FLOW_MOD_FAILED,      /* Problem modifying flow entry. */
-    OFPET_PORT_MOD_FAILED,      /* Port mod request failed. */
-    OFPET_QUEUE_OP_FAILED       /* Queue operation failed. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_HELLO_FAILED.  'data' contains an
- * ASCII text string that may give failure details. */
-enum ofp_hello_failed_code {
-    OFPHFC_INCOMPATIBLE,        /* No compatible version. */
-    OFPHFC_EPERM                /* Permissions error. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_BAD_REQUEST.  'data' contains at least
- * the first 64 bytes of the failed request. */
-enum ofp_bad_request_code {
-    OFPBRC_BAD_VERSION,         /* ofp_header.version not supported. */
-    OFPBRC_BAD_TYPE,            /* ofp_header.type not supported. */
-    OFPBRC_BAD_STAT,            /* ofp_stats_request.type not supported. */
-    OFPBRC_BAD_VENDOR,          /* Vendor not supported (in ofp_vendor_header
-                                 * or ofp_stats_request or ofp_stats_reply). */
-    OFPBRC_BAD_SUBTYPE,         /* Vendor subtype not supported. */
-    OFPBRC_EPERM,               /* Permissions error. */
-    OFPBRC_BAD_LEN,             /* Wrong request length for type. */
-    OFPBRC_BUFFER_EMPTY,        /* Specified buffer has already been used. */
-    OFPBRC_BUFFER_UNKNOWN       /* Specified buffer does not exist. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_BAD_ACTION.  'data' contains at least
- * the first 64 bytes of the failed request. */
-enum ofp_bad_action_code {
-    OFPBAC_BAD_TYPE,           /* Unknown action type. */
-    OFPBAC_BAD_LEN,            /* Length problem in actions. */
-    OFPBAC_BAD_VENDOR,         /* Unknown vendor id specified. */
-    OFPBAC_BAD_VENDOR_TYPE,    /* Unknown action type for vendor id. */
-    OFPBAC_BAD_OUT_PORT,       /* Problem validating output action. */
-    OFPBAC_BAD_ARGUMENT,       /* Bad action argument. */
-    OFPBAC_EPERM,              /* Permissions error. */
-    OFPBAC_TOO_MANY,           /* Can't handle this many actions. */
-    OFPBAC_BAD_QUEUE           /* Problem validating output queue. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_FLOW_MOD_FAILED.  'data' contains
- * at least the first 64 bytes of the failed request. */
-enum ofp_flow_mod_failed_code {
-    OFPFMFC_ALL_TABLES_FULL,    /* Flow not added because of full tables. */
-    OFPFMFC_OVERLAP,            /* Attempted to add overlapping flow with
-                                 * CHECK_OVERLAP flag set. */
-    OFPFMFC_EPERM,              /* Permissions error. */
-    OFPFMFC_BAD_EMERG_TIMEOUT,  /* Flow not added because of non-zero idle/hard
-                                 * timeout. */
-    OFPFMFC_BAD_COMMAND,        /* Unknown command. */
-    OFPFMFC_UNSUPPORTED         /* Unsupported action list - cannot process in
-                                 * the order specified. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_PORT_MOD_FAILED.  'data' contains
- * at least the first 64 bytes of the failed request. */
-enum ofp_port_mod_failed_code {
-    OFPPMFC_BAD_PORT,            /* Specified port does not exist. */
-    OFPPMFC_BAD_HW_ADDR,         /* Specified hardware address is wrong. */
-};
-
-/* ofp_error msg 'code' values for OFPET_QUEUE_OP_FAILED. 'data' contains
- * at least the first 64 bytes of the failed request */
-enum ofp_queue_op_failed_code {
-    OFPQOFC_BAD_PORT,           /* Invalid port (or port does not exist). */
-    OFPQOFC_BAD_QUEUE,          /* Queue does not exist. */
-    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);
-
-enum ofp_stats_types {
-    /* Description of this OpenFlow switch.
-     * The request body is empty.
-     * The reply body is struct ofp_desc_stats. */
-    OFPST_DESC,
-
-    /* Individual flow statistics.
-     * The request body is struct ofp_flow_stats_request.
-     * The reply body is an array of struct ofp_flow_stats. */
-    OFPST_FLOW,
-
-    /* Aggregate flow statistics.
-     * The request body is struct ofp_aggregate_stats_request.
-     * The reply body is struct ofp_aggregate_stats_reply. */
-    OFPST_AGGREGATE,
-
-    /* Flow table statistics.
-     * The request body is empty.
-     * The reply body is an array of struct ofp_table_stats. */
-    OFPST_TABLE,
-
-    /* Physical port statistics.
-     * The request body is struct ofp_port_stats_request.
-     * The reply body is an array of struct ofp_port_stats. */
-    OFPST_PORT,
-
-    /* Queue statistics for a port
-     * The request body defines the port
-     * The reply body is an array of struct ofp_queue_stats */
-    OFPST_QUEUE,
-
-    /* Vendor extension.
-     * The request and reply bodies begin with a 32-bit vendor ID, which takes
-     * the same form as in "struct ofp_vendor_header".  The request and reply
-     * bodies are otherwise vendor-defined. */
-    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);
-
-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 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);
-
-/* All ones is used to indicate all queues in a port (for stats retrieval). */
-#define OFPQ_ALL      0xffffffff
-
-/* Min rate > 1000 means not configured. */
-#define OFPQ_MIN_RATE_UNCFG      0xffff
-
-enum ofp_queue_properties {
-    OFPQT_NONE = 0,       /* No property defined for queue (default). */
-    OFPQT_MIN_RATE,       /* Minimum datarate guaranteed. */
-                          /* Other types should be added here
-                           * (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);
-
-/* 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);
-
-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);
-
-#endif /* openflow/openflow.h */
diff --git a/openflow.h b/openflow.h
new file mode 100644 (file)
index 0000000..07ba685
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2013 The TCPDUMP project
+ * 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 COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "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
+ * COPYRIGHT HOLDER OR CONTRIBUTORS 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.
+ */
+
+/* OpenFlow: protocol between controller and datapath. */
+
+#define OF_HEADER_LEN 8
+
+/*
+ * Routines to print packets for various versions of OpenFlow.
+ */
+extern const u_char *of10_header_body_print(const u_char *, const u_char *,
+       const uint8_t, const uint16_t, const uint32_t);
index 3ce7f89b9eee64f1fc61e5e94c7eba23bdb792d6..f4bd977bfefa6c58552672f127202397e176fa6e 100644 (file)
 #include "addrtoname.h"
 #include "ethertype.h"
 #include "ipproto.h"
-#include "openflow-1.0.h"
-
+#include "openflow.h"
+
+#define OFPT_HELLO                    0x00
+#define OFPT_ERROR                    0x01
+#define OFPT_ECHO_REQUEST             0x02
+#define OFPT_ECHO_REPLY               0x03
+#define OFPT_VENDOR                   0x04
+#define OFPT_FEATURES_REQUEST         0x05
+#define OFPT_FEATURES_REPLY           0x06
+#define OFPT_GET_CONFIG_REQUEST       0x07
+#define OFPT_GET_CONFIG_REPLY         0x08
+#define OFPT_SET_CONFIG               0x09
+#define OFPT_PACKET_IN                0x0a
+#define OFPT_FLOW_REMOVED             0x0b
+#define OFPT_PORT_STATUS              0x0c
+#define OFPT_PACKET_OUT               0x0d
+#define OFPT_FLOW_MOD                 0x0e
+#define OFPT_PORT_MOD                 0x0f
+#define OFPT_STATS_REQUEST            0x10
+#define OFPT_STATS_REPLY              0x11
+#define OFPT_BARRIER_REQUEST          0x12
+#define OFPT_BARRIER_REPLY            0x13
+#define OFPT_QUEUE_GET_CONFIG_REQUEST 0x14
+#define OFPT_QUEUE_GET_CONFIG_REPLY   0x15
 static const struct tok ofpt_str[] = {
        { OFPT_HELLO,                    "HELLO"                    },
        { OFPT_ERROR,                    "ERROR"                    },
@@ -74,6 +96,13 @@ static const struct tok ofpt_str[] = {
        { 0, NULL }
 };
 
+#define OFPPC_PORT_DOWN    (1 << 0)
+#define OFPPC_NO_STP       (1 << 1)
+#define OFPPC_NO_RECV      (1 << 2)
+#define OFPPC_NO_RECV_STP  (1 << 3)
+#define OFPPC_NO_FLOOD     (1 << 4)
+#define OFPPC_NO_FWD       (1 << 5)
+#define OFPPC_NO_PACKET_IN (1 << 6)
 static const struct tok ofppc_bm[] = {
        { OFPPC_PORT_DOWN,    "PORT_DOWN"    },
        { OFPPC_NO_STP,       "NO_STP"       },
@@ -88,6 +117,12 @@ static const struct tok ofppc_bm[] = {
                    OFPPC_NO_RECV_STP | OFPPC_NO_FLOOD | OFPPC_NO_FWD | \
                    OFPPC_NO_PACKET_IN))
 
+#define OFPPS_LINK_DOWN   (1 << 0)
+#define OFPPS_STP_LISTEN  (0 << 8)
+#define OFPPS_STP_LEARN   (1 << 8)
+#define OFPPS_STP_FORWARD (2 << 8)
+#define OFPPS_STP_BLOCK   (3 << 8)
+#define OFPPS_STP_MASK    (3 << 8)
 static const struct tok ofpps_bm[] = {
        { OFPPS_LINK_DOWN,   "LINK_DOWN"   },
        { OFPPS_STP_LISTEN,  "STP_LISTEN"  },
@@ -99,6 +134,15 @@ static const struct tok ofpps_bm[] = {
 #define OFPPS_U (~(OFPPS_LINK_DOWN | OFPPS_STP_LISTEN | OFPPS_STP_LEARN | \
                    OFPPS_STP_FORWARD | OFPPS_STP_BLOCK))
 
+#define OFPP_MAX        0xff00
+#define OFPP_IN_PORT    0xfff8
+#define OFPP_TABLE      0xfff9
+#define OFPP_NORMAL     0xfffa
+#define OFPP_FLOOD      0xfffb
+#define OFPP_ALL        0xfffc
+#define OFPP_CONTROLLER 0xfffd
+#define OFPP_LOCAL      0xfffe
+#define OFPP_NONE       0xffff
 static const struct tok ofpp_str[] = {
        { OFPP_MAX,        "MAX"        },
        { OFPP_IN_PORT,    "IN_PORT"    },
@@ -112,6 +156,18 @@ static const struct tok ofpp_str[] = {
        { 0, NULL }
 };
 
+#define OFPPF_10MB_HD    (1 <<  0)
+#define OFPPF_10MB_FD    (1 <<  1)
+#define OFPPF_100MB_HD   (1 <<  2)
+#define OFPPF_100MB_FD   (1 <<  3)
+#define OFPPF_1GB_HD     (1 <<  4)
+#define OFPPF_1GB_FD     (1 <<  5)
+#define OFPPF_10GB_FD    (1 <<  6)
+#define OFPPF_COPPER     (1 <<  7)
+#define OFPPF_FIBER      (1 <<  8)
+#define OFPPF_AUTONEG    (1 <<  9)
+#define OFPPF_PAUSE      (1 << 10)
+#define OFPPF_PAUSE_ASYM (1 << 11)
 static const struct tok ofppf_bm[] = {
        { OFPPF_10MB_HD,    "10MB_HD"    },
        { OFPPF_10MB_FD,    "10MB_FD"    },
@@ -132,12 +188,31 @@ static const struct tok ofppf_bm[] = {
                    OFPPF_10GB_FD | OFPPF_COPPER | OFPPF_FIBER | \
                    OFPPF_AUTONEG | OFPPF_PAUSE | OFPPF_PAUSE_ASYM))
 
+#define OFPQT_NONE     0x0000
+#define OFPQT_MIN_RATE 0x0001
 static const struct tok ofpqt_str[] = {
        { OFPQT_NONE,     "NONE"     },
        { OFPQT_MIN_RATE, "MIN_RATE" },
        { 0, NULL }
 };
 
+#define OFPFW_IN_PORT      (1 << 0)
+#define OFPFW_DL_VLAN      (1 << 1)
+#define OFPFW_DL_SRC       (1 << 2)
+#define OFPFW_DL_DST       (1 << 3)
+#define OFPFW_DL_TYPE      (1 << 4)
+#define OFPFW_NW_PROTO     (1 << 5)
+#define OFPFW_TP_SRC       (1 << 6)
+#define OFPFW_TP_DST       (1 << 7)
+#define OFPFW_NW_SRC_SHIFT 8
+#define OFPFW_NW_SRC_BITS  6
+#define OFPFW_NW_SRC_MASK  (((1 << OFPFW_NW_SRC_BITS) - 1) << OFPFW_NW_SRC_SHIFT)
+#define OFPFW_NW_DST_SHIFT 14
+#define OFPFW_NW_DST_BITS  6
+#define OFPFW_NW_DST_MASK  (((1 << OFPFW_NW_DST_BITS) - 1) << OFPFW_NW_DST_SHIFT)
+#define OFPFW_DL_VLAN_PCP  (1 << 20)
+#define OFPFW_NW_TOS       (1 << 21)
+#define OFPFW_ALL          ((1 << 22) - 1)
 static const struct tok ofpfw_bm[] = {
        { OFPFW_IN_PORT,     "IN_PORT"     },
        { OFPFW_DL_VLAN,     "DL_VLAN"     },
@@ -157,6 +232,19 @@ static const struct tok ofpfw_bm[] = {
  * they are not reported as bogus in the decoding. */
 #define OFPFW_U (~(OFPFW_ALL))
 
+#define OFPAT_OUTPUT       0x0000
+#define OFPAT_SET_VLAN_VID 0x0001
+#define OFPAT_SET_VLAN_PCP 0x0002
+#define OFPAT_STRIP_VLAN   0x0003
+#define OFPAT_SET_DL_SRC   0x0004
+#define OFPAT_SET_DL_DST   0x0005
+#define OFPAT_SET_NW_SRC   0x0006
+#define OFPAT_SET_NW_DST   0x0007
+#define OFPAT_SET_NW_TOS   0x0008
+#define OFPAT_SET_TP_SRC   0x0009
+#define OFPAT_SET_TP_DST   0x000a
+#define OFPAT_ENQUEUE      0x000b
+#define OFPAT_VENDOR       0xffff
 static const struct tok ofpat_str[] = {
        { OFPAT_OUTPUT,       "OUTPUT"       },
        { OFPAT_SET_VLAN_VID, "SET_VLAN_VID" },
@@ -197,6 +285,14 @@ static const struct tok ofpat_bm[] = {
                    1 << OFPAT_SET_NW_TOS | 1 << OFPAT_SET_TP_SRC | \
                    1 << OFPAT_SET_TP_DST | 1 << OFPAT_ENQUEUE))
 
+#define OFPC_FLOW_STATS   (1 << 0)
+#define OFPC_TABLE_STATS  (1 << 1)
+#define OFPC_PORT_STATS   (1 << 2)
+#define OFPC_STP          (1 << 3)
+#define OFPC_RESERVED     (1 << 4)
+#define OFPC_IP_REASM     (1 << 5)
+#define OFPC_QUEUE_STATS  (1 << 6)
+#define OFPC_ARP_MATCH_IP (1 << 7)
 static const struct tok ofp_capabilities_bm[] = {
        { OFPC_FLOW_STATS,   "FLOW_STATS"   },
        { OFPC_TABLE_STATS,  "TABLE_STATS"  },
@@ -212,6 +308,10 @@ static const struct tok ofp_capabilities_bm[] = {
                     OFPC_STP | OFPC_IP_REASM | OFPC_QUEUE_STATS | \
                     OFPC_ARP_MATCH_IP))
 
+#define OFPC_FRAG_NORMAL 0x0000
+#define OFPC_FRAG_DROP   0x0001
+#define OFPC_FRAG_REASM  0x0002
+#define OFPC_FRAG_MASK   0x0003
 static const struct tok ofp_config_str[] = {
        { OFPC_FRAG_NORMAL, "FRAG_NORMAL" },
        { OFPC_FRAG_DROP,   "FRAG_DROP"   },
@@ -219,6 +319,11 @@ static const struct tok ofp_config_str[] = {
        { 0, NULL }
 };
 
+#define OFPFC_ADD           0x0000
+#define OFPFC_MODIFY        0x0001
+#define OFPFC_MODIFY_STRICT 0x0002
+#define OFPFC_DELETE        0x0003
+#define OFPFC_DELETE_STRICT 0x0004
 static const struct tok ofpfc_str[] = {
        { OFPFC_ADD,           "ADD"           },
        { OFPFC_MODIFY,        "MODIFY"        },
@@ -233,6 +338,9 @@ static const struct tok bufferid_str[] = {
        { 0, NULL }
 };
 
+#define OFPFF_SEND_FLOW_REM (1 << 0)
+#define OFPFF_CHECK_OVERLAP (1 << 1)
+#define OFPFF_EMERG         (1 << 2)
 static const struct tok ofpff_bm[] = {
        { OFPFF_SEND_FLOW_REM, "SEND_FLOW_REM" },
        { OFPFF_CHECK_OVERLAP, "CHECK_OVERLAP" },
@@ -241,6 +349,13 @@ static const struct tok ofpff_bm[] = {
 };
 #define OFPFF_U (~(OFPFF_SEND_FLOW_REM | OFPFF_CHECK_OVERLAP | OFPFF_EMERG))
 
+#define OFPST_DESC      0x0000
+#define OFPST_FLOW      0x0001
+#define OFPST_AGGREGATE 0x0002
+#define OFPST_TABLE     0x0003
+#define OFPST_PORT      0x0004
+#define OFPST_QUEUE     0x0005
+#define OFPST_VENDOR    0xffff
 static const struct tok ofpst_str[] = {
        { OFPST_DESC,      "DESC"      },
        { OFPST_FLOW,      "FLOW"      },
@@ -258,23 +373,30 @@ static const struct tok tableid_str[] = {
        { 0, NULL }
 };
 
+#define OFPQ_ALL      0xffffffff
 static const struct tok ofpq_str[] = {
        { OFPQ_ALL, "ALL" },
        { 0, NULL }
 };
 
+#define OFPSF_REPLY_MORE 0x0001
 static const struct tok ofpsf_reply_bm[] = {
        { OFPSF_REPLY_MORE, "MORE" },
        { 0, NULL }
 };
 #define OFPSF_REPLY_U (~(OFPSF_REPLY_MORE))
 
+#define OFPR_NO_MATCH 0x00
+#define OFPR_ACTION   0x01
 static const struct tok ofpr_str[] = {
        { OFPR_NO_MATCH, "NO_MATCH" },
        { OFPR_ACTION,   "ACTION"   },
        { 0, NULL }
 };
 
+#define OFPRR_IDLE_TIMEOUT 0x00
+#define OFPRR_HARD_TIMEOUT 0x01
+#define OFPRR_DELETE       0x02
 static const struct tok ofprr_str[] = {
        { OFPRR_IDLE_TIMEOUT, "IDLE_TIMEOUT" },
        { OFPRR_HARD_TIMEOUT, "HARD_TIMEOUT" },
@@ -282,6 +404,9 @@ static const struct tok ofprr_str[] = {
        { 0, NULL }
 };
 
+#define OFPPR_ADD    0x00
+#define OFPPR_DELETE 0x01
+#define OFPPR_MODIFY 0x02
 static const struct tok ofppr_str[] = {
        { OFPPR_ADD,    "ADD"    },
        { OFPPR_DELETE, "DELETE" },
@@ -289,6 +414,12 @@ static const struct tok ofppr_str[] = {
        { 0, NULL }
 };
 
+#define OFPET_HELLO_FAILED    0x0000
+#define OFPET_BAD_REQUEST     0x0001
+#define OFPET_BAD_ACTION      0x0002
+#define OFPET_FLOW_MOD_FAILED 0x0003
+#define OFPET_PORT_MOD_FAILED 0x0004
+#define OFPET_QUEUE_OP_FAILED 0x0005
 static const struct tok ofpet_str[] = {
        { OFPET_HELLO_FAILED,    "HELLO_FAILED"    },
        { OFPET_BAD_REQUEST,     "BAD_REQUEST"     },
@@ -299,12 +430,23 @@ static const struct tok ofpet_str[] = {
        { 0, NULL }
 };
 
+#define OFPHFC_INCOMPATIBLE 0x0000
+#define OFPHFC_EPERM        0x0001
 static const struct tok ofphfc_str[] = {
        { OFPHFC_INCOMPATIBLE, "INCOMPATIBLE" },
        { OFPHFC_EPERM,        "EPERM"        },
        { 0, NULL }
 };
 
+#define OFPBRC_BAD_VERSION    0x0000
+#define OFPBRC_BAD_TYPE       0x0001
+#define OFPBRC_BAD_STAT       0x0002
+#define OFPBRC_BAD_VENDOR     0x0003
+#define OFPBRC_BAD_SUBTYPE    0x0004
+#define OFPBRC_EPERM          0x0005
+#define OFPBRC_BAD_LEN        0x0006
+#define OFPBRC_BUFFER_EMPTY   0x0007
+#define OFPBRC_BUFFER_UNKNOWN 0x0008
 static const struct tok ofpbrc_str[] = {
        { OFPBRC_BAD_VERSION,    "BAD_VERSION"    },
        { OFPBRC_BAD_TYPE,       "BAD_TYPE"       },
@@ -318,6 +460,15 @@ static const struct tok ofpbrc_str[] = {
        { 0, NULL }
 };
 
+#define OFPBAC_BAD_TYPE        0x0000
+#define OFPBAC_BAD_LEN         0x0001
+#define OFPBAC_BAD_VENDOR      0x0002
+#define OFPBAC_BAD_VENDOR_TYPE 0x0003
+#define OFPBAC_BAD_OUT_PORT    0x0004
+#define OFPBAC_BAD_ARGUMENT    0x0005
+#define OFPBAC_EPERM           0x0006
+#define OFPBAC_TOO_MANY        0x0007
+#define OFPBAC_BAD_QUEUE       0x0008
 static const struct tok ofpbac_str[] = {
        { OFPBAC_BAD_TYPE,        "BAD_TYPE"        },
        { OFPBAC_BAD_LEN,         "BAD_LEN"         },
@@ -331,6 +482,12 @@ static const struct tok ofpbac_str[] = {
        { 0, NULL }
 };
 
+#define OFPFMFC_ALL_TABLES_FULL   0x0000
+#define OFPFMFC_OVERLAP           0x0001
+#define OFPFMFC_EPERM             0x0002
+#define OFPFMFC_BAD_EMERG_TIMEOUT 0x0003
+#define OFPFMFC_BAD_COMMAND       0x0004
+#define OFPFMFC_UNSUPPORTED       0x0005
 static const struct tok ofpfmfc_str[] = {
        { OFPFMFC_ALL_TABLES_FULL,   "ALL_TABLES_FULL"   },
        { OFPFMFC_OVERLAP,           "OVERLAP"           },
@@ -341,12 +498,17 @@ static const struct tok ofpfmfc_str[] = {
        { 0, NULL }
 };
 
+#define OFPPMFC_BAD_PORT    0x0000
+#define OFPPMFC_BAD_HW_ADDR 0x0001
 static const struct tok ofppmfc_str[] = {
        { OFPPMFC_BAD_PORT,    "BAD_PORT"    },
        { OFPPMFC_BAD_HW_ADDR, "BAD_HW_ADDR" },
        { 0, NULL }
 };
 
+#define OFPQOFC_BAD_PORT  0x0000
+#define OFPQOFC_BAD_QUEUE 0x0001
+#define OFPQOFC_EPERM     0x0002
 static const struct tok ofpqofc_str[] = {
        { OFPQOFC_BAD_PORT,  "BAD_PORT"  },
        { OFPQOFC_BAD_QUEUE, "BAD_QUEUE" },
@@ -358,6 +520,54 @@ static const struct tok empty_str[] = {
        { 0, NULL }
 };
 
+/* lengths (fixed or minimal) of particular protocol structures */
+#define OF_SWITCH_CONFIG_LEN              12
+#define OF_PHY_PORT_LEN                   48
+#define OF_SWITCH_FEATURES_LEN            32
+#define OF_PORT_STATUS_LEN                64
+#define OF_PORT_MOD_LEN                   32
+#define OF_PACKET_IN_LEN                  20
+#define OF_ACTION_OUTPUT_LEN               8
+#define OF_ACTION_VLAN_VID_LEN             8
+#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
+#define OF_MATCH_LEN                      40
+#define OF_FLOW_MOD_LEN                   72
+#define OF_FLOW_REMOVED_LEN               88
+#define OF_ERROR_MSG_LEN                  12
+#define OF_STATS_REQUEST_LEN              12
+#define OF_STATS_REPLY_LEN                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
+#define OF_QUEUE_PROP_HEADER_LEN           8
+#define OF_QUEUE_PROP_MIN_RATE_LEN        16
+#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
+
+/* miscellaneous constants from [OF10] */
+#define OFP_MAX_TABLE_NAME_LEN     32
+#define OFP_MAX_PORT_NAME_LEN      16
+#define DESC_STR_LEN              256
+#define SERIAL_NUM_LEN             32
+#define OFP_ETH_ALEN                6
+#define OFP_VLAN_NONE          0xffff
 
 static const char *
 vlan_str(const uint16_t vid) {
@@ -438,7 +648,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 +701,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 +724,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 +736,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 +744,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 +796,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 +807,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 +947,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 +960,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 +1130,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 +1186,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 +1247,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 +1256,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 +1273,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 +1283,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 +1313,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 +1363,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 +1418,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 +1438,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 +1472,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 +1509,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 +1529,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 +1592,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 +1612,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 +1638,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 +1679,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 +1708,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 +1748,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 +1832,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 +1860,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 +1880,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 +1898,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 +1916,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 +1932,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 +1960,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 +1971,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 +1979,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 +1987,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 +1995,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 +2007,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;
index 2a702dd03a61dbe63fe1b559609dc5393cc7325d..5dbefac09a83f435712d0ba6e231593df574b73c 100644 (file)
@@ -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