diff options
author | Joe Stringer <joestringer@nicira.com> | 2015-08-26 14:31:45 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-08-27 14:40:42 -0400 |
commit | be26b9a88fcee570796c67701f50800039e25aec (patch) | |
tree | 4378b79e91b6bc0511217dbe8958ba70bfbac569 | |
parent | 8e2fed1c0cfbb29995a4301060acc0ef4ee84420 (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.c | 52 | ||||
-rw-r--r-- | net/openvswitch/datapath.h | 4 |
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 | |||
192 | static int set_mpls(struct sk_buff *skb, struct sw_flow_key *flow_key, | 188 | static 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 | ||
252 | static int set_eth_addr(struct sk_buff *skb, struct sw_flow_key *flow_key, | 248 | static 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, | |||
338 | static void mask_ipv6_addr(const __be32 old[4], const __be32 addr[4], | 334 | static 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 | ||
347 | static void set_ipv6_addr(struct sk_buff *skb, u8 l4_proto, | 343 | static 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, | |||
358 | static void set_ipv6_fl(struct ipv6hdr *nh, u32 fl, u32 mask) | 354 | static 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 | ||
366 | static void set_ip_ttl(struct sk_buff *skb, struct iphdr *nh, u8 new_ttl, | 362 | static 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); | |||
200 | int action_fifos_init(void); | 200 | int action_fifos_init(void); |
201 | void action_fifos_exit(void); | 201 | void 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, ...) \ |
204 | do { \ | 208 | do { \ |
205 | if (logging_allowed && net_ratelimit()) \ | 209 | if (logging_allowed && net_ratelimit()) \ |