Skip to content

Commit

Permalink
ofproto-dpif: Store the initial tunnel IP TOS values for later use.
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
Justin Pettit committed Mar 6, 2013
1 parent 14f94f9 commit c3f6c50
Showing 1 changed file with 16 additions and 5 deletions.
21 changes: 16 additions & 5 deletions ofproto/ofproto-dpif.c
Original file line number Diff line number Diff line change
Expand Up @@ -303,6 +303,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 *,
Expand Down Expand Up @@ -3648,11 +3651,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
Expand All @@ -3679,6 +3683,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) {
Expand Down Expand Up @@ -5421,6 +5426,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);
Expand Down Expand Up @@ -6563,6 +6569,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;
Expand Down Expand Up @@ -6649,6 +6656,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);

Expand Down Expand Up @@ -7411,6 +7419,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;
Expand Down Expand Up @@ -7713,6 +7722,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. */
Expand Down Expand Up @@ -7747,6 +7757,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;
Expand Down

0 comments on commit c3f6c50

Please sign in to comment.