From 64420dfac5b1e350867da0949af5f193d9b6ca8c Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Tue, 26 Oct 2010 16:41:44 -0700 Subject: [PATCH] classifier: Move in-band set_() functions publicly available. 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 f3e34f2b7..dc2230de9 100644 --- a/lib/classifier.c +++ b/lib/classifier.c @@ -158,6 +158,69 @@ cls_rule_zero_wildcarded_fields(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 f626970c7..9c6c23962 100644 --- a/lib/classifier.h +++ b/lib/classifier.h @@ -81,6 +81,16 @@ void cls_rule_init_catchall(struct cls_rule *, unsigned int priority); void cls_rule_zero_wildcarded_fields(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 8968cff59..722c1f912 100644 --- a/ofproto/in-band.c +++ b/ofproto/in-band.c @@ -453,69 +453,6 @@ in_band_rule_check(struct in_band *in_band, const struct flow *flow, return true; } -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); } } -- 2.43.0