The split out function will be used for goto-table instruction. Signed-off-by: Isaku Yamahata <yamah...@valinux.co.jp> --- lib/packets.c | 42 ++++++++++++++++++++++++++++++++++++++++++ lib/packets.h | 2 ++ ofproto/ofproto-dpif.c | 39 ++------------------------------------- 3 files changed, 46 insertions(+), 37 deletions(-)
diff --git a/lib/packets.c b/lib/packets.c index 5729167..d99de4e 100644 --- a/lib/packets.c +++ b/lib/packets.c @@ -589,3 +589,45 @@ packet_format_tcp_flags(struct ds *s, uint8_t tcp_flags) ds_put_cstr(s, "[80]"); } } + +void +packet_update(struct ofpbuf *packet, const struct flow *flow) +{ + struct eth_header *eh; + if (packet->l2 == NULL || packet->l3 == NULL) { + return; + } + + eth_pop_vlan(packet); + eh = packet->l2; + + /* If the Ethernet type is less than ETH_TYPE_MIN, it's likely an 802.2 + * LLC frame. Calculating the Ethernet type of these frames is more + * trouble than seems appropriate for a simple assertion. */ + assert(ntohs(eh->eth_type) < ETH_TYPE_MIN + || eh->eth_type == flow->dl_type); + + memcpy(eh->eth_src, flow->dl_src, sizeof eh->eth_src); + memcpy(eh->eth_dst, flow->dl_dst, sizeof eh->eth_dst); + + if (flow->vlan_tci & htons(VLAN_CFI)) { + eth_push_vlan(packet, flow->vlan_tci); + } + + if (packet->l4) { + if (flow->dl_type == htons(ETH_TYPE_IP)) { + packet_set_ipv4(packet, flow->nw_src, flow->nw_dst, + flow->nw_tos, flow->nw_ttl); + } + + if (packet->l7) { + if (flow->nw_proto == IPPROTO_TCP) { + packet_set_tcp_port(packet, flow->tp_src, + flow->tp_dst); + } else if (flow->nw_proto == IPPROTO_UDP) { + packet_set_udp_port(packet, flow->tp_src, + flow->tp_dst); + } + } + } +} diff --git a/lib/packets.h b/lib/packets.h index ad5631d..b49c75a 100644 --- a/lib/packets.h +++ b/lib/packets.h @@ -508,4 +508,6 @@ void packet_set_udp_port(struct ofpbuf *, ovs_be16 src, ovs_be16 dst); uint8_t packet_get_tcp_flags(const struct ofpbuf *, const struct flow *); void packet_format_tcp_flags(struct ds *, uint8_t); +void packet_update(struct ofpbuf *packet, const struct flow *flow); + #endif /* packets.h */ diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index d272cc0..95abb74 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -47,6 +47,7 @@ #include "ofp-print.h" #include "ofproto-dpif-governor.h" #include "ofproto-dpif-sflow.h" +#include "packets.h" #include "poll-loop.h" #include "simap.h" #include "timer.h" @@ -5099,43 +5100,7 @@ execute_controller_action(struct action_xlate_ctx *ctx, int len, } packet = ofpbuf_clone(ctx->packet); - - if (packet->l2 && packet->l3) { - struct eth_header *eh; - - eth_pop_vlan(packet); - eh = packet->l2; - - /* If the Ethernet type is less than ETH_TYPE_MIN, it's likely an 802.2 - * LLC frame. Calculating the Ethernet type of these frames is more - * trouble than seems appropriate for a simple assertion. */ - assert(ntohs(eh->eth_type) < ETH_TYPE_MIN - || eh->eth_type == ctx->flow.dl_type); - - memcpy(eh->eth_src, ctx->flow.dl_src, sizeof eh->eth_src); - memcpy(eh->eth_dst, ctx->flow.dl_dst, sizeof eh->eth_dst); - - if (ctx->flow.vlan_tci & htons(VLAN_CFI)) { - eth_push_vlan(packet, ctx->flow.vlan_tci); - } - - if (packet->l4) { - if (ctx->flow.dl_type == htons(ETH_TYPE_IP)) { - packet_set_ipv4(packet, ctx->flow.nw_src, ctx->flow.nw_dst, - ctx->flow.nw_tos, ctx->flow.nw_ttl); - } - - if (packet->l7) { - if (ctx->flow.nw_proto == IPPROTO_TCP) { - packet_set_tcp_port(packet, ctx->flow.tp_src, - ctx->flow.tp_dst); - } else if (ctx->flow.nw_proto == IPPROTO_UDP) { - packet_set_udp_port(packet, ctx->flow.tp_src, - ctx->flow.tp_dst); - } - } - } - } + packet_update(packet, &ctx->flow); pin.packet = packet->data; pin.packet_len = packet->size; -- 1.7.1.1 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev