X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fflow.c;h=2d62a12d96f676a5f31815b519c5ec75ac97a156;hb=be07be4dcba9faa181b195cdda0d8ab3761e738d;hp=8ec31ab97a364929362727e5f37a72f78896c311;hpb=993410fbc742a6beec0841a2be542c4105684e12;p=openvswitch diff --git a/lib/flow.c b/lib/flow.c index 8ec31ab9..2d62a12d 100644 --- a/lib/flow.c +++ b/lib/flow.c @@ -26,12 +26,10 @@ #include #include "byte-order.h" #include "coverage.h" -#include "dpif.h" #include "dynamic-string.h" #include "hash.h" #include "ofpbuf.h" #include "openflow/openflow.h" -#include "openvswitch/datapath-protocol.h" #include "packets.h" #include "unaligned.h" #include "vlog.h" @@ -425,26 +423,6 @@ flow_extract(struct ofpbuf *packet, ovs_be64 tun_id, uint16_t ofp_in_port, return retval; } -/* Extracts the flow stats for a packet. The 'flow' and 'packet' - * arguments must have been initialized through a call to flow_extract(). - */ -void -flow_extract_stats(const struct flow *flow, struct ofpbuf *packet, - struct dpif_flow_stats *stats) -{ - memset(stats, 0, sizeof(*stats)); - - if ((flow->dl_type == htons(ETH_TYPE_IP)) && packet->l4) { - if ((flow->nw_proto == IPPROTO_TCP) && packet->l7) { - struct tcp_header *tcp = packet->l4; - stats->tcp_flags = TCP_FLAGS(tcp->tcp_ctl); - } - } - - stats->n_bytes = packet->size; - stats->n_packets = 1; -} - /* For every bit of a field that is wildcarded in 'wildcards', sets the * corresponding bit in 'flow' to zero. */ void @@ -606,6 +584,8 @@ flow_wildcards_is_exact(const struct flow_wildcards *wc) { int i; + BUILD_ASSERT_DECL(FLOW_WC_SEQ == 1); + if (wc->wildcards || wc->tun_id_mask != htonll(UINT64_MAX) || wc->nw_src_mask != htonl(UINT32_MAX) @@ -625,6 +605,34 @@ flow_wildcards_is_exact(const struct flow_wildcards *wc) return true; } +/* Returns true if 'wc' matches every packet, false if 'wc' fixes any bits or + * fields. */ +bool +flow_wildcards_is_catchall(const struct flow_wildcards *wc) +{ + int i; + + BUILD_ASSERT_DECL(FLOW_WC_SEQ == 1); + + if (wc->wildcards != FWW_ALL + || wc->tun_id_mask != htonll(0) + || wc->nw_src_mask != htonl(0) + || wc->nw_dst_mask != htonl(0) + || wc->vlan_tci_mask != htons(0) + || !ipv6_mask_is_any(&wc->ipv6_src_mask) + || !ipv6_mask_is_any(&wc->ipv6_dst_mask)) { + return false; + } + + for (i = 0; i < FLOW_N_REGS; i++) { + if (wc->reg_masks[i] != 0) { + return false; + } + } + + return true; +} + /* Initializes 'dst' as the combination of wildcards in 'src1' and 'src2'. * That is, a bit or a field is wildcarded in 'dst' if it is wildcarded in * 'src1' or 'src2' or both. */