X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fdpif-netdev.c;h=53574aa03aa910b443a1a3edde20f3fc2f40d13a;hb=7fae24e67c95b1dbe93497135ae533e39b61e110;hp=5efc8697b0c9fc3b9cce0962a740384f54fd52a6;hpb=7c66b273a2addd3f6c60b6c930464d6be74df71e;p=openvswitch diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 5efc8697..53574aa0 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -114,7 +114,7 @@ struct dp_netdev_flow { long long int used; /* Last used time, in monotonic msecs. */ long long int packet_count; /* Number of packets matched. */ long long int byte_count; /* Number of bytes matched. */ - uint16_t tcp_ctl; /* Bitwise-OR of seen tcp_ctl values. */ + ovs_be16 tcp_ctl; /* Bitwise-OR of seen tcp_ctl values. */ /* Actions. */ struct nlattr *actions; @@ -1090,52 +1090,44 @@ dp_netdev_port_input(struct dp_netdev *dp, struct dp_netdev_port *port, } static void -dp_netdev_run(void) +dpif_netdev_run(struct dpif *dpif) { - struct shash_node *node; + struct dp_netdev *dp = get_dp_netdev(dpif); + struct dp_netdev_port *port; struct ofpbuf packet; ofpbuf_init(&packet, DP_NETDEV_HEADROOM + VLAN_ETH_HEADER_LEN + max_mtu); - SHASH_FOR_EACH (node, &dp_netdevs) { - struct dp_netdev *dp = node->data; - struct dp_netdev_port *port; - - LIST_FOR_EACH (port, node, &dp->port_list) { - int error; - - /* Reset packet contents. */ - ofpbuf_clear(&packet); - ofpbuf_reserve(&packet, DP_NETDEV_HEADROOM); - error = netdev_recv(port->netdev, &packet); - if (!error) { - dp_netdev_port_input(dp, port, &packet); - } else if (error != EAGAIN && error != EOPNOTSUPP) { - static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5); - VLOG_ERR_RL(&rl, "error receiving data from %s: %s", - netdev_get_name(port->netdev), strerror(error)); - } + LIST_FOR_EACH (port, node, &dp->port_list) { + int error; + + /* Reset packet contents. */ + ofpbuf_clear(&packet); + ofpbuf_reserve(&packet, DP_NETDEV_HEADROOM); + + error = netdev_recv(port->netdev, &packet); + if (!error) { + dp_netdev_port_input(dp, port, &packet); + } else if (error != EAGAIN && error != EOPNOTSUPP) { + static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5); + VLOG_ERR_RL(&rl, "error receiving data from %s: %s", + netdev_get_name(port->netdev), strerror(error)); } } ofpbuf_uninit(&packet); } static void -dp_netdev_wait(void) +dpif_netdev_wait(struct dpif *dpif) { - struct shash_node *node; - - SHASH_FOR_EACH (node, &dp_netdevs) { - struct dp_netdev *dp = node->data; - struct dp_netdev_port *port; + struct dp_netdev *dp = get_dp_netdev(dpif); + struct dp_netdev_port *port; - LIST_FOR_EACH (port, node, &dp->port_list) { - netdev_recv_wait(port->netdev); - } + LIST_FOR_EACH (port, node, &dp->port_list) { + netdev_recv_wait(port->netdev); } } - static void dp_netdev_strip_vlan(struct ofpbuf *packet) { @@ -1182,7 +1174,7 @@ dp_netdev_set_nw_addr(struct ofpbuf *packet, const struct flow *key, struct ip_header *nh = packet->l3; ovs_be32 ip = nl_attr_get_be32(a); uint16_t type = nl_attr_type(a); - uint32_t *field; + ovs_be32 *field; field = type == ODP_ACTION_ATTR_SET_NW_SRC ? &nh->ip_src : &nh->ip_dst; if (key->nw_proto == IPPROTO_TCP && packet->l7) { @@ -1193,7 +1185,7 @@ dp_netdev_set_nw_addr(struct ofpbuf *packet, const struct flow *key, if (uh->udp_csum) { uh->udp_csum = recalc_csum32(uh->udp_csum, *field, ip); if (!uh->udp_csum) { - uh->udp_csum = 0xffff; + uh->udp_csum = htons(0xffff); } } } @@ -1226,7 +1218,7 @@ dp_netdev_set_tp_port(struct ofpbuf *packet, const struct flow *key, if (is_ip(packet, key)) { uint16_t type = nl_attr_type(a); ovs_be16 port = nl_attr_get_be16(a); - uint16_t *field; + ovs_be16 *field; if (key->nw_proto == IPPROTO_TCP && packet->l7) { struct tcp_header *th = packet->l4; @@ -1378,12 +1370,12 @@ dp_netdev_execute_actions(struct dp_netdev *dp, const struct dpif_class dpif_netdev_class = { "netdev", - dp_netdev_run, - dp_netdev_wait, NULL, /* enumerate */ dpif_netdev_open, dpif_netdev_close, dpif_netdev_destroy, + dpif_netdev_run, + dpif_netdev_wait, dpif_netdev_get_stats, dpif_netdev_get_drop_frags, dpif_netdev_set_drop_frags,