diff options
author | Justin Pettit <jpettit@nicira.com> | 2013-02-12 18:08:01 -0800 |
---|---|---|
committer | Justin Pettit <jpettit@nicira.com> | 2013-03-06 13:55:21 -0800 |
commit | 65fc33cc3c78a546d1dd571ae63e19dfd210442c (patch) | |
tree | f88314bb19990fd8031149a411c38c9c4ec0a3a0 /ofproto | |
parent | 267f736ac8e2a3a96bb76819841ea4894310be6a (diff) |
ofproto-dpif: Store the initial tunnel IP TOS values for later use.
When a packet arrives on an IP tunnel, store the TOS value for later
use. This value will be used in a couple of future commits.
Signed-off-by: Justin Pettit <jpettit@nicira.com>
Diffstat (limited to 'ofproto')
-rw-r--r-- | ofproto/ofproto-dpif.c | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index 43fb8611..5522b9ed 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -300,6 +300,9 @@ struct initial_vals { * This member should be removed when the VLAN splinters feature is no * longer needed. */ ovs_be16 vlan_tci; + + /* If received on a tunnel, the IP TOS value of the tunnel. */ + uint8_t tunnel_ip_tos; }; static void action_xlate_ctx_init(struct action_xlate_ctx *, @@ -3672,11 +3675,12 @@ drop_key_clear(struct dpif_backer *backer) * flow->vlan_tci correctly for the VLAN of the VLAN splinter port, and pushes * a VLAN header onto 'packet' (if it is nonnull). * - * Optionally, if nonnull, sets 'initial_vals->vlan_tci' to the VLAN TCI - * with which the packet was really received, that is, the actual VLAN - * TCI extracted by odp_flow_key_to_flow(). (This differs from the - * value returned in flow->vlan_tci only for packets received on VLAN - * splinters.) + * Optionally, if 'initial_vals' is nonnull, sets 'initial_vals->vlan_tci' + * to the VLAN TCI with which the packet was really received, that is, the + * actual VLAN TCI extracted by odp_flow_key_to_flow(). (This differs from + * the value returned in flow->vlan_tci only for packets received on + * VLAN splinters.) Also, if received on an IP tunnel, sets + * 'initial_vals->tunnel_ip_tos' to the tunnel's IP TOS. * * Similarly, this function also includes some logic to help with tunnels. It * may modify 'flow' as necessary to make the tunneling implementation @@ -3703,6 +3707,7 @@ ofproto_receive(const struct dpif_backer *backer, struct ofpbuf *packet, if (initial_vals) { initial_vals->vlan_tci = flow->vlan_tci; + initial_vals->tunnel_ip_tos = flow->tunnel.ip_tos; } if (odp_in_port) { @@ -5435,6 +5440,7 @@ rule_dpif_execute(struct rule_dpif *rule, const struct flow *flow, rule_credit_stats(rule, &stats); initial_vals.vlan_tci = flow->vlan_tci; + initial_vals.tunnel_ip_tos = flow->tunnel.ip_tos; ofpbuf_use_stub(&odp_actions, odp_actions_stub, sizeof odp_actions_stub); action_xlate_ctx_init(&ctx, ofproto, flow, &initial_vals, rule, stats.tcp_flags, packet); @@ -6492,6 +6498,7 @@ action_xlate_ctx_init(struct action_xlate_ctx *ctx, memset(&ctx->flow.tunnel, 0, sizeof ctx->flow.tunnel); ctx->base_flow = ctx->flow; ctx->base_flow.vlan_tci = initial_vals->vlan_tci; + ctx->base_flow.tunnel.ip_tos = initial_vals->tunnel_ip_tos; ctx->flow.tunnel.tun_id = initial_tun_id; ctx->rule = rule; ctx->packet = packet; @@ -6579,6 +6586,7 @@ xlate_actions(struct action_xlate_ctx *ctx, uint32_t local_odp_port; initial_vals.vlan_tci = ctx->base_flow.vlan_tci; + initial_vals.tunnel_ip_tos = ctx->base_flow.tunnel.ip_tos; add_sflow_action(ctx); @@ -7339,6 +7347,7 @@ packet_out(struct ofproto *ofproto_, struct ofpbuf *packet, dpif_flow_stats_extract(flow, packet, time_msec(), &stats); initial_vals.vlan_tci = flow->vlan_tci; + initial_vals.tunnel_ip_tos = 0; action_xlate_ctx_init(&ctx, ofproto, flow, &initial_vals, NULL, packet_get_tcp_flags(packet, flow), packet); ctx.resubmit_stats = &stats; @@ -7641,6 +7650,7 @@ ofproto_unixctl_trace(struct unixctl_conn *conn, int argc, const char *argv[], } initial_vals.vlan_tci = flow.vlan_tci; + initial_vals.tunnel_ip_tos = flow.tunnel.ip_tos; } /* Generate a packet, if requested. */ @@ -7675,6 +7685,7 @@ ofproto_unixctl_trace(struct unixctl_conn *conn, int argc, const char *argv[], flow_extract(packet, priority, mark, NULL, in_port, &flow); flow.tunnel.tun_id = tun_id; initial_vals.vlan_tci = flow.vlan_tci; + initial_vals.tunnel_ip_tos = flow.tunnel.ip_tos; } else { unixctl_command_reply_error(conn, "Bad command syntax"); goto exit; |