X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fofp-util.h;h=909467f87ba0bc2d3d97b7fa0767d7cc5c8be89b;hb=408869427edc59058b6e7680e612b3a6cd46edc1;hp=9f3685ca78a55747ba9f6ce8d7ab8951720bfb9d;hpb=81d1ea941425aea5eff1d9582ad12c9b3b528fe8;p=openvswitch diff --git a/lib/ofp-util.h b/lib/ofp-util.h index 9f3685ca..909467f8 100644 --- a/lib/ofp-util.h +++ b/lib/ofp-util.h @@ -90,9 +90,15 @@ enum ofputil_msg_code { 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 *); + +/* 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. */ @@ -273,44 +279,90 @@ struct ofpbuf *make_unbuffered_packet_out(const struct ofpbuf *packet, 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 *); /* 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 { - /* OFPAT_* actions. */ - 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, - - /* NXAST_* actions. */ - 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 +#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 * @@ -500,4 +552,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 */