X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fofp-util.h;h=3467366efc1671fa6abd41b2e8e74b2a9404cb9b;hb=80642190644ae6fbcf485924b1c59e67d0be8a87;hp=d72a50bd2549abf8973cb3fc823753c6736041a6;hpb=26c112c2419e95dcd6b5ceb3ca35e1fc790d2de4;p=openvswitch diff --git a/lib/ofp-util.h b/lib/ofp-util.h index d72a50bd..3467366e 100644 --- a/lib/ofp-util.h +++ b/lib/ofp-util.h @@ -26,10 +26,16 @@ struct ofpbuf; struct ofp_action_header; +/* Alignment of ofp_actions. */ +#define OFP_ACTION_ALIGN 8 + /* OpenFlow protocol utility functions. */ void *make_openflow(size_t openflow_len, uint8_t type, struct ofpbuf **); +void *make_nxmsg(size_t openflow_len, uint32_t subtype, struct ofpbuf **); void *make_openflow_xid(size_t openflow_len, uint8_t type, uint32_t xid, struct ofpbuf **); +void *make_nxmsg_xid(size_t openflow_len, uint32_t subtype, uint32_t xid, + struct ofpbuf **); void *put_openflow(size_t openflow_len, uint8_t type, struct ofpbuf *); void *put_openflow_xid(size_t openflow_len, uint8_t type, uint32_t xid, struct ofpbuf *); @@ -59,8 +65,6 @@ int check_ofp_message(const struct ofp_header *, uint8_t type, size_t size); int check_ofp_message_array(const struct ofp_header *, uint8_t type, size_t size, size_t array_elt_size, size_t *n_array_elts); -int check_ofp_packet_out(const struct ofp_header *, struct ofpbuf *data, - int *n_actions, int max_ports); struct flow_stats_iterator { const uint8_t *pos, *end; @@ -77,20 +81,28 @@ const union ofp_action *actions_first(struct actions_iterator *, size_t n_actions); const union ofp_action *actions_next(struct actions_iterator *); int validate_actions(const union ofp_action *, size_t n_actions, - int max_ports); + const struct flow *, int max_ports); bool action_outputs_to_port(const union ofp_action *, uint16_t port); void normalize_match(struct ofp_match *); char *ofp_match_to_literal_string(const struct ofp_match *match); + +int ofputil_pull_actions(struct ofpbuf *, unsigned int actions_len, + union ofp_action **, size_t *); /* OpenFlow vendors. * - * These functions map vendor */ + * These functions map OpenFlow 32-bit vendor IDs (as used in struct + * ofp_vendor_header) into 4-bit values to embed in an "int". The 4-bit values + * are only used internally in Open vSwitch and never appear on the wire, so + * particular codes used are not important. + */ + /* Vendor error numbers currently used in Open vSwitch. */ #define OFPUTIL_VENDORS \ /* vendor name vendor value */ \ OFPUTIL_VENDOR(OFPUTIL_VENDOR_OPENFLOW, 0x00000000) \ - OFPUTIL_VENDOR(OFPUTIL_VENDOR_NICIRA, 0x00002320) + OFPUTIL_VENDOR(OFPUTIL_VENDOR_NICIRA, NX_VENDOR_ID) /* OFPUTIL_VENDOR_* definitions. */ enum ofputil_vendor_codes { @@ -106,19 +118,19 @@ enum ofputil_vendor_codes { * error codes into a single 31-bit space using the following encoding. * (Bit 31 is unused and assumed 0 to avoid negative "int" values.) * - * 31 0 + * 30 0 * +------------------------------------------------------+ * | 0 | success * +------------------------------------------------------+ * * 30 29 0 * +--+---------------------------------------------------+ - * |0 | errno value | errno value + * | 0| errno value | errno value * +--+---------------------------------------------------+ * * 30 29 26 25 16 15 0 * +--+-------+----------------+--------------------------+ - * |1 | 0 | type | code | standard OpenFlow + * | 1| 0 | type | code | standard OpenFlow * +--+-------+----------------+--------------------------+ error * * 30 29 26 25 16 15 0 @@ -140,12 +152,21 @@ enum ofputil_vendor_codes { * the vendor codes can fit. */ BUILD_ASSERT_DECL(OFPUTIL_N_VENDORS <= 16); +/* These are macro versions of the functions defined below. The macro versions + * are intended for use in contexts where function calls are not allowed, + * e.g. static initializers and case labels. */ +#define OFP_MKERR(TYPE, CODE) ((1 << 30) | ((TYPE) << 16) | (CODE)) +#define OFP_MKERR_VENDOR(VENDOR, TYPE, CODE) \ + ((1 << 30) | ((VENDOR) << 26) | ((TYPE) << 16) | (CODE)) +#define OFP_MKERR_NICIRA(TYPE, CODE) \ + OFP_MKERR_VENDOR(OFPUTIL_VENDOR_NICIRA, TYPE, CODE) + /* Returns the standard OpenFlow error with the specified 'type' and 'code' as * an integer. */ static inline int ofp_mkerr(uint16_t type, uint16_t code) { - return (1 << 30) | (type << 16) | code; + return OFP_MKERR(type, code); } /* Returns the OpenFlow vendor error with the specified 'vendor', 'type', and @@ -154,7 +175,7 @@ static inline int ofp_mkerr_vendor(uint8_t vendor, uint16_t type, uint16_t code) { assert(vendor < OFPUTIL_N_VENDORS); - return (1 << 30) | (vendor << 26) | (type << 16) | code; + return OFP_MKERR_VENDOR(vendor, type, code); } /* Returns the OpenFlow vendor error with Nicira as vendor, with the specific @@ -162,7 +183,7 @@ ofp_mkerr_vendor(uint8_t vendor, uint16_t type, uint16_t code) static inline int ofp_mkerr_nicira(uint16_t type, uint16_t code) { - return ofp_mkerr_vendor(OFPUTIL_VENDOR_NICIRA, type, code); + return OFP_MKERR_NICIRA(type, code); } /* Returns true if 'error' encodes an OpenFlow standard or vendor extension