All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH net-next 0/4] bridge: add support for PIM hello router ports
@ 2016-10-31 12:21 Nikolay Aleksandrov
  2016-10-31 12:21 ` [PATCH net-next 1/4] net: pim: add common pimhdr struct and helpers Nikolay Aleksandrov
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Nikolay Aleksandrov @ 2016-10-31 12:21 UTC (permalink / raw)
  To: netdev; +Cc: roopa, dwalton, stephen, davem, Nikolay Aleksandrov

Hi,
The first 3 patches of this set do minor cleanups and add some helpers to
the PIM header file. Patch 4 adds a way to detect mcast router ports via
PIM hello messages, they're marked as temporary and are not considered for
querier. There's more detailed information in patch 4's commit message.

Thanks,
 Nik


Nikolay Aleksandrov (4):
  net: pim: add common pimhdr struct and helpers
  net: pim: add a helper to check for IPv4 all pim routers address
  net: pim: add all RFC7761 message types
  bridge: mcast: add router port on PIM hello message

 include/linux/pim.h       | 81 +++++++++++++++++++++++++++++++++++++++++------
 net/bridge/br_multicast.c | 22 ++++++++++++-
 net/ipv4/ipmr.c           |  2 +-
 net/ipv6/ip6mr.c          |  2 +-
 4 files changed, 95 insertions(+), 12 deletions(-)

-- 
2.1.4

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH net-next 1/4] net: pim: add common pimhdr struct and helpers
  2016-10-31 12:21 [PATCH net-next 0/4] bridge: add support for PIM hello router ports Nikolay Aleksandrov
@ 2016-10-31 12:21 ` Nikolay Aleksandrov
  2016-10-31 12:21 ` [PATCH net-next 2/4] net: pim: add a helper to check for IPv4 all pim routers address Nikolay Aleksandrov
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Nikolay Aleksandrov @ 2016-10-31 12:21 UTC (permalink / raw)
  To: netdev; +Cc: roopa, dwalton, stephen, davem, Nikolay Aleksandrov

Add the common pimhdr structure and helpers to access it, also cleanup the
format of the header file.

Signed-off-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
---
 include/linux/pim.h | 44 ++++++++++++++++++++++++++++++++++++--------
 1 file changed, 36 insertions(+), 8 deletions(-)

diff --git a/include/linux/pim.h b/include/linux/pim.h
index e1d756f81348..354235a2691b 100644
--- a/include/linux/pim.h
+++ b/include/linux/pim.h
@@ -1,6 +1,7 @@
 #ifndef __LINUX_PIM_H
 #define __LINUX_PIM_H
 
+#include <linux/skbuff.h>
 #include <asm/byteorder.h>
 
 /* Message types - V1 */
@@ -13,20 +14,47 @@
 
 #define PIM_NULL_REGISTER	cpu_to_be32(0x40000000)
 
-static inline bool ipmr_pimsm_enabled(void)
-{
-	return IS_BUILTIN(CONFIG_IP_PIMSM_V1) || IS_BUILTIN(CONFIG_IP_PIMSM_V2);
-}
+/* RFC7761, sec 4.9:
+ * The PIM header common to all PIM messages is:
+ *   0                   1                   2                   3
+ *   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |PIM Ver| Type  |   Reserved    |           Checksum            |
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+struct pimhdr {
+	__u8	type;
+	__u8	reserved;
+	__be16	csum;
+};
 
 /* PIMv2 register message header layout (ietf-draft-idmr-pimvsm-v2-00.ps */
-struct pimreghdr
-{
+struct pimreghdr {
 	__u8	type;
 	__u8	reserved;
 	__be16	csum;
 	__be32	flags;
 };
 
-struct sk_buff;
-extern int pim_rcv_v1(struct sk_buff *);
+int pim_rcv_v1(struct sk_buff *skb);
+
+static inline bool ipmr_pimsm_enabled(void)
+{
+	return IS_BUILTIN(CONFIG_IP_PIMSM_V1) || IS_BUILTIN(CONFIG_IP_PIMSM_V2);
+}
+
+static inline struct pimhdr *pim_hdr(const struct sk_buff *skb)
+{
+	return (struct pimhdr *)skb_transport_header(skb);
+}
+
+static inline u8 pim_hdr_version(const struct pimhdr *pimhdr)
+{
+	return pimhdr->type >> 4;
+}
+
+static inline u8 pim_hdr_type(const struct pimhdr *pimhdr)
+{
+	return pimhdr->type & 0xf;
+}
 #endif
-- 
2.1.4

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH net-next 2/4] net: pim: add a helper to check for IPv4 all pim routers address
  2016-10-31 12:21 [PATCH net-next 0/4] bridge: add support for PIM hello router ports Nikolay Aleksandrov
  2016-10-31 12:21 ` [PATCH net-next 1/4] net: pim: add common pimhdr struct and helpers Nikolay Aleksandrov
@ 2016-10-31 12:21 ` Nikolay Aleksandrov
  2016-10-31 12:21 ` [PATCH net-next 3/4] net: pim: add all RFC7761 message types Nikolay Aleksandrov
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Nikolay Aleksandrov @ 2016-10-31 12:21 UTC (permalink / raw)
  To: netdev; +Cc: roopa, dwalton, stephen, davem, Nikolay Aleksandrov

Signed-off-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
---
 include/linux/pim.h | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/include/linux/pim.h b/include/linux/pim.h
index 354235a2691b..1b6c0dbba94e 100644
--- a/include/linux/pim.h
+++ b/include/linux/pim.h
@@ -57,4 +57,10 @@ static inline u8 pim_hdr_type(const struct pimhdr *pimhdr)
 {
 	return pimhdr->type & 0xf;
 }
+
+/* check if the address is 224.0.0.13, RFC7761 sec 4.3.1 */
+static inline bool pim_ipv4_all_pim_routers(__be32 addr)
+{
+	return addr == htonl(0xE000000D);
+}
 #endif
-- 
2.1.4

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH net-next 3/4] net: pim: add all RFC7761 message types
  2016-10-31 12:21 [PATCH net-next 0/4] bridge: add support for PIM hello router ports Nikolay Aleksandrov
  2016-10-31 12:21 ` [PATCH net-next 1/4] net: pim: add common pimhdr struct and helpers Nikolay Aleksandrov
  2016-10-31 12:21 ` [PATCH net-next 2/4] net: pim: add a helper to check for IPv4 all pim routers address Nikolay Aleksandrov
@ 2016-10-31 12:21 ` Nikolay Aleksandrov
  2016-10-31 12:21 ` [PATCH net-next 4/4] bridge: mcast: add router port on PIM hello message Nikolay Aleksandrov
  2016-10-31 20:18 ` [PATCH net-next 0/4] bridge: add support for PIM hello router ports David Miller
  4 siblings, 0 replies; 6+ messages in thread
From: Nikolay Aleksandrov @ 2016-10-31 12:21 UTC (permalink / raw)
  To: netdev; +Cc: roopa, dwalton, stephen, davem, Nikolay Aleksandrov

Signed-off-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
---
 include/linux/pim.h | 31 ++++++++++++++++++++++++++++++-
 net/ipv4/ipmr.c     |  2 +-
 net/ipv6/ip6mr.c    |  2 +-
 3 files changed, 32 insertions(+), 3 deletions(-)

diff --git a/include/linux/pim.h b/include/linux/pim.h
index 1b6c0dbba94e..0e81b2778ae0 100644
--- a/include/linux/pim.h
+++ b/include/linux/pim.h
@@ -10,7 +10,36 @@
 
 /* Message types - V2 */
 #define PIM_VERSION		2
-#define PIM_REGISTER		1
+
+/* RFC7761, sec 4.9:
+ *  Type
+ *        Types for specific PIM messages.  PIM Types are:
+ *
+ *  Message Type                          Destination
+ *  ---------------------------------------------------------------------
+ *  0 = Hello                             Multicast to ALL-PIM-ROUTERS
+ *  1 = Register                          Unicast to RP
+ *  2 = Register-Stop                     Unicast to source of Register
+ *                                        packet
+ *  3 = Join/Prune                        Multicast to ALL-PIM-ROUTERS
+ *  4 = Bootstrap                         Multicast to ALL-PIM-ROUTERS
+ *  5 = Assert                            Multicast to ALL-PIM-ROUTERS
+ *  6 = Graft (used in PIM-DM only)       Unicast to RPF'(S)
+ *  7 = Graft-Ack (used in PIM-DM only)   Unicast to source of Graft
+ *                                        packet
+ *  8 = Candidate-RP-Advertisement        Unicast to Domain's BSR
+ */
+enum {
+	PIM_TYPE_HELLO,
+	PIM_TYPE_REGISTER,
+	PIM_TYPE_REGISTER_STOP,
+	PIM_TYPE_JOIN_PRUNE,
+	PIM_TYPE_BOOTSTRAP,
+	PIM_TYPE_ASSERT,
+	PIM_TYPE_GRAFT,
+	PIM_TYPE_GRAFT_ACK,
+	PIM_TYPE_CANDIDATE_RP_ADV
+};
 
 #define PIM_NULL_REGISTER	cpu_to_be32(0x40000000)
 
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c
index 5f006e13de56..51d71a70fbbe 100644
--- a/net/ipv4/ipmr.c
+++ b/net/ipv4/ipmr.c
@@ -2053,7 +2053,7 @@ static int pim_rcv(struct sk_buff *skb)
 		goto drop;
 
 	pim = (struct pimreghdr *)skb_transport_header(skb);
-	if (pim->type != ((PIM_VERSION << 4) | (PIM_REGISTER)) ||
+	if (pim->type != ((PIM_VERSION << 4) | (PIM_TYPE_REGISTER)) ||
 	    (pim->flags & PIM_NULL_REGISTER) ||
 	    (ip_compute_csum((void *)pim, sizeof(*pim)) != 0 &&
 	     csum_fold(skb_checksum(skb, 0, skb->len, 0))))
diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c
index 7f4265b1649b..52101b37ad6e 100644
--- a/net/ipv6/ip6mr.c
+++ b/net/ipv6/ip6mr.c
@@ -636,7 +636,7 @@ static int pim6_rcv(struct sk_buff *skb)
 		goto drop;
 
 	pim = (struct pimreghdr *)skb_transport_header(skb);
-	if (pim->type != ((PIM_VERSION << 4) | PIM_REGISTER) ||
+	if (pim->type != ((PIM_VERSION << 4) | PIM_TYPE_REGISTER) ||
 	    (pim->flags & PIM_NULL_REGISTER) ||
 	    (csum_ipv6_magic(&ipv6_hdr(skb)->saddr, &ipv6_hdr(skb)->daddr,
 			     sizeof(*pim), IPPROTO_PIM,
-- 
2.1.4

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH net-next 4/4] bridge: mcast: add router port on PIM hello message
  2016-10-31 12:21 [PATCH net-next 0/4] bridge: add support for PIM hello router ports Nikolay Aleksandrov
                   ` (2 preceding siblings ...)
  2016-10-31 12:21 ` [PATCH net-next 3/4] net: pim: add all RFC7761 message types Nikolay Aleksandrov
@ 2016-10-31 12:21 ` Nikolay Aleksandrov
  2016-10-31 20:18 ` [PATCH net-next 0/4] bridge: add support for PIM hello router ports David Miller
  4 siblings, 0 replies; 6+ messages in thread
From: Nikolay Aleksandrov @ 2016-10-31 12:21 UTC (permalink / raw)
  To: netdev; +Cc: roopa, dwalton, stephen, davem, Nikolay Aleksandrov

When we receive a PIM Hello message on a port we can consider that it
has a multicast router attached, thus it is correct to add it to the
router list. The only catch is it shouldn't be considered for a querier.

Using Daniel's description:
leaf-11  leaf-12  leaf-13
       \   |    /
        bridge-1
         /    \
    host-11  host-12

 - all ports in bridge-1 are in a single vlan aware bridge
 - leaf-11 is the IGMP querier
 - leaf-13 is the PIM DR
 - host-11 TXes packets to 226.10.10.10
 - bridge-1 only forwards the 226.10.10.10 traffic out the port to
   leaf-11, it should also forward this traffic out the port to leaf-13

Suggested-by: Daniel Walton <dwalton@cumulusnetworks.com>
Signed-off-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
---
 net/bridge/br_multicast.c | 22 +++++++++++++++++++++-
 1 file changed, 21 insertions(+), 1 deletion(-)

diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c
index 2136e45f5277..073d54afa056 100644
--- a/net/bridge/br_multicast.c
+++ b/net/bridge/br_multicast.c
@@ -25,6 +25,7 @@
 #include <linux/slab.h>
 #include <linux/timer.h>
 #include <linux/inetdevice.h>
+#include <linux/mroute.h>
 #include <net/ip.h>
 #if IS_ENABLED(CONFIG_IPV6)
 #include <net/ipv6.h>
@@ -1638,6 +1639,21 @@ static void br_multicast_err_count(const struct net_bridge *br,
 	u64_stats_update_end(&pstats->syncp);
 }
 
+static void br_multicast_pim(struct net_bridge *br,
+			     struct net_bridge_port *port,
+			     const struct sk_buff *skb)
+{
+	unsigned int offset = skb_transport_offset(skb);
+	struct pimhdr *pimhdr, _pimhdr;
+
+	pimhdr = skb_header_pointer(skb, offset, sizeof(_pimhdr), &_pimhdr);
+	if (!pimhdr || pim_hdr_version(pimhdr) != PIM_VERSION ||
+	    pim_hdr_type(pimhdr) != PIM_TYPE_HELLO)
+		return;
+
+	br_multicast_mark_router(br, port);
+}
+
 static int br_multicast_ipv4_rcv(struct net_bridge *br,
 				 struct net_bridge_port *port,
 				 struct sk_buff *skb,
@@ -1650,8 +1666,12 @@ static int br_multicast_ipv4_rcv(struct net_bridge *br,
 	err = ip_mc_check_igmp(skb, &skb_trimmed);
 
 	if (err == -ENOMSG) {
-		if (!ipv4_is_local_multicast(ip_hdr(skb)->daddr))
+		if (!ipv4_is_local_multicast(ip_hdr(skb)->daddr)) {
 			BR_INPUT_SKB_CB(skb)->mrouters_only = 1;
+		} else if (pim_ipv4_all_pim_routers(ip_hdr(skb)->daddr)) {
+			if (ip_hdr(skb)->protocol == IPPROTO_PIM)
+				br_multicast_pim(br, port, skb);
+		}
 		return 0;
 	} else if (err < 0) {
 		br_multicast_err_count(br, port, skb->protocol);
-- 
2.1.4

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH net-next 0/4] bridge: add support for PIM hello router ports
  2016-10-31 12:21 [PATCH net-next 0/4] bridge: add support for PIM hello router ports Nikolay Aleksandrov
                   ` (3 preceding siblings ...)
  2016-10-31 12:21 ` [PATCH net-next 4/4] bridge: mcast: add router port on PIM hello message Nikolay Aleksandrov
@ 2016-10-31 20:18 ` David Miller
  4 siblings, 0 replies; 6+ messages in thread
From: David Miller @ 2016-10-31 20:18 UTC (permalink / raw)
  To: nikolay; +Cc: netdev, roopa, dwalton, stephen

From: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
Date: Mon, 31 Oct 2016 13:21:01 +0100

> The first 3 patches of this set do minor cleanups and add some helpers to
> the PIM header file. Patch 4 adds a way to detect mcast router ports via
> PIM hello messages, they're marked as temporary and are not considered for
> querier. There's more detailed information in patch 4's commit message.

Looks pretty straight-forward and reasonable, series applied, thanks
Nikolay.

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2016-10-31 20:18 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-10-31 12:21 [PATCH net-next 0/4] bridge: add support for PIM hello router ports Nikolay Aleksandrov
2016-10-31 12:21 ` [PATCH net-next 1/4] net: pim: add common pimhdr struct and helpers Nikolay Aleksandrov
2016-10-31 12:21 ` [PATCH net-next 2/4] net: pim: add a helper to check for IPv4 all pim routers address Nikolay Aleksandrov
2016-10-31 12:21 ` [PATCH net-next 3/4] net: pim: add all RFC7761 message types Nikolay Aleksandrov
2016-10-31 12:21 ` [PATCH net-next 4/4] bridge: mcast: add router port on PIM hello message Nikolay Aleksandrov
2016-10-31 20:18 ` [PATCH net-next 0/4] bridge: add support for PIM hello router ports David Miller

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.