Blame SOURCES/open-lldp-v1.0.1-26-lldpad-system-capability-incorrect-advertised-as-sta.patch

df64a6
From 036e314bd93602f7388262cc37faf8b626980af1 Mon Sep 17 00:00:00 2001
df64a6
From: Gary Loughnane <gary.loughnane@intel.com>
df64a6
Date: Mon, 17 Aug 2015 21:19:24 +0000
df64a6
Subject: [PATCH] lldpad: system capability incorrect advertised as station
df64a6
 only
df64a6
df64a6
Fix system capability TLV on switch. On our switches we have found
df64a6
that the system capability was being advertised as Station Only. This
df64a6
patch changes the capability to Bridge.
df64a6
df64a6
Signed-off-by: Gary Loughnane <gary.loughnane@intel.com>
df64a6
Signed-off-by: John Fastabend <john.r.fastabend@intel.com>
df64a6
---
df64a6
 include/lldp_util.h |  1 +
df64a6
 lldp_util.c         | 22 +++++++++++++++++++++-
df64a6
 2 files changed, 22 insertions(+), 1 deletion(-)
df64a6
df64a6
diff --git a/include/lldp_util.h b/include/lldp_util.h
df64a6
index 878426b..69b67b1 100644
df64a6
--- a/include/lldp_util.h
df64a6
+++ b/include/lldp_util.h
df64a6
@@ -125,6 +125,7 @@ int is_active(const char *ifname);
df64a6
 int is_bond(const char *ifname);
df64a6
 int is_san_mac(u8 *addr);
df64a6
 int is_bridge(const char *ifname);
df64a6
+int is_bridge_port(const char *ifname);
df64a6
 int is_vlan(const char *ifname);
df64a6
 int is_vlan_capable(const char *ifname);
df64a6
 int is_wlan(const char *ifname);
df64a6
diff --git a/lldp_util.c b/lldp_util.c
df64a6
index f1fb7b9..62f0af8 100644
df64a6
--- a/lldp_util.c
df64a6
+++ b/lldp_util.c
df64a6
@@ -580,6 +580,26 @@ int is_bridge(const char *ifname)
df64a6
 	return rc;
df64a6
 }
df64a6
 
df64a6
+int is_bridge_port(const char *ifname)
df64a6
+{
df64a6
+	int rc = 0;
df64a6
+	char path[256];
df64a6
+	DIR *dirp;
df64a6
+
df64a6
+	if (!is_ether(ifname)) {
df64a6
+		return 0;
df64a6
+	}
df64a6
+	/* check if the given ifname is a bridge port in sysfs */
df64a6
+	snprintf(path, sizeof(path), "/sys/class/net/%s/brport/", ifname);
df64a6
+	dirp = opendir(path);
df64a6
+	if (dirp) {
df64a6
+		closedir(dirp);
df64a6
+		rc = 1;
df64a6
+	}
df64a6
+
df64a6
+	return rc;
df64a6
+}
df64a6
+
df64a6
 int is_vlan(const char *ifname)
df64a6
 {
df64a6
 	int fd;
df64a6
@@ -942,7 +962,7 @@ u16 get_caps(const char *ifname)
df64a6
 	if (is_vlan(ifname))
df64a6
 		caps |= SYSCAP_CVLAN;
df64a6
 
df64a6
-	if (is_bridge(ifname))
df64a6
+	if (is_bridge_port(ifname))
df64a6
 		caps |= SYSCAP_BRIDGE;
df64a6
 
df64a6
 	if (is_router())
df64a6
-- 
df64a6
2.5.0
df64a6