2
0
mirror of https://github.com/openvswitch/ovs synced 2025-10-25 15:07:05 +00:00
Files
openvswitch/lib/odp-util.h
Ben Pfaff ad8ee2c0f3 odp-util: Bump up maximum number of ODP actions.
The kernel supports more than a single page of actions now, so userspace
should be able to take advantage of this.

Upcoming commits will completely replace this data structure but this
commit makes the bug fix clear and is suitable for cherry-picking to
long-term support branches.
2010-12-07 13:44:10 -08:00

107 lines
2.8 KiB
C

/*
* Copyright (c) 2009, 2010 Nicira Networks.
*
* 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 ODP_UTIL_H
#define ODP_UTIL_H 1
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <string.h>
#include "hash.h"
#include "openflow/openflow.h"
#include "openvswitch/datapath-protocol.h"
#include "util.h"
struct ds;
struct flow;
enum { MAX_ODP_ACTIONS = 16384 / sizeof(union odp_action) };
/* odp_actions_add() assumes that MAX_ODP_ACTIONS is a power of 2. */
BUILD_ASSERT_DECL(IS_POW2(MAX_ODP_ACTIONS));
struct odp_actions {
size_t n_actions;
union odp_action actions[MAX_ODP_ACTIONS];
};
static inline void
odp_actions_init(struct odp_actions *actions)
{
actions->n_actions = 0;
}
union odp_action *odp_actions_add(struct odp_actions *actions, uint16_t type);
static inline bool
odp_actions_overflow(const struct odp_actions *actions)
{
return actions->n_actions > MAX_ODP_ACTIONS;
}
static inline uint16_t
ofp_port_to_odp_port(uint16_t ofp_port)
{
switch (ofp_port) {
case OFPP_LOCAL:
return ODPP_LOCAL;
case OFPP_NONE:
return ODPP_NONE;
default:
return ofp_port;
}
}
static inline uint16_t
odp_port_to_ofp_port(uint16_t odp_port)
{
switch (odp_port) {
case ODPP_LOCAL:
return OFPP_LOCAL;
case ODPP_NONE:
return OFPP_NONE;
default:
return odp_port;
}
}
void format_odp_flow_key(struct ds *, const struct odp_flow_key *);
void format_odp_action(struct ds *, const union odp_action *);
void format_odp_actions(struct ds *, const union odp_action *actions,
size_t n_actions);
void format_odp_flow_stats(struct ds *, const struct odp_flow_stats *);
void format_odp_flow(struct ds *, const struct odp_flow *);
void odp_flow_key_from_flow(struct odp_flow_key *, const struct flow *);
void odp_flow_key_to_flow(const struct odp_flow_key *, struct flow *);
static inline bool
odp_flow_key_equal(const struct odp_flow_key *a, const struct odp_flow_key *b)
{
return !memcmp(a, b, sizeof *a);
}
static inline size_t
odp_flow_key_hash(const struct odp_flow_key *flow, uint32_t basis)
{
BUILD_ASSERT_DECL(!(sizeof *flow % sizeof(uint32_t)));
return hash_words((const uint32_t *) flow,
sizeof *flow / sizeof(uint32_t), basis);
}
#endif /* odp-util.h */