OFPUTIL_NXT_FLOW_MOD_TABLE_ID,
OFPUTIL_NXT_FLOW_MOD,
OFPUTIL_NXT_FLOW_REMOVED,
+ OFPUTIL_NXT_SET_PACKET_IN_FORMAT,
+ OFPUTIL_NXT_PACKET_IN,
/* NXST_* stat requests. */
OFPUTIL_NXST_FLOW_REQUEST,
struct ofputil_msg_type;
int ofputil_decode_msg_type(const struct ofp_header *,
const struct ofputil_msg_type **);
+int ofputil_decode_msg_type_partial(const struct ofp_header *, size_t length,
+ const struct ofputil_msg_type **);
enum ofputil_msg_code ofputil_msg_type_code(const struct ofputil_msg_type *);
const char *ofputil_msg_type_name(const struct ofputil_msg_type *);
struct ofpbuf *ofputil_make_set_flow_format(enum nx_flow_format);
+/* PACKET_IN. */
+bool ofputil_packet_in_format_is_valid(enum nx_packet_in_format);
+int ofputil_packet_in_format_from_string(const char *);
+const char *ofputil_packet_in_format_to_string(enum nx_packet_in_format);
+struct ofpbuf *ofputil_make_set_packet_in_format(enum nx_packet_in_format);
+
/* NXT_FLOW_MOD_TABLE_ID extension. */
struct ofpbuf *ofputil_make_flow_mod_table_id(bool flow_mod_table_id);
struct ofputil_flow_mod {
struct cls_rule cr;
ovs_be64 cookie;
+ ovs_be64 cookie_mask;
uint8_t table_id;
uint16_t command;
uint16_t idle_timeout;
struct ofputil_flow_stats_request {
bool aggregate; /* Aggregate results? */
struct cls_rule match;
+ ovs_be64 cookie;
+ ovs_be64 cookie_mask;
uint16_t out_port;
uint8_t table_id;
};
/* Abstract packet-in message. */
struct ofputil_packet_in {
- struct ofpbuf *packet;
- uint16_t in_port;
+ const void *packet;
+ size_t packet_len;
+
uint8_t reason; /* One of OFPR_*. */
+ uint8_t table_id;
+ ovs_be64 cookie;
uint32_t buffer_id;
int send_len;
+ uint16_t total_len; /* Full length of frame. */
+
+ struct flow_metadata fmd; /* Metadata at creation time. */
};
+int ofputil_decode_packet_in(struct ofputil_packet_in *,
+ const struct ofp_header *);
struct ofpbuf *ofputil_encode_packet_in(const struct ofputil_packet_in *,
- struct ofpbuf *rw_packet);
+ enum nx_packet_in_format);
+int ofputil_decode_packet_in(struct ofputil_packet_in *pi,
+ const struct ofp_header *oh);
/* OpenFlow protocol utility functions. */
void *make_openflow(size_t openflow_len, uint8_t type, struct ofpbuf **);
uint16_t in_port, uint16_t out_port);
struct ofpbuf *make_echo_request(void);
struct ofpbuf *make_echo_reply(const struct ofp_header *rq);
+
+const char *ofputil_frag_handling_to_string(enum ofp_config_flags);
+bool ofputil_frag_handling_from_string(const char *, enum ofp_config_flags *);
\f
/* Actions. */
int ofputil_action_code_from_name(const char *);
+void *ofputil_put_action(enum ofputil_action_code, struct ofpbuf *buf);
+
+/* For each OpenFlow action <ENUM> that has a corresponding action structure
+ * struct <STRUCT>, this defines two functions:
+ *
+ * void ofputil_init_<ENUM>(struct <STRUCT> *action);
+ *
+ * Initializes the parts of 'action' that identify it as having type <ENUM>
+ * and length 'sizeof *action' and zeros the rest. For actions that have
+ * variable length, the length used and cleared is that of struct <STRUCT>.
+ *
+ * struct <STRUCT> *ofputil_put_<ENUM>(struct ofpbuf *buf);
+ *
+ * Appends a new 'action', of length 'sizeof(struct <STRUCT>)', to 'buf',
+ * initializes it with ofputil_init_<ENUM>(), and returns it.
+ */
+#define OFPAT_ACTION(ENUM, STRUCT, NAME) \
+ void ofputil_init_##ENUM(struct STRUCT *); \
+ struct STRUCT *ofputil_put_##ENUM(struct ofpbuf *);
+#define NXAST_ACTION(ENUM, STRUCT, EXTENSIBLE, NAME) \
+ void ofputil_init_##ENUM(struct STRUCT *); \
+ struct STRUCT *ofputil_put_##ENUM(struct ofpbuf *);
+#include "ofp-util.def"
+
#define OFP_ACTION_ALIGN 8 /* Alignment of ofp_actions. */
static inline union ofp_action *
void ofputil_format_error(struct ds *, int error);
char *ofputil_error_to_string(int error);
+/* Handy utility for parsing flows and actions. */
+bool ofputil_parse_key_value(char **stringp, char **keyp, char **valuep);
+
#endif /* ofp-util.h */