[ovs-dev] [nxm 32/42] classifier: Move in-band set_<field>() functions publicly available.
Justin Pettit
jpettit at nicira.com
Sat Nov 6 08:14:07 UTC 2010
Looks good.
--Justin
On Oct 28, 2010, at 10:28 AM, Ben Pfaff wrote:
> These will be useful elsewhere later.
> ---
> lib/classifier.c | 63 ++++++++++++++++++++++++++
> lib/classifier.h | 10 ++++
> ofproto/in-band.c | 127 +++++++++++++---------------------------------------
> 3 files changed, 105 insertions(+), 95 deletions(-)
>
> diff --git a/lib/classifier.c b/lib/classifier.c
> index 47da030..fa4fd06 100644
> --- a/lib/classifier.c
> +++ b/lib/classifier.c
> @@ -163,6 +163,69 @@ cls_rule_zero_wildcards(struct cls_rule *rule)
> zero_wildcards(&rule->flow, &rule->wc);
> }
>
> +void
> +cls_rule_set_in_port(struct cls_rule *rule, uint16_t odp_port)
> +{
> + rule->wc.wildcards &= ~OFPFW_IN_PORT;
> + rule->flow.in_port = odp_port;
> +}
> +
> +void
> +cls_rule_set_dl_type(struct cls_rule *rule, ovs_be16 dl_type)
> +{
> + rule->wc.wildcards &= ~OFPFW_DL_TYPE;
> + rule->flow.dl_type = dl_type;
> +}
> +
> +void
> +cls_rule_set_dl_src(struct cls_rule *rule, const uint8_t dl_src[ETH_ADDR_LEN])
> +{
> + rule->wc.wildcards &= ~OFPFW_DL_SRC;
> + memcpy(rule->flow.dl_src, dl_src, ETH_ADDR_LEN);
> +}
> +
> +void
> +cls_rule_set_dl_dst(struct cls_rule *rule, const uint8_t dl_dst[ETH_ADDR_LEN])
> +{
> + rule->wc.wildcards &= ~OFPFW_DL_DST;
> + memcpy(rule->flow.dl_dst, dl_dst, ETH_ADDR_LEN);
> +}
> +
> +void
> +cls_rule_set_tp_src(struct cls_rule *rule, ovs_be16 tp_src)
> +{
> + rule->wc.wildcards &= ~OFPFW_TP_SRC;
> + rule->flow.tp_src = tp_src;
> +}
> +
> +void
> +cls_rule_set_tp_dst(struct cls_rule *rule, ovs_be16 tp_dst)
> +{
> + rule->wc.wildcards &= ~OFPFW_TP_DST;
> + rule->flow.tp_dst = tp_dst;
> +}
> +
> +void
> +cls_rule_set_nw_proto(struct cls_rule *rule, uint8_t nw_proto)
> +{
> + rule->wc.wildcards &= ~OFPFW_NW_PROTO;
> + rule->flow.nw_proto = nw_proto;
> +}
> +
> +void
> +cls_rule_set_nw_src(struct cls_rule *rule, ovs_be32 nw_src)
> +{
> + flow_wildcards_set_nw_src_mask(&rule->wc, htonl(UINT32_MAX));
> + rule->flow.nw_src = nw_src;
> +}
> +
> +void
> +cls_rule_set_nw_dst(struct cls_rule *rule, ovs_be32 nw_dst)
> +{
> + flow_wildcards_set_nw_dst_mask(&rule->wc, htonl(UINT32_MAX));
> + rule->flow.nw_dst = nw_dst;
> +}
> +
> /* Converts 'rule' to a string and returns the string. The caller must free
> * the string (with free()). */
> char *
> diff --git a/lib/classifier.h b/lib/classifier.h
> index cb81cb6..ebcd0a7 100644
> --- a/lib/classifier.h
> +++ b/lib/classifier.h
> @@ -80,6 +80,16 @@ void cls_rule_init_catchall(struct cls_rule *, unsigned int priority);
>
> void cls_rule_zero_wildcards(struct cls_rule *);
>
> +void cls_rule_set_in_port(struct cls_rule *, uint16_t odp_port);
> +void cls_rule_set_dl_type(struct cls_rule *, ovs_be16 dl_type);
> +void cls_rule_set_dl_src(struct cls_rule *, const uint8_t[6]);
> +void cls_rule_set_dl_dst(struct cls_rule *, const uint8_t[6]);
> +void cls_rule_set_tp_src(struct cls_rule *, ovs_be16);
> +void cls_rule_set_tp_dst(struct cls_rule *, ovs_be16);
> +void cls_rule_set_nw_proto(struct cls_rule *, uint8_t);
> +void cls_rule_set_nw_src(struct cls_rule *, ovs_be32);
> +void cls_rule_set_nw_dst(struct cls_rule *, ovs_be32);
> +
> char *cls_rule_to_string(const struct cls_rule *);
> void cls_rule_print(const struct cls_rule *);
>
> diff --git a/ofproto/in-band.c b/ofproto/in-band.c
> index b6ee990..f7fd4e9 100644
> --- a/ofproto/in-band.c
> +++ b/ofproto/in-band.c
> @@ -454,69 +454,6 @@ in_band_rule_check(struct in_band *in_band, const struct flow *flow,
> }
>
> static void
> -set_in_port(struct cls_rule *rule, uint16_t odp_port)
> -{
> - rule->wc.wildcards &= ~OFPFW_IN_PORT;
> - rule->flow.in_port = odp_port;
> -}
> -
> -static void
> -set_dl_type(struct cls_rule *rule, uint16_t dl_type)
> -{
> - rule->wc.wildcards &= ~OFPFW_DL_TYPE;
> - rule->flow.dl_type = dl_type;
> -}
> -
> -static void
> -set_dl_src(struct cls_rule *rule, const uint8_t dl_src[ETH_ADDR_LEN])
> -{
> - rule->wc.wildcards &= ~OFPFW_DL_SRC;
> - memcpy(rule->flow.dl_src, dl_src, ETH_ADDR_LEN);
> -}
> -
> -static void
> -set_dl_dst(struct cls_rule *rule, const uint8_t dl_dst[ETH_ADDR_LEN])
> -{
> - rule->wc.wildcards &= ~OFPFW_DL_DST;
> - memcpy(rule->flow.dl_dst, dl_dst, ETH_ADDR_LEN);
> -}
> -
> -static void
> -set_tp_src(struct cls_rule *rule, uint16_t tp_src)
> -{
> - rule->wc.wildcards &= ~OFPFW_TP_SRC;
> - rule->flow.tp_src = tp_src;
> -}
> -
> -static void
> -set_tp_dst(struct cls_rule *rule, uint16_t tp_dst)
> -{
> - rule->wc.wildcards &= ~OFPFW_TP_DST;
> - rule->flow.tp_dst = tp_dst;
> -}
> -
> -static void
> -set_nw_proto(struct cls_rule *rule, uint8_t nw_proto)
> -{
> - rule->wc.wildcards &= ~OFPFW_NW_PROTO;
> - rule->flow.nw_proto = nw_proto;
> -}
> -
> -static void
> -set_nw_src(struct cls_rule *rule, const struct in_addr nw_src)
> -{
> - rule->wc.wildcards &= ~OFPFW_NW_SRC_MASK;
> - rule->flow.nw_src = nw_src.s_addr;
> -}
> -
> -static void
> -set_nw_dst(struct cls_rule *rule, const struct in_addr nw_dst)
> -{
> - rule->wc.wildcards &= ~OFPFW_NW_DST_MASK;
> - rule->flow.nw_dst = nw_dst.s_addr;
> -}
> -
> -static void
> make_rules(struct in_band *ib,
> void (*cb)(struct in_band *, const struct cls_rule *))
> {
> @@ -526,26 +463,26 @@ make_rules(struct in_band *ib,
> if (!eth_addr_is_zero(ib->installed_local_mac)) {
> /* (a) Allow DHCP requests sent from the local port. */
> cls_rule_init_catchall(&rule, IBR_FROM_LOCAL_DHCP);
> - set_in_port(&rule, ODPP_LOCAL);
> - set_dl_type(&rule, htons(ETH_TYPE_IP));
> - set_dl_src(&rule, ib->installed_local_mac);
> - set_nw_proto(&rule, IP_TYPE_UDP);
> - set_tp_src(&rule, htons(DHCP_CLIENT_PORT));
> - set_tp_dst(&rule, htons(DHCP_SERVER_PORT));
> + cls_rule_set_in_port(&rule, ODPP_LOCAL);
> + cls_rule_set_dl_type(&rule, htons(ETH_TYPE_IP));
> + cls_rule_set_dl_src(&rule, ib->installed_local_mac);
> + cls_rule_set_nw_proto(&rule, IP_TYPE_UDP);
> + cls_rule_set_tp_src(&rule, htons(DHCP_CLIENT_PORT));
> + cls_rule_set_tp_dst(&rule, htons(DHCP_SERVER_PORT));
> cb(ib, &rule);
>
> /* (b) Allow ARP replies to the local port's MAC address. */
> cls_rule_init_catchall(&rule, IBR_TO_LOCAL_ARP);
> - set_dl_type(&rule, htons(ETH_TYPE_ARP));
> - set_dl_dst(&rule, ib->installed_local_mac);
> - set_nw_proto(&rule, ARP_OP_REPLY);
> + cls_rule_set_dl_type(&rule, htons(ETH_TYPE_ARP));
> + cls_rule_set_dl_dst(&rule, ib->installed_local_mac);
> + cls_rule_set_nw_proto(&rule, ARP_OP_REPLY);
> cb(ib, &rule);
>
> /* (c) Allow ARP requests from the local port's MAC address. */
> cls_rule_init_catchall(&rule, IBR_FROM_LOCAL_ARP);
> - set_dl_type(&rule, htons(ETH_TYPE_ARP));
> - set_dl_src(&rule, ib->installed_local_mac);
> - set_nw_proto(&rule, ARP_OP_REQUEST);
> + cls_rule_set_dl_type(&rule, htons(ETH_TYPE_ARP));
> + cls_rule_set_dl_src(&rule, ib->installed_local_mac);
> + cls_rule_set_nw_proto(&rule, ARP_OP_REQUEST);
> cb(ib, &rule);
> }
>
> @@ -562,16 +499,16 @@ make_rules(struct in_band *ib,
>
> /* (d) Allow ARP replies to the next hop's MAC address. */
> cls_rule_init_catchall(&rule, IBR_TO_NEXT_HOP_ARP);
> - set_dl_type(&rule, htons(ETH_TYPE_ARP));
> - set_dl_dst(&rule, remote_mac);
> - set_nw_proto(&rule, ARP_OP_REPLY);
> + cls_rule_set_dl_type(&rule, htons(ETH_TYPE_ARP));
> + cls_rule_set_dl_dst(&rule, remote_mac);
> + cls_rule_set_nw_proto(&rule, ARP_OP_REPLY);
> cb(ib, &rule);
>
> /* (e) Allow ARP requests from the next hop's MAC address. */
> cls_rule_init_catchall(&rule, IBR_FROM_NEXT_HOP_ARP);
> - set_dl_type(&rule, htons(ETH_TYPE_ARP));
> - set_dl_src(&rule, remote_mac);
> - set_nw_proto(&rule, ARP_OP_REQUEST);
> + cls_rule_set_dl_type(&rule, htons(ETH_TYPE_ARP));
> + cls_rule_set_dl_src(&rule, remote_mac);
> + cls_rule_set_nw_proto(&rule, ARP_OP_REQUEST);
> cb(ib, &rule);
> }
>
> @@ -582,17 +519,17 @@ make_rules(struct in_band *ib,
> /* (f) Allow ARP replies containing the remote's IP address as a
> * target. */
> cls_rule_init_catchall(&rule, IBR_TO_REMOTE_ARP);
> - set_dl_type(&rule, htons(ETH_TYPE_ARP));
> - set_nw_proto(&rule, ARP_OP_REPLY);
> - set_nw_dst(&rule, a->sin_addr);
> + cls_rule_set_dl_type(&rule, htons(ETH_TYPE_ARP));
> + cls_rule_set_nw_proto(&rule, ARP_OP_REPLY);
> + cls_rule_set_nw_dst(&rule, a->sin_addr.s_addr);
> cb(ib, &rule);
>
> /* (g) Allow ARP requests containing the remote's IP address as a
> * source. */
> cls_rule_init_catchall(&rule, IBR_FROM_REMOTE_ARP);
> - set_dl_type(&rule, htons(ETH_TYPE_ARP));
> - set_nw_proto(&rule, ARP_OP_REQUEST);
> - set_nw_src(&rule, a->sin_addr);
> + cls_rule_set_dl_type(&rule, htons(ETH_TYPE_ARP));
> + cls_rule_set_nw_proto(&rule, ARP_OP_REQUEST);
> + cls_rule_set_nw_src(&rule, a->sin_addr.s_addr);
> cb(ib, &rule);
> }
>
> @@ -601,18 +538,18 @@ make_rules(struct in_band *ib,
> || a->sin_port != a[-1].sin_port) {
> /* (h) Allow TCP traffic to the remote's IP and port. */
> cls_rule_init_catchall(&rule, IBR_TO_REMOTE_TCP);
> - set_dl_type(&rule, htons(ETH_TYPE_IP));
> - set_nw_proto(&rule, IP_TYPE_TCP);
> - set_nw_dst(&rule, a->sin_addr);
> - set_tp_dst(&rule, a->sin_port);
> + cls_rule_set_dl_type(&rule, htons(ETH_TYPE_IP));
> + cls_rule_set_nw_proto(&rule, IP_TYPE_TCP);
> + cls_rule_set_nw_dst(&rule, a->sin_addr.s_addr);
> + cls_rule_set_tp_dst(&rule, a->sin_port);
> cb(ib, &rule);
>
> /* (i) Allow TCP traffic from the remote's IP and port. */
> cls_rule_init_catchall(&rule, IBR_FROM_REMOTE_TCP);
> - set_dl_type(&rule, htons(ETH_TYPE_IP));
> - set_nw_proto(&rule, IP_TYPE_TCP);
> - set_nw_src(&rule, a->sin_addr);
> - set_tp_src(&rule, a->sin_port);
> + cls_rule_set_dl_type(&rule, htons(ETH_TYPE_IP));
> + cls_rule_set_nw_proto(&rule, IP_TYPE_TCP);
> + cls_rule_set_nw_src(&rule, a->sin_addr.s_addr);
> + cls_rule_set_tp_src(&rule, a->sin_port);
> cb(ib, &rule);
> }
> }
> --
> 1.7.1
>
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev_openvswitch.org
More information about the dev
mailing list