2
0
mirror of https://github.com/openvswitch/ovs synced 2025-08-31 06:15:47 +00:00

sFlow: Genericize/simplify kernel sFlow implementation

Following patch adds sampling action which takes probability and set
of actions as arguments. When probability is hit, actions are executed for
given packet.
USERSPACE action's userdata (u64) is used to store struct
user_action_cookie as cookie. CONTROLLER action is fixed accordingly.

Now we can remove sFlow code from kernel and implement sFlow generically
as SAMPLE action. sFlow is defined as SAMPLE Action with probability (sFlow
sampling rate) and USERSPACE action as argument. USERSPACE action's data
is used as cookie. sFlow uses this cookie to store output-port, number of
output ports and vlan-id. sample-pool is calculated by using vport
stats.

Signed-off-by: Pravin Shelar <pshelar@nicira.com>
Acked-by: Jesse Gross <jesse@nicira.com>
Acked-by: Ben Pfaff <blp@nicira.com>
This commit is contained in:
Pravin Shelar
2011-09-28 10:43:07 -07:00
parent 89ac6b1f19
commit 6ff686f2bc
16 changed files with 437 additions and 325 deletions

View File

@@ -958,7 +958,6 @@ dpif_upcall_type_to_string(enum dpif_upcall_type type)
switch (type) {
case DPIF_UC_MISS: return "miss";
case DPIF_UC_ACTION: return "action";
case DPIF_UC_SAMPLE: return "sample";
case DPIF_N_UC_TYPES: default: return "<unknown>";
}
}
@@ -967,8 +966,7 @@ static bool OVS_UNUSED
is_valid_listen_mask(int listen_mask)
{
return !(listen_mask & ~((1u << DPIF_UC_MISS) |
(1u << DPIF_UC_ACTION) |
(1u << DPIF_UC_SAMPLE)));
(1u << DPIF_UC_ACTION)));
}
/* Retrieves 'dpif''s "listen mask" into '*listen_mask'. A 1-bit of value 2**X
@@ -1003,41 +1001,6 @@ dpif_recv_set_mask(struct dpif *dpif, int listen_mask)
return error;
}
/* Retrieve the sFlow sampling probability. '*probability' is expressed as the
* number of packets out of UINT_MAX to sample, e.g. probability/UINT_MAX is
* the probability of sampling a given packet.
*
* Returns 0 if successful, otherwise a positive errno value. EOPNOTSUPP
* indicates that 'dpif' does not support sFlow sampling. */
int
dpif_get_sflow_probability(const struct dpif *dpif, uint32_t *probability)
{
int error = (dpif->dpif_class->get_sflow_probability
? dpif->dpif_class->get_sflow_probability(dpif, probability)
: EOPNOTSUPP);
if (error) {
*probability = 0;
}
log_operation(dpif, "get_sflow_probability", error);
return error;
}
/* Set the sFlow sampling probability. 'probability' is expressed as the
* number of packets out of UINT_MAX to sample, e.g. probability/UINT_MAX is
* the probability of sampling a given packet.
*
* Returns 0 if successful, otherwise a positive errno value. EOPNOTSUPP
* indicates that 'dpif' does not support sFlow sampling. */
int
dpif_set_sflow_probability(struct dpif *dpif, uint32_t probability)
{
int error = (dpif->dpif_class->set_sflow_probability
? dpif->dpif_class->set_sflow_probability(dpif, probability)
: EOPNOTSUPP);
log_operation(dpif, "set_sflow_probability", error);
return error;
}
/* Polls for an upcall from 'dpif'. If successful, stores the upcall into
* '*upcall'. Only upcalls of the types selected with dpif_recv_set_mask()
* member function will ordinarily be received (but if a message type is