* [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