diff options
| author | Jesse Gross <jesse@nicira.com> | 2010-07-14 20:15:53 -0700 |
|---|---|---|
| committer | Jesse Gross <jesse@nicira.com> | 2010-07-15 15:09:08 -0700 |
| commit | aebdcb93e0f81d6e6a910ffdfa56ba10f2918afe (patch) | |
| tree | f531b88bf81a95e0eea64e532cdd604e6bc5a388 /lib/dpif-netdev.c | |
| parent | 1cb8b59f8ca07d4bd3c0fe3a0608d7a8fca6b08f (diff) | |
| download | openvswitch-aebdcb93e0f81d6e6a910ffdfa56ba10f2918afe.tar.gz | |
datapath: Don't update flow key when applying actions.
Currently the flow key is updated to match an action that is applied
to a packet but these field are never looked at again. Not only is
this a waste of time it also makes optimizations involving caching
the flow key more difficult.
Diffstat (limited to 'lib/dpif-netdev.c')
| -rw-r--r-- | lib/dpif-netdev.c | 45 |
1 files changed, 12 insertions, 33 deletions
diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 5021874e7..fa47d39e3 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -138,7 +138,7 @@ static int do_del_port(struct dp_netdev *, uint16_t port_no); static int dp_netdev_output_control(struct dp_netdev *, const struct ofpbuf *, int queue_no, int port_no, uint32_t arg); static int dp_netdev_execute_actions(struct dp_netdev *, - struct ofpbuf *, flow_t *, + struct ofpbuf *, const flow_t *, const union odp_action *, int n); static struct dpif_netdev * @@ -1094,7 +1094,7 @@ dp_netdev_wait(void) * bits outside of 'mask'. */ static void -dp_netdev_modify_vlan_tci(struct ofpbuf *packet, flow_t *key, +dp_netdev_modify_vlan_tci(struct ofpbuf *packet, const flow_t *key, uint16_t tci, uint16_t mask) { struct vlan_eth_header *veh; @@ -1118,12 +1118,10 @@ dp_netdev_modify_vlan_tci(struct ofpbuf *packet, flow_t *key, memcpy(veh, &tmp, sizeof tmp); packet->l2 = (char*)packet->l2 - VLAN_HEADER_LEN; } - - key->dl_vlan = veh->veth_tci & htons(VLAN_VID_MASK); } static void -dp_netdev_strip_vlan(struct ofpbuf *packet, flow_t *key) +dp_netdev_strip_vlan(struct ofpbuf *packet) { struct vlan_eth_header *veh = packet->l2; if (veh->veth_type == htons(ETH_TYPE_VLAN)) { @@ -1137,31 +1135,25 @@ dp_netdev_strip_vlan(struct ofpbuf *packet, flow_t *key) packet->data = (char*)packet->data + VLAN_HEADER_LEN; packet->l2 = (char*)packet->l2 + VLAN_HEADER_LEN; memcpy(packet->data, &tmp, sizeof tmp); - - key->dl_vlan = htons(ODP_VLAN_NONE); } } static void -dp_netdev_set_dl_src(struct ofpbuf *packet, flow_t *key, - const uint8_t dl_addr[ETH_ADDR_LEN]) +dp_netdev_set_dl_src(struct ofpbuf *packet, const uint8_t dl_addr[ETH_ADDR_LEN]) { struct eth_header *eh = packet->l2; memcpy(eh->eth_src, dl_addr, sizeof eh->eth_src); - memcpy(key->dl_src, dl_addr, sizeof key->dl_src); } static void -dp_netdev_set_dl_dst(struct ofpbuf *packet, flow_t *key, - const uint8_t dl_addr[ETH_ADDR_LEN]) +dp_netdev_set_dl_dst(struct ofpbuf *packet, const uint8_t dl_addr[ETH_ADDR_LEN]) { struct eth_header *eh = packet->l2; memcpy(eh->eth_dst, dl_addr, sizeof eh->eth_dst); - memcpy(key->dl_dst, dl_addr, sizeof key->dl_dst); } static void -dp_netdev_set_nw_addr(struct ofpbuf *packet, flow_t *key, +dp_netdev_set_nw_addr(struct ofpbuf *packet, const flow_t *key, const struct odp_action_nw_addr *a) { if (key->dl_type == htons(ETH_TYPE_IP)) { @@ -1183,17 +1175,11 @@ dp_netdev_set_nw_addr(struct ofpbuf *packet, flow_t *key, } nh->ip_csum = recalc_csum32(nh->ip_csum, *field, a->nw_addr); *field = a->nw_addr; - - if (a->type == ODPAT_SET_NW_SRC) { - key->nw_src = a->type; - } else { - key->nw_dst = a->type; - } } } static void -dp_netdev_set_nw_tos(struct ofpbuf *packet, flow_t *key, +dp_netdev_set_nw_tos(struct ofpbuf *packet, const flow_t *key, const struct odp_action_nw_tos *a) { if (key->dl_type == htons(ETH_TYPE_IP)) { @@ -1206,12 +1192,11 @@ dp_netdev_set_nw_tos(struct ofpbuf *packet, flow_t *key, nh->ip_csum = recalc_csum16(nh->ip_csum, htons((uint16_t)*field), htons((uint16_t)a->nw_tos)); *field = new; - key->nw_tos = a->nw_tos; } } static void -dp_netdev_set_tp_port(struct ofpbuf *packet, flow_t *key, +dp_netdev_set_tp_port(struct ofpbuf *packet, const flow_t *key, const struct odp_action_tp_port *a) { if (key->dl_type == htons(ETH_TYPE_IP)) { @@ -1229,12 +1214,6 @@ dp_netdev_set_tp_port(struct ofpbuf *packet, flow_t *key, } else { return; } - - if (a->type == ODPAT_SET_TP_SRC) { - key->tp_src = a->tp_port; - } else { - key->tp_dst = a->tp_port; - } } } @@ -1293,7 +1272,7 @@ dp_netdev_output_control(struct dp_netdev *dp, const struct ofpbuf *packet, static int dp_netdev_execute_actions(struct dp_netdev *dp, - struct ofpbuf *packet, flow_t *key, + struct ofpbuf *packet, const flow_t *key, const union odp_action *actions, int n_actions) { int i; @@ -1327,15 +1306,15 @@ dp_netdev_execute_actions(struct dp_netdev *dp, break; case ODPAT_STRIP_VLAN: - dp_netdev_strip_vlan(packet, key); + dp_netdev_strip_vlan(packet); break; case ODPAT_SET_DL_SRC: - dp_netdev_set_dl_src(packet, key, a->dl_addr.dl_addr); + dp_netdev_set_dl_src(packet, a->dl_addr.dl_addr); break; case ODPAT_SET_DL_DST: - dp_netdev_set_dl_dst(packet, key, a->dl_addr.dl_addr); + dp_netdev_set_dl_dst(packet, a->dl_addr.dl_addr); break; case ODPAT_SET_NW_SRC: |
