2010-11-09 17:00:59 -08:00
|
|
|
|
/*
|
2013-07-08 10:15:00 -07:00
|
|
|
|
* Copyright (c) 2010, 2011, 2012, 2013 Nicira, Inc.
|
2010-11-09 17:00:59 -08:00
|
|
|
|
*
|
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
|
* You may obtain a copy of the License at:
|
|
|
|
|
*
|
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
*
|
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
|
* limitations under the License.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#ifndef NX_MATCH_H
|
|
|
|
|
#define NX_MATCH_H 1
|
|
|
|
|
|
|
|
|
|
#include <stdint.h>
|
2010-12-16 13:56:47 -08:00
|
|
|
|
#include <sys/types.h>
|
|
|
|
|
#include <netinet/in.h>
|
2013-07-08 10:15:00 -07:00
|
|
|
|
#include "compiler.h"
|
2012-03-08 14:44:54 -08:00
|
|
|
|
#include "flow.h"
|
2012-07-03 22:17:14 -07:00
|
|
|
|
#include "ofp-errors.h"
|
2010-12-16 13:56:47 -08:00
|
|
|
|
#include "openvswitch/types.h"
|
2010-11-09 17:00:59 -08:00
|
|
|
|
|
2010-12-09 11:03:35 -08:00
|
|
|
|
struct ds;
|
2012-08-07 15:28:18 -07:00
|
|
|
|
struct match;
|
2011-12-28 12:42:14 -08:00
|
|
|
|
struct mf_subfield;
|
2012-07-03 22:17:14 -07:00
|
|
|
|
struct ofpact_reg_move;
|
|
|
|
|
struct ofpact_reg_load;
|
2013-03-05 16:27:55 -08:00
|
|
|
|
struct ofpact_stack;
|
2010-11-09 17:00:59 -08:00
|
|
|
|
struct ofpbuf;
|
2010-11-11 10:41:33 -08:00
|
|
|
|
struct nx_action_reg_load;
|
|
|
|
|
struct nx_action_reg_move;
|
2010-11-09 17:00:59 -08:00
|
|
|
|
|
2013-03-05 16:27:55 -08:00
|
|
|
|
|
2010-11-09 17:00:59 -08:00
|
|
|
|
/* Nicira Extended Match (NXM) flexible flow match helper functions.
|
|
|
|
|
*
|
|
|
|
|
* See include/openflow/nicira-ext.h for NXM specification.
|
|
|
|
|
*/
|
|
|
|
|
|
2012-01-12 15:48:19 -08:00
|
|
|
|
enum ofperr nx_pull_match(struct ofpbuf *, unsigned int match_len,
|
2012-08-07 15:28:18 -07:00
|
|
|
|
struct match *,
|
2012-01-12 15:48:19 -08:00
|
|
|
|
ovs_be64 *cookie, ovs_be64 *cookie_mask);
|
|
|
|
|
enum ofperr nx_pull_match_loose(struct ofpbuf *, unsigned int match_len,
|
2012-08-07 15:28:18 -07:00
|
|
|
|
struct match *, ovs_be64 *cookie,
|
2012-08-01 16:01:45 +09:00
|
|
|
|
ovs_be64 *cookie_mask);
|
2012-08-07 15:28:18 -07:00
|
|
|
|
enum ofperr oxm_pull_match(struct ofpbuf *, struct match *);
|
|
|
|
|
enum ofperr oxm_pull_match_loose(struct ofpbuf *, struct match *);
|
|
|
|
|
int nx_put_match(struct ofpbuf *, const struct match *,
|
2011-12-23 12:23:24 -08:00
|
|
|
|
ovs_be64 cookie, ovs_be64 cookie_mask);
|
2012-08-07 15:28:18 -07:00
|
|
|
|
int oxm_put_match(struct ofpbuf *, const struct match *);
|
2010-11-09 17:00:59 -08:00
|
|
|
|
|
|
|
|
|
char *nx_match_to_string(const uint8_t *, unsigned int match_len);
|
2013-07-22 15:47:19 -07:00
|
|
|
|
char *oxm_match_to_string(const struct ofpbuf *, unsigned int match_len);
|
2010-11-09 17:00:59 -08:00
|
|
|
|
int nx_match_from_string(const char *, struct ofpbuf *);
|
2012-08-01 16:01:45 +09:00
|
|
|
|
int oxm_match_from_string(const char *, struct ofpbuf *);
|
2010-11-09 17:00:59 -08:00
|
|
|
|
|
2013-07-08 10:15:00 -07:00
|
|
|
|
char *nxm_parse_reg_move(struct ofpact_reg_move *, const char *)
|
|
|
|
|
WARN_UNUSED_RESULT;
|
|
|
|
|
char *nxm_parse_reg_load(struct ofpact_reg_load *, const char *)
|
|
|
|
|
WARN_UNUSED_RESULT;
|
2012-07-03 22:17:14 -07:00
|
|
|
|
|
|
|
|
|
void nxm_format_reg_move(const struct ofpact_reg_move *, struct ds *);
|
|
|
|
|
void nxm_format_reg_load(const struct ofpact_reg_load *, struct ds *);
|
2010-12-09 11:03:35 -08:00
|
|
|
|
|
2012-07-03 22:17:14 -07:00
|
|
|
|
enum ofperr nxm_reg_move_from_openflow(const struct nx_action_reg_move *,
|
|
|
|
|
struct ofpbuf *ofpacts);
|
|
|
|
|
enum ofperr nxm_reg_load_from_openflow(const struct nx_action_reg_load *,
|
|
|
|
|
struct ofpbuf *ofpacts);
|
2012-09-14 12:05:44 +09:00
|
|
|
|
enum ofperr nxm_reg_load_from_openflow12_set_field(
|
|
|
|
|
const struct ofp12_action_set_field * oasf, struct ofpbuf *ofpacts);
|
2010-12-09 11:03:35 -08:00
|
|
|
|
|
2012-07-03 22:17:14 -07:00
|
|
|
|
enum ofperr nxm_reg_move_check(const struct ofpact_reg_move *,
|
2011-12-28 12:42:14 -08:00
|
|
|
|
const struct flow *);
|
2012-07-03 22:17:14 -07:00
|
|
|
|
enum ofperr nxm_reg_load_check(const struct ofpact_reg_load *,
|
2012-01-12 15:48:19 -08:00
|
|
|
|
const struct flow *);
|
2010-11-11 10:41:33 -08:00
|
|
|
|
|
2012-07-03 22:17:14 -07:00
|
|
|
|
void nxm_reg_move_to_nxast(const struct ofpact_reg_move *,
|
|
|
|
|
struct ofpbuf *openflow);
|
|
|
|
|
void nxm_reg_load_to_nxast(const struct ofpact_reg_load *,
|
|
|
|
|
struct ofpbuf *openflow);
|
|
|
|
|
|
2013-05-14 18:24:43 -07:00
|
|
|
|
void nxm_execute_reg_move(const struct ofpact_reg_move *, struct flow *,
|
|
|
|
|
struct flow_wildcards *);
|
2012-07-03 22:17:14 -07:00
|
|
|
|
void nxm_execute_reg_load(const struct ofpact_reg_load *, struct flow *);
|
|
|
|
|
void nxm_reg_load(const struct mf_subfield *, uint64_t src_data,
|
2013-08-02 21:17:31 -07:00
|
|
|
|
struct flow *, struct flow_wildcards *);
|
2010-11-11 10:41:33 -08:00
|
|
|
|
|
2013-07-08 10:15:00 -07:00
|
|
|
|
char *nxm_parse_stack_action(struct ofpact_stack *, const char *)
|
|
|
|
|
WARN_UNUSED_RESULT;
|
2013-03-05 16:27:55 -08:00
|
|
|
|
|
|
|
|
|
void nxm_format_stack_push(const struct ofpact_stack *, struct ds *);
|
|
|
|
|
void nxm_format_stack_pop(const struct ofpact_stack *, struct ds *);
|
|
|
|
|
|
|
|
|
|
enum ofperr nxm_stack_push_from_openflow(const struct nx_action_stack *,
|
|
|
|
|
struct ofpbuf *ofpacts);
|
|
|
|
|
enum ofperr nxm_stack_pop_from_openflow(const struct nx_action_stack *,
|
|
|
|
|
struct ofpbuf *ofpacts);
|
|
|
|
|
enum ofperr nxm_stack_push_check(const struct ofpact_stack *,
|
|
|
|
|
const struct flow *);
|
|
|
|
|
enum ofperr nxm_stack_pop_check(const struct ofpact_stack *,
|
|
|
|
|
const struct flow *);
|
|
|
|
|
|
|
|
|
|
void nxm_stack_push_to_nxast(const struct ofpact_stack *,
|
|
|
|
|
struct ofpbuf *openflow);
|
|
|
|
|
void nxm_stack_pop_to_nxast(const struct ofpact_stack *,
|
|
|
|
|
struct ofpbuf *openflow);
|
|
|
|
|
|
|
|
|
|
void nxm_execute_stack_push(const struct ofpact_stack *,
|
2013-05-14 18:24:43 -07:00
|
|
|
|
const struct flow *, struct flow_wildcards *,
|
|
|
|
|
struct ofpbuf *);
|
2013-03-05 16:27:55 -08:00
|
|
|
|
void nxm_execute_stack_pop(const struct ofpact_stack *,
|
2013-08-02 21:17:31 -07:00
|
|
|
|
struct flow *, struct flow_wildcards *,
|
|
|
|
|
struct ofpbuf *);
|
2013-03-05 16:27:55 -08:00
|
|
|
|
|
2010-12-16 13:57:08 -08:00
|
|
|
|
int nxm_field_bytes(uint32_t header);
|
|
|
|
|
int nxm_field_bits(uint32_t header);
|
|
|
|
|
|
2011-12-28 12:42:14 -08:00
|
|
|
|
/* Dealing with the 'ofs_nbits' members in several Nicira extensions. */
|
2010-12-16 13:56:47 -08:00
|
|
|
|
|
|
|
|
|
static inline ovs_be16
|
|
|
|
|
nxm_encode_ofs_nbits(int ofs, int n_bits)
|
|
|
|
|
{
|
|
|
|
|
return htons((ofs << 6) | (n_bits - 1));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline int
|
|
|
|
|
nxm_decode_ofs(ovs_be16 ofs_nbits)
|
|
|
|
|
{
|
|
|
|
|
return ntohs(ofs_nbits) >> 6;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline int
|
|
|
|
|
nxm_decode_n_bits(ovs_be16 ofs_nbits)
|
|
|
|
|
{
|
|
|
|
|
return (ntohs(ofs_nbits) & 0x3f) + 1;
|
|
|
|
|
}
|
|
|
|
|
|
2010-12-07 12:45:24 -08:00
|
|
|
|
/* This is my guess at the length of a "typical" nx_match, for use in
|
|
|
|
|
* predicting space requirements. */
|
|
|
|
|
#define NXM_TYPICAL_LEN 64
|
|
|
|
|
|
2010-11-09 17:00:59 -08:00
|
|
|
|
#endif /* nx-match.h */
|