aboutsummaryrefslogtreecommitdiff
path: root/openflow.h
diff options
context:
space:
mode:
Diffstat (limited to 'openflow.h')
-rw-r--r--openflow.h51
1 files changed, 45 insertions, 6 deletions
diff --git a/openflow.h b/openflow.h
index 31ef03c42523..2d56d154a2ba 100644
--- a/openflow.h
+++ b/openflow.h
@@ -30,7 +30,25 @@
/* for netdissect_options */
#include "netdissect.h"
-#define OF_HEADER_LEN 8
+#define OF_FWD(n) { \
+ cp += (n); \
+ len -= (n); \
+}
+
+#define OF_CHK_FWD(n) { \
+ ND_TCHECK_LEN(cp, (n)); \
+ cp += (n); \
+ len -= (n); \
+}
+
+#define OF_VER_1_0 0x01U
+#define OF_VER_1_1 0x02U
+#define OF_VER_1_2 0x03U
+#define OF_VER_1_3 0x04U
+#define OF_VER_1_4 0x05U
+#define OF_VER_1_5 0x06U
+
+#define OF_HEADER_FIXLEN 8U
#define ONF_EXP_ONF 0x4f4e4600
#define ONF_EXP_BUTE 0xff000001
@@ -40,12 +58,33 @@
#define ONF_EXP_WMOB 0xff000005
#define ONF_EXP_FABS 0xff000006
#define ONF_EXP_OTRANS 0xff000007
+#define ONF_EXP_NBLNCTU 0xff000008
+#define ONF_EXP_MPCE 0xff000009
+#define ONF_EXP_MPLSTPSPTN 0xff00000a
extern const struct tok onf_exp_str[];
+extern const char * of_vendor_name(const uint32_t);
+extern void of_bitmap_print(netdissect_options *ndo,
+ const struct tok *, const uint32_t, const uint32_t);
+extern void of_data_print(netdissect_options *ndo,
+ const u_char *, const u_int);
+
/*
- * Routines to print packets for various versions of OpenFlow.
+ * Routines to handle various versions of OpenFlow.
*/
-extern const u_char *of10_header_body_print(netdissect_options *ndo,
- const u_char *, const u_char *,
- const uint8_t, const uint16_t, const uint32_t);
-extern const char * of_vendor_name(const uint32_t);
+
+struct of_msgtypeinfo {
+ /* Should not be NULL. */
+ const char *name;
+ /* May be NULL to mean "message body printing is not implemented". */
+ void (*decoder)(netdissect_options *ndo, const u_char *, const u_int);
+ enum {
+ REQ_NONE, /* Message body length may be anything. */
+ REQ_FIXLEN, /* Message body length must be == req_value. */
+ REQ_MINLEN, /* Message body length must be >= req_value. */
+ } req_what;
+ uint16_t req_value;
+};
+
+extern const struct of_msgtypeinfo *of10_identify_msgtype(const uint8_t);
+extern const struct of_msgtypeinfo *of13_identify_msgtype(const uint8_t);