X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fofp-util.h;h=ecd77cc4629fe04928f932fa96447b4847bdec5c;hb=a193dde952a9ec7bb388e08b86bd2929edd3a353;hp=8fb5b1bc15fa530127cd6f08398ae9b36014e347;hpb=b4b8c7812bdfdc5a6fda4251453d8e3409486b98;p=openvswitch diff --git a/lib/ofp-util.h b/lib/ofp-util.h index 8fb5b1bc..ecd77cc4 100644 --- a/lib/ofp-util.h +++ b/lib/ofp-util.h @@ -93,6 +93,11 @@ int ofputil_decode_msg_type(const struct ofp_header *, enum ofputil_msg_code ofputil_msg_type_code(const struct ofputil_msg_type *); const char *ofputil_msg_type_name(const struct ofputil_msg_type *); +/* Port numbers. */ +int ofputil_check_output_port(uint16_t ofp_port, int max_ports); +bool ofputil_port_from_string(const char *, uint16_t *port); +void ofputil_format_port(uint16_t port, struct ds *); + /* Converting OFPFW_NW_SRC_MASK and OFPFW_NW_DST_MASK wildcard bit counts to * and from IP bitmasks. */ ovs_be32 ofputil_wcbits_to_netmask(int wcbits); @@ -121,7 +126,7 @@ struct ofpbuf *ofputil_make_set_flow_format(enum nx_flow_format); struct ofpbuf *ofputil_make_flow_mod_table_id(bool flow_mod_table_id); /* Flow format independent flow_mod. */ -struct flow_mod { +struct ofputil_flow_mod { struct cls_rule cr; ovs_be64 cookie; uint8_t table_id; @@ -135,24 +140,24 @@ struct flow_mod { size_t n_actions; }; -int ofputil_decode_flow_mod(struct flow_mod *, const struct ofp_header *, - bool flow_mod_table_id); -struct ofpbuf *ofputil_encode_flow_mod(const struct flow_mod *, +int ofputil_decode_flow_mod(struct ofputil_flow_mod *, + const struct ofp_header *, bool flow_mod_table_id); +struct ofpbuf *ofputil_encode_flow_mod(const struct ofputil_flow_mod *, enum nx_flow_format, bool flow_mod_table_id); /* Flow stats or aggregate stats request, independent of flow format. */ -struct flow_stats_request { +struct ofputil_flow_stats_request { bool aggregate; /* Aggregate results? */ struct cls_rule match; uint16_t out_port; uint8_t table_id; }; -int ofputil_decode_flow_stats_request(struct flow_stats_request *, +int ofputil_decode_flow_stats_request(struct ofputil_flow_stats_request *, const struct ofp_header *); struct ofpbuf *ofputil_encode_flow_stats_request( - const struct flow_stats_request *, enum nx_flow_format); + const struct ofputil_flow_stats_request *, enum nx_flow_format); /* Flow stats reply, independent of flow format. */ struct ofputil_flow_stats { @@ -275,12 +280,91 @@ struct ofpbuf *make_echo_reply(const struct ofp_header *rq); /* Actions. */ +/* The type of an action. + * + * For each implemented OFPAT_* and NXAST_* action type, there is a + * corresponding constant prefixed with OFPUTIL_, e.g.: + * + * OFPUTIL_OFPAT_OUTPUT + * OFPUTIL_OFPAT_SET_VLAN_VID + * OFPUTIL_OFPAT_SET_VLAN_PCP + * OFPUTIL_OFPAT_STRIP_VLAN + * OFPUTIL_OFPAT_SET_DL_SRC + * OFPUTIL_OFPAT_SET_DL_DST + * OFPUTIL_OFPAT_SET_NW_SRC + * OFPUTIL_OFPAT_SET_NW_DST + * OFPUTIL_OFPAT_SET_NW_TOS + * OFPUTIL_OFPAT_SET_TP_SRC + * OFPUTIL_OFPAT_SET_TP_DST + * OFPUTIL_OFPAT_ENQUEUE + * OFPUTIL_NXAST_RESUBMIT + * OFPUTIL_NXAST_SET_TUNNEL + * OFPUTIL_NXAST_SET_QUEUE + * OFPUTIL_NXAST_POP_QUEUE + * OFPUTIL_NXAST_REG_MOVE + * OFPUTIL_NXAST_REG_LOAD + * OFPUTIL_NXAST_NOTE + * OFPUTIL_NXAST_SET_TUNNEL64 + * OFPUTIL_NXAST_MULTIPATH + * OFPUTIL_NXAST_AUTOPATH + * OFPUTIL_NXAST_BUNDLE + * OFPUTIL_NXAST_BUNDLE_LOAD + * OFPUTIL_NXAST_RESUBMIT_TABLE + * OFPUTIL_NXAST_OUTPUT_REG + * + * (The above list helps developers who want to "grep" for these definitions.) + */ +enum ofputil_action_code { +#define OFPAT_ACTION(ENUM, STRUCT, NAME) OFPUTIL_##ENUM, +#define NXAST_ACTION(ENUM, STRUCT, EXTENSIBLE, NAME) OFPUTIL_##ENUM, +#include "ofp-util.def" +}; + +/* The number of values of "enum ofputil_action_code". */ +enum { +#define OFPAT_ACTION(ENUM, STRUCT, NAME) + 1 +#define NXAST_ACTION(ENUM, STRUCT, EXTENSIBLE, NAME) + 1 + OFPUTIL_N_ACTIONS = 0 +#include "ofp-util.def" +}; + +int ofputil_decode_action(const union ofp_action *); +enum ofputil_action_code ofputil_decode_action_unsafe( + const union ofp_action *); + +int ofputil_action_code_from_name(const char *); + +void *ofputil_put_action(enum ofputil_action_code, struct ofpbuf *buf); + +/* For each OpenFlow action that has a corresponding action structure + * struct , this defines two functions: + * + * void ofputil_init_(struct *action); + * + * Initializes the parts of 'action' that identify it as having type + * and length 'sizeof *action' and zeros the rest. For actions that have + * variable length, the length used and cleared is that of struct . + * + * struct *ofputil_put_(struct ofpbuf *buf); + * + * Appends a new 'action', of length 'sizeof(struct )', to 'buf', + * initializes it with ofputil_init_(), 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 * ofputil_action_next(const union ofp_action *a) { - return (void *) ((uint8_t *) a + ntohs(a->header.len)); + return ((union ofp_action *) (void *) + ((uint8_t *) a + ntohs(a->header.len))); } static inline bool @@ -463,4 +547,7 @@ int ofputil_decode_error_msg(const struct ofp_header *, size_t *payload_ofs); 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 */