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

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