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);
|
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 *);
|
Set datapath mask bits when setting a flow field.
Since at the datapath interface we do not have set actions for
individual fields, but larger sets of fields for a given protocol
layer, the set action will in practice only ever apply to exactly
matched flows for the given protocol layer. For example, if the
reg_load changes the IP TTL, the corresponding datapath action will
rewrite also the IP addresses and TOS byte. Since these other field
values may not be explicitly set, they depend on the incoming flow field
values, and are hence all of them are set in the wildcards masks, when
the action is committed to the datapath. For the rare case, where the
reg_load action does not actually change the value, and no other flow
field values are set (or loaded), the datapath action is skipped, and
no mask bits are set. Such a datapath flow should, however, be
dependent on the specific field value, so the corresponding wildcard
mask bits must be set, lest the datapath flow be applied to packets
containing some other value in the field and the field value remain
unchanged regardless of the incoming value.
Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com>
Signed-off-by: Ben Pfaff <blp@nicira.com>
2013-10-15 12:40:38 -07:00
|
|
|
|
void nxm_execute_reg_load(const struct ofpact_reg_load *, struct flow *,
|
|
|
|
|
struct flow_wildcards *);
|
2012-07-03 22:17:14 -07:00
|
|
|
|
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 */
|