aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoe Stringer <joestringer@nicira.com>2015-08-26 14:31:45 -0400
committerDavid S. Miller <davem@davemloft.net>2015-08-27 14:40:42 -0400
commitbe26b9a88fcee570796c67701f50800039e25aec (patch)
tree4378b79e91b6bc0511217dbe8958ba70bfbac569
parent8e2fed1c0cfbb29995a4301060acc0ef4ee84420 (diff)
openvswitch: Move MASKED* macros to datapath.h
This will allow the ovs-conntrack code to reuse these macros. Signed-off-by: Joe Stringer <joestringer@nicira.com> Acked-by: Thomas Graf <tgraf@suug.ch> Acked-by: Pravin B Shelar <pshelar@nicira.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--net/openvswitch/actions.c52
-rw-r--r--net/openvswitch/datapath.h4
2 files changed, 29 insertions, 27 deletions
diff --git a/net/openvswitch/actions.c b/net/openvswitch/actions.c
index 4f4200717bef..520438b77dc8 100644
--- a/net/openvswitch/actions.c
+++ b/net/openvswitch/actions.c
@@ -185,10 +185,6 @@ static int pop_mpls(struct sk_buff *skb, struct sw_flow_key *key,
185 return 0; 185 return 0;
186} 186}
187 187
188/* 'KEY' must not have any bits set outside of the 'MASK' */
189#define MASKED(OLD, KEY, MASK) ((KEY) | ((OLD) & ~(MASK)))
190#define SET_MASKED(OLD, KEY, MASK) ((OLD) = MASKED(OLD, KEY, MASK))
191
192static int set_mpls(struct sk_buff *skb, struct sw_flow_key *flow_key, 188static int set_mpls(struct sk_buff *skb, struct sw_flow_key *flow_key,
193 const __be32 *mpls_lse, const __be32 *mask) 189 const __be32 *mpls_lse, const __be32 *mask)
194{ 190{
@@ -201,7 +197,7 @@ static int set_mpls(struct sk_buff *skb, struct sw_flow_key *flow_key,
201 return err; 197 return err;
202 198
203 stack = (__be32 *)skb_mpls_header(skb); 199 stack = (__be32 *)skb_mpls_header(skb);
204 lse = MASKED(*stack, *mpls_lse, *mask); 200 lse = OVS_MASKED(*stack, *mpls_lse, *mask);
205 if (skb->ip_summed == CHECKSUM_COMPLETE) { 201 if (skb->ip_summed == CHECKSUM_COMPLETE) {
206 __be32 diff[] = { ~(*stack), lse }; 202 __be32 diff[] = { ~(*stack), lse };
207 203
@@ -244,9 +240,9 @@ static void ether_addr_copy_masked(u8 *dst_, const u8 *src_, const u8 *mask_)
244 const u16 *src = (const u16 *)src_; 240 const u16 *src = (const u16 *)src_;
245 const u16 *mask = (const u16 *)mask_; 241 const u16 *mask = (const u16 *)mask_;
246 242
247 SET_MASKED(dst[0], src[0], mask[0]); 243 OVS_SET_MASKED(dst[0], src[0], mask[0]);
248 SET_MASKED(dst[1], src[1], mask[1]); 244 OVS_SET_MASKED(dst[1], src[1], mask[1]);
249 SET_MASKED(dst[2], src[2], mask[2]); 245 OVS_SET_MASKED(dst[2], src[2], mask[2]);
250} 246}
251 247
252static int set_eth_addr(struct sk_buff *skb, struct sw_flow_key *flow_key, 248static int set_eth_addr(struct sk_buff *skb, struct sw_flow_key *flow_key,
@@ -338,10 +334,10 @@ static void update_ipv6_checksum(struct sk_buff *skb, u8 l4_proto,
338static void mask_ipv6_addr(const __be32 old[4], const __be32 addr[4], 334static void mask_ipv6_addr(const __be32 old[4], const __be32 addr[4],
339 const __be32 mask[4], __be32 masked[4]) 335 const __be32 mask[4], __be32 masked[4])
340{ 336{
341 masked[0] = MASKED(old[0], addr[0], mask[0]); 337 masked[0] = OVS_MASKED(old[0], addr[0], mask[0]);
342 masked[1] = MASKED(old[1], addr[1], mask[1]); 338 masked[1] = OVS_MASKED(old[1], addr[1], mask[1]);
343 masked[2] = MASKED(old[2], addr[2], mask[2]); 339 masked[2] = OVS_MASKED(old[2], addr[2], mask[2]);
344 masked[3] = MASKED(old[3], addr[3], mask[3]); 340 masked[3] = OVS_MASKED(old[3], addr[3], mask[3]);
345} 341}
346 342
347static void set_ipv6_addr(struct sk_buff *skb, u8 l4_proto, 343static void set_ipv6_addr(struct sk_buff *skb, u8 l4_proto,
@@ -358,15 +354,15 @@ static void set_ipv6_addr(struct sk_buff *skb, u8 l4_proto,
358static void set_ipv6_fl(struct ipv6hdr *nh, u32 fl, u32 mask) 354static void set_ipv6_fl(struct ipv6hdr *nh, u32 fl, u32 mask)
359{ 355{
360 /* Bits 21-24 are always unmasked, so this retains their values. */ 356 /* Bits 21-24 are always unmasked, so this retains their values. */
361 SET_MASKED(nh->flow_lbl[0], (u8)(fl >> 16), (u8)(mask >> 16)); 357 OVS_SET_MASKED(nh->flow_lbl[0], (u8)(fl >> 16), (u8)(mask >> 16));
362 SET_MASKED(nh->flow_lbl[1], (u8)(fl >> 8), (u8)(mask >> 8)); 358 OVS_SET_MASKED(nh->flow_lbl[1], (u8)(fl >> 8), (u8)(mask >> 8));
363 SET_MASKED(nh->flow_lbl[2], (u8)fl, (u8)mask); 359 OVS_SET_MASKED(nh->flow_lbl[2], (u8)fl, (u8)mask);
364} 360}
365 361
366static void set_ip_ttl(struct sk_buff *skb, struct iphdr *nh, u8 new_ttl, 362static void set_ip_ttl(struct sk_buff *skb, struct iphdr *nh, u8 new_ttl,
367 u8 mask) 363 u8 mask)
368{ 364{
369 new_ttl = MASKED(nh->ttl, new_ttl, mask); 365 new_ttl = OVS_MASKED(nh->ttl, new_ttl, mask);
370 366
371 csum_replace2(&nh->check, htons(nh->ttl << 8), htons(new_ttl << 8)); 367 csum_replace2(&nh->check, htons(nh->ttl << 8), htons(new_ttl << 8));
372 nh->ttl = new_ttl; 368 nh->ttl = new_ttl;
@@ -392,7 +388,7 @@ static int set_ipv4(struct sk_buff *skb, struct sw_flow_key *flow_key,
392 * makes sense to check if the value actually changed. 388 * makes sense to check if the value actually changed.
393 */ 389 */
394 if (mask->ipv4_src) { 390 if (mask->ipv4_src) {
395 new_addr = MASKED(nh->saddr, key->ipv4_src, mask->ipv4_src); 391 new_addr = OVS_MASKED(nh->saddr, key->ipv4_src, mask->ipv4_src);
396 392
397 if (unlikely(new_addr != nh->saddr)) { 393 if (unlikely(new_addr != nh->saddr)) {
398 set_ip_addr(skb, nh, &nh->saddr, new_addr); 394 set_ip_addr(skb, nh, &nh->saddr, new_addr);
@@ -400,7 +396,7 @@ static int set_ipv4(struct sk_buff *skb, struct sw_flow_key *flow_key,
400 } 396 }
401 } 397 }
402 if (mask->ipv4_dst) { 398 if (mask->ipv4_dst) {
403 new_addr = MASKED(nh->daddr, key->ipv4_dst, mask->ipv4_dst); 399 new_addr = OVS_MASKED(nh->daddr, key->ipv4_dst, mask->ipv4_dst);
404 400
405 if (unlikely(new_addr != nh->daddr)) { 401 if (unlikely(new_addr != nh->daddr)) {
406 set_ip_addr(skb, nh, &nh->daddr, new_addr); 402 set_ip_addr(skb, nh, &nh->daddr, new_addr);
@@ -488,7 +484,8 @@ static int set_ipv6(struct sk_buff *skb, struct sw_flow_key *flow_key,
488 *(__be32 *)nh & htonl(IPV6_FLOWINFO_FLOWLABEL); 484 *(__be32 *)nh & htonl(IPV6_FLOWINFO_FLOWLABEL);
489 } 485 }
490 if (mask->ipv6_hlimit) { 486 if (mask->ipv6_hlimit) {
491 SET_MASKED(nh->hop_limit, key->ipv6_hlimit, mask->ipv6_hlimit); 487 OVS_SET_MASKED(nh->hop_limit, key->ipv6_hlimit,
488 mask->ipv6_hlimit);
492 flow_key->ip.ttl = nh->hop_limit; 489 flow_key->ip.ttl = nh->hop_limit;
493 } 490 }
494 return 0; 491 return 0;
@@ -517,8 +514,8 @@ static int set_udp(struct sk_buff *skb, struct sw_flow_key *flow_key,
517 514
518 uh = udp_hdr(skb); 515 uh = udp_hdr(skb);
519 /* Either of the masks is non-zero, so do not bother checking them. */ 516 /* Either of the masks is non-zero, so do not bother checking them. */
520 src = MASKED(uh->source, key->udp_src, mask->udp_src); 517 src = OVS_MASKED(uh->source, key->udp_src, mask->udp_src);
521 dst = MASKED(uh->dest, key->udp_dst, mask->udp_dst); 518 dst = OVS_MASKED(uh->dest, key->udp_dst, mask->udp_dst);
522 519
523 if (uh->check && skb->ip_summed != CHECKSUM_PARTIAL) { 520 if (uh->check && skb->ip_summed != CHECKSUM_PARTIAL) {
524 if (likely(src != uh->source)) { 521 if (likely(src != uh->source)) {
@@ -558,12 +555,12 @@ static int set_tcp(struct sk_buff *skb, struct sw_flow_key *flow_key,
558 return err; 555 return err;
559 556
560 th = tcp_hdr(skb); 557 th = tcp_hdr(skb);
561 src = MASKED(th->source, key->tcp_src, mask->tcp_src); 558 src = OVS_MASKED(th->source, key->tcp_src, mask->tcp_src);
562 if (likely(src != th->source)) { 559 if (likely(src != th->source)) {
563 set_tp_port(skb, &th->source, src, &th->check); 560 set_tp_port(skb, &th->source, src, &th->check);
564 flow_key->tp.src = src; 561 flow_key->tp.src = src;
565 } 562 }
566 dst = MASKED(th->dest, key->tcp_dst, mask->tcp_dst); 563 dst = OVS_MASKED(th->dest, key->tcp_dst, mask->tcp_dst);
567 if (likely(dst != th->dest)) { 564 if (likely(dst != th->dest)) {
568 set_tp_port(skb, &th->dest, dst, &th->check); 565 set_tp_port(skb, &th->dest, dst, &th->check);
569 flow_key->tp.dst = dst; 566 flow_key->tp.dst = dst;
@@ -590,8 +587,8 @@ static int set_sctp(struct sk_buff *skb, struct sw_flow_key *flow_key,
590 old_csum = sh->checksum; 587 old_csum = sh->checksum;
591 old_correct_csum = sctp_compute_cksum(skb, sctphoff); 588 old_correct_csum = sctp_compute_cksum(skb, sctphoff);
592 589
593 sh->source = MASKED(sh->source, key->sctp_src, mask->sctp_src); 590 sh->source = OVS_MASKED(sh->source, key->sctp_src, mask->sctp_src);
594 sh->dest = MASKED(sh->dest, key->sctp_dst, mask->sctp_dst); 591 sh->dest = OVS_MASKED(sh->dest, key->sctp_dst, mask->sctp_dst);
595 592
596 new_csum = sctp_compute_cksum(skb, sctphoff); 593 new_csum = sctp_compute_cksum(skb, sctphoff);
597 594
@@ -770,12 +767,13 @@ static int execute_masked_set_action(struct sk_buff *skb,
770 767
771 switch (nla_type(a)) { 768 switch (nla_type(a)) {
772 case OVS_KEY_ATTR_PRIORITY: 769 case OVS_KEY_ATTR_PRIORITY:
773 SET_MASKED(skb->priority, nla_get_u32(a), *get_mask(a, u32 *)); 770 OVS_SET_MASKED(skb->priority, nla_get_u32(a),
771 *get_mask(a, u32 *));
774 flow_key->phy.priority = skb->priority; 772 flow_key->phy.priority = skb->priority;
775 break; 773 break;
776 774
777 case OVS_KEY_ATTR_SKB_MARK: 775 case OVS_KEY_ATTR_SKB_MARK:
778 SET_MASKED(skb->mark, nla_get_u32(a), *get_mask(a, u32 *)); 776 OVS_SET_MASKED(skb->mark, nla_get_u32(a), *get_mask(a, u32 *));
779 flow_key->phy.skb_mark = skb->mark; 777 flow_key->phy.skb_mark = skb->mark;
780 break; 778 break;
781 779
diff --git a/net/openvswitch/datapath.h b/net/openvswitch/datapath.h
index 6b28c5cedb23..487a85f7d967 100644
--- a/net/openvswitch/datapath.h
+++ b/net/openvswitch/datapath.h
@@ -200,6 +200,10 @@ void ovs_dp_notify_wq(struct work_struct *work);
200int action_fifos_init(void); 200int action_fifos_init(void);
201void action_fifos_exit(void); 201void action_fifos_exit(void);
202 202
203/* 'KEY' must not have any bits set outside of the 'MASK' */
204#define OVS_MASKED(OLD, KEY, MASK) ((KEY) | ((OLD) & ~(MASK)))
205#define OVS_SET_MASKED(OLD, KEY, MASK) ((OLD) = OVS_MASKED(OLD, KEY, MASK))
206
203#define OVS_NLERR(logging_allowed, fmt, ...) \ 207#define OVS_NLERR(logging_allowed, fmt, ...) \
204do { \ 208do { \
205 if (logging_allowed && net_ratelimit()) \ 209 if (logging_allowed && net_ratelimit()) \