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_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 handle various versions of OpenFlow.
*/
-extern void of10_message_print(netdissect_options *ndo,
- const u_char *, uint16_t, const uint8_t);
-extern void of13_message_print(netdissect_options *ndo,
- const u_char *, uint16_t, const uint8_t);
-/*
- * Use this instead of ofpt_str[] and OFPT_ constants because OpenFlow
- * specifications define protocol encoding in C syntax, and different
- * versions clash on many names, including the OFPT_ constants.
- */
-extern const char * of10_msgtype_str(const uint8_t);
-extern const char * of13_msgtype_str(const uint8_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);