X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fdpif-netdev.c;h=bc93a10244ef6216c1b497f0cbd318ddd2a5398e;hb=20d035b27559fe3823a09d72293c81281d3516c4;hp=babbce047a97398d34840146c138bb49e1a97b2a;hpb=4edb9ae90e4092f5f56b9d914d2b88783c49860d;p=openvswitch diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index babbce04..bc93a102 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -81,12 +81,10 @@ struct dp_netdev { int open_cnt; bool destroyed; - bool drop_frags; /* Drop all IP fragments, if true. */ struct dp_netdev_queue queues[N_QUEUES]; struct hmap flow_table; /* Flow table. */ /* Statistics. */ - long long int n_frags; /* Number of dropped IP fragments. */ long long int n_hit; /* Number of flow table matches. */ long long int n_missed; /* Number of flow table misses. */ long long int n_lost; /* Number of misses not passed to client. */ @@ -198,7 +196,6 @@ create_dp_netdev(const char *name, const struct dpif_class *class, dp->class = class; dp->name = xstrdup(name); dp->open_cnt = 0; - dp->drop_frags = false; for (i = 0; i < N_QUEUES; i++) { dp->queues[i].head = dp->queues[i].tail = 0; } @@ -302,29 +299,12 @@ dpif_netdev_get_stats(const struct dpif *dpif, struct dpif_dp_stats *stats) { struct dp_netdev *dp = get_dp_netdev(dpif); stats->n_flows = hmap_count(&dp->flow_table); - stats->n_frags = dp->n_frags; stats->n_hit = dp->n_hit; stats->n_missed = dp->n_missed; stats->n_lost = dp->n_lost; return 0; } -static int -dpif_netdev_get_drop_frags(const struct dpif *dpif, bool *drop_fragsp) -{ - struct dp_netdev *dp = get_dp_netdev(dpif); - *drop_fragsp = dp->drop_frags; - return 0; -} - -static int -dpif_netdev_set_drop_frags(struct dpif *dpif, bool drop_frags) -{ - struct dp_netdev *dp = get_dp_netdev(dpif); - dp->drop_frags = drop_frags; - return 0; -} - static int do_add_port(struct dp_netdev *dp, const char *devname, const char *type, uint16_t port_no) @@ -901,7 +881,7 @@ dpif_netdev_execute(struct dpif *dpif, ofpbuf_reserve(©, DP_NETDEV_HEADROOM); ofpbuf_put(©, packet->data, packet->size); - flow_extract(©, 0, -1, &key); + flow_extract(©, 0, 0, -1, &key); error = dpif_netdev_flow_from_nlattrs(key_attrs, key_len, &key); if (!error) { dp_netdev_execute_actions(dp, ©, &key, @@ -1001,11 +981,7 @@ dp_netdev_port_input(struct dp_netdev *dp, struct dp_netdev_port *port, if (packet->size < ETH_HEADER_LEN) { return; } - if (flow_extract(packet, 0, port->port_no, &key) && dp->drop_frags) { - dp->n_frags++; - return; - } - + flow_extract(packet, 0, 0, port->port_no, &key); flow = dp_netdev_lookup_flow(dp, &key); if (flow) { dp_netdev_flow_used(flow, &key, packet); @@ -1110,12 +1086,19 @@ dp_netdev_set_ip_tos(struct ip_header *nh, uint8_t new_tos) { uint8_t *field = &nh->ip_tos; - /* Set the DSCP bits and preserve the ECN bits. */ - uint8_t new = new_tos | (nh->ip_tos & IP_ECN_MASK); - nh->ip_csum = recalc_csum16(nh->ip_csum, htons((uint16_t)*field), - htons((uint16_t) new)); - *field = new; + htons((uint16_t) new_tos)); + *field = new_tos; +} + +static void +dp_netdev_set_ip_ttl(struct ip_header *nh, uint8_t new_ttl) +{ + uint8_t *field = &nh->ip_ttl; + + nh->ip_csum = recalc_csum16(nh->ip_csum, htons(*field << 8), + htons(new_ttl << 8)); + *field = new_ttl; } static void @@ -1132,6 +1115,9 @@ dp_netdev_set_ipv4(struct ofpbuf *packet, const struct ovs_key_ipv4 *ipv4_key) if (nh->ip_tos != ipv4_key->ipv4_tos) { dp_netdev_set_ip_tos(nh, ipv4_key->ipv4_tos); } + if (nh->ip_ttl != ipv4_key->ipv4_ttl) { + dp_netdev_set_ip_ttl(nh, ipv4_key->ipv4_ttl); + } } static void @@ -1263,6 +1249,8 @@ execute_set_action(struct ofpbuf *packet, const struct nlattr *a) enum ovs_key_attr type = nl_attr_type(a); switch (type) { case OVS_KEY_ATTR_TUN_ID: + case OVS_KEY_ATTR_PRIORITY: + /* not implemented */ break; case OVS_KEY_ATTR_ETHERNET: @@ -1286,10 +1274,11 @@ execute_set_action(struct ofpbuf *packet, const struct nlattr *a) break; case OVS_KEY_ATTR_UNSPEC: + case OVS_KEY_ATTR_ENCAP: case OVS_KEY_ATTR_ETHERTYPE: case OVS_KEY_ATTR_IPV6: case OVS_KEY_ATTR_IN_PORT: - case OVS_KEY_ATTR_8021Q: + case OVS_KEY_ATTR_VLAN: case OVS_KEY_ATTR_ICMP: case OVS_KEY_ATTR_ICMPV6: case OVS_KEY_ATTR_ARP: @@ -1310,8 +1299,7 @@ dp_netdev_execute_actions(struct dp_netdev *dp, unsigned int left; NL_ATTR_FOR_EACH_UNSAFE (a, left, actions, actions_len) { - const struct nlattr *nested; - const struct ovs_key_8021q *q_key; + const struct ovs_action_push_vlan *vlan; int type = nl_attr_type(a); switch ((enum ovs_action_attr) type) { @@ -1323,15 +1311,12 @@ dp_netdev_execute_actions(struct dp_netdev *dp, dp_netdev_action_userspace(dp, packet, key, a); break; - case OVS_ACTION_ATTR_PUSH: - nested = nl_attr_get(a); - assert(nl_attr_type(nested) == OVS_KEY_ATTR_8021Q); - q_key = nl_attr_get_unspec(nested, sizeof(*q_key)); - eth_push_vlan(packet, q_key->q_tci); + case OVS_ACTION_ATTR_PUSH_VLAN: + vlan = nl_attr_get(a); + eth_push_vlan(packet, vlan->vlan_tci & ~htons(VLAN_CFI)); break; - case OVS_ACTION_ATTR_POP: - assert(nl_attr_get_u16(a) == OVS_KEY_ATTR_8021Q); + case OVS_ACTION_ATTR_POP_VLAN: dp_netdev_pop_vlan(packet); break; @@ -1343,11 +1328,6 @@ dp_netdev_execute_actions(struct dp_netdev *dp, dp_netdev_sample(dp, packet, key, a); break; - case OVS_ACTION_ATTR_SET_PRIORITY: - case OVS_ACTION_ATTR_POP_PRIORITY: - /* not implemented */ - break; - case OVS_ACTION_ATTR_UNSPEC: case __OVS_ACTION_ATTR_MAX: NOT_REACHED(); @@ -1364,8 +1344,6 @@ const struct dpif_class dpif_netdev_class = { dpif_netdev_run, dpif_netdev_wait, dpif_netdev_get_stats, - dpif_netdev_get_drop_frags, - dpif_netdev_set_drop_frags, dpif_netdev_port_add, dpif_netdev_port_del, dpif_netdev_port_query_by_number,