mirror of
https://github.com/openvswitch/ovs
synced 2025-10-19 14:37:21 +00:00
In the case of Open Flow 1.2, which is currently the only time that OXM is be used, there is a 4 byte header before the match which needs to be taken into account when calculating the pad length. This complicates nx_match pull and put somewhat. This patch takes an approach suggested by Ben Pfaff to separate the encoding of the match and the adding of padding and, in the case of OXM, a header. Signed-off-by: Simon Horman <horms@verge.net.au> Signed-off-by: Ben Pfaff <blp@nicira.com>
117 lines
4.0 KiB
C
117 lines
4.0 KiB
C
/*
|
||
* Copyright (c) 2010, 2011, 2012 Nicira, Inc.
|
||
*
|
||
* 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>
|
||
#include <sys/types.h>
|
||
#include <netinet/in.h>
|
||
#include "flow.h"
|
||
#include "ofp-errors.h"
|
||
#include "openvswitch/types.h"
|
||
#include "ofp-errors.h"
|
||
|
||
struct cls_rule;
|
||
struct ds;
|
||
struct flow;
|
||
struct mf_subfield;
|
||
struct ofpact_reg_move;
|
||
struct ofpact_reg_load;
|
||
struct ofpbuf;
|
||
struct nx_action_reg_load;
|
||
struct nx_action_reg_move;
|
||
|
||
/* Nicira Extended Match (NXM) flexible flow match helper functions.
|
||
*
|
||
* See include/openflow/nicira-ext.h for NXM specification.
|
||
*/
|
||
|
||
enum ofperr nx_pull_match(struct ofpbuf *, unsigned int match_len,
|
||
uint16_t priority, struct cls_rule *,
|
||
ovs_be64 *cookie, ovs_be64 *cookie_mask);
|
||
enum ofperr nx_pull_match_loose(struct ofpbuf *, unsigned int match_len,
|
||
uint16_t priority,
|
||
struct cls_rule *, ovs_be64 *cookie,
|
||
ovs_be64 *cookie_mask);
|
||
enum ofperr oxm_pull_match(struct ofpbuf *, uint16_t priority,
|
||
struct cls_rule *);
|
||
enum ofperr oxm_pull_match_loose(struct ofpbuf *, uint16_t priority,
|
||
struct cls_rule *);
|
||
int nx_put_match(struct ofpbuf *, const struct cls_rule *,
|
||
ovs_be64 cookie, ovs_be64 cookie_mask);
|
||
int oxm_put_match(struct ofpbuf *, const struct cls_rule *);
|
||
|
||
char *nx_match_to_string(const uint8_t *, unsigned int match_len);
|
||
char *oxm_match_to_string(const uint8_t *, unsigned int match_len);
|
||
int nx_match_from_string(const char *, struct ofpbuf *);
|
||
int oxm_match_from_string(const char *, struct ofpbuf *);
|
||
|
||
void nxm_parse_reg_move(struct ofpact_reg_move *, const char *);
|
||
void nxm_parse_reg_load(struct ofpact_reg_load *, const char *);
|
||
|
||
void nxm_format_reg_move(const struct ofpact_reg_move *, struct ds *);
|
||
void nxm_format_reg_load(const struct ofpact_reg_load *, struct ds *);
|
||
|
||
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);
|
||
|
||
enum ofperr nxm_reg_move_check(const struct ofpact_reg_move *,
|
||
const struct flow *);
|
||
enum ofperr nxm_reg_load_check(const struct ofpact_reg_load *,
|
||
const struct flow *);
|
||
|
||
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);
|
||
|
||
void nxm_execute_reg_move(const struct ofpact_reg_move *, struct flow *);
|
||
void nxm_execute_reg_load(const struct ofpact_reg_load *, struct flow *);
|
||
void nxm_reg_load(const struct mf_subfield *, uint64_t src_data,
|
||
struct flow *);
|
||
|
||
int nxm_field_bytes(uint32_t header);
|
||
int nxm_field_bits(uint32_t header);
|
||
|
||
/* Dealing with the 'ofs_nbits' members in several Nicira extensions. */
|
||
|
||
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;
|
||
}
|
||
|
||
/* This is my guess at the length of a "typical" nx_match, for use in
|
||
* predicting space requirements. */
|
||
#define NXM_TYPICAL_LEN 64
|
||
|
||
#endif /* nx-match.h */
|