[Open-FCoE] [fcoemon PATCH v2 01/11] Obtain the real device of a VLAN interface using an ioctl.

Eric Multanen eric.w.multanen at intel.com
Tue Dec 15 05:00:35 UTC 2009


Obtaining the real device of a VLAN interface by parsing /proc was sometimes
failing due to fcoemon attempting to read the /proc vlan entry before it was
created.  This patch uses the GET_VLAN_REALDEV_NAME_CMD ioctl to get the real
device name.  This results in simpler and less code.

Signed-off-by: Eric Multanen <eric.w.multanen at intel.com>
---

 fcoemon.c |   80 ++++++++++++++++---------------------------------------------
 1 files changed, 21 insertions(+), 59 deletions(-)

diff --git a/fcoemon.c b/fcoemon.c
index 96c59e6..f0fa8fe 100644
--- a/fcoemon.c
+++ b/fcoemon.c
@@ -38,12 +38,14 @@
 #include <sys/queue.h>
 #include <sys/un.h>
 #include <sys/wait.h>
+#include <sys/ioctl.h>
 #include <linux/sockios.h>
 #include <linux/if.h>
 #include <linux/if_arp.h>
 #include <linux/netlink.h>
 #include <linux/rtnetlink.h>
 #include <linux/ethtool.h>
+#include <linux/if_vlan.h>
 
 #include <dcbd/dcb_types.h>
 #include <dcbd/dcbtool.h>	/* for typedef cmd_status */
@@ -377,73 +379,33 @@ static int fcm_link_init(void)
 }
 
 
-/* fcm_read_vlan - parse file for "Device" string
- * @val_buf - copy string to val_buf
- * @len - length of val_buf buffer
- * @fp - file pointer to parse
- */
-static void read_vlan(char *val_buf, size_t len,  FILE *fp)
-{
-	char *s;
-	char buf[FILE_NAME_LEN];
-
-	val_buf[0] = '\0';
-	buf[sizeof(buf) - 1] = '\0';
-	while ((s = fgets(buf, sizeof(buf) - 1, fp)) != NULL) {
-		while (isspace(*s))
-			s++;
-
-		if (*s == '\0' || *s == '#')
-			continue;
-
-		s = strstr(s, "Device:");
-		if (s == NULL)
-			continue;
-
-		while (!isspace(*s))
-			s++;
-
-		while (isspace(*s))
-			s++;
-
-		s = strncpy(val_buf, s, len);
-		while (isalnum(*s))
-			s++;
-
-		*s = '\0';
-		return;
-	}
-}
-
-
-
-
-/* fcm_vlan_dev_real_dev - parse vlan real_dev from /proc
- * @vlan_dev - vlan_dev to find real interface name for
- * @real_dev - pointer to copy real_dev to
+/* fcm_vlan_dev_real_dev - query vlan real_dev
+ * @vlan_ifname - vlan device ifname to find real interface name for
+ * @real_ifname - pointer to copy real ifname to
  *
- * This parses the /proc/net/vlan/ directory for the vlan_dev.
- * If the file exists it will parse for the real device and
- * copy it to real_dev parameter.
+ * Make an ioctl call to find the real device for vlan_ifname.
+ * Copy to real_ifname if found.
  */
 static void fcm_vlan_dev_real_dev(char *vlan_ifname, char *real_ifname)
 {
-	FILE *fp;
-	char  file[80];
+	int fd;
+	struct vlan_ioctl_args ifv;
 
-	if (opendir(VLAN_DIR)) {
-		strncpy(file, VLAN_DIR "/", sizeof(file));
-		strncat(file, vlan_ifname, sizeof(file) - strlen(file));
+	real_ifname[0] = '\0';
 
-		fp = fopen(file, "r");
-		if (fp) {
-			read_vlan(real_ifname, sizeof(real_ifname), fp);
-			fclose(fp);
-			return;
-		}
+	fd = socket(PF_INET, SOCK_DGRAM, 0);
+
+	if (fd <= 0) {
+		FCM_LOG_ERR(errno, "open vlan query socket error");
+		return;
 	}
 
-	strncpy(real_ifname, vlan_ifname, sizeof(real_ifname));
+	memset(&ifv, 0, sizeof(ifv));
+	ifv.cmd = GET_VLAN_REALDEV_NAME_CMD;
+	strncpy(ifv.device1, vlan_ifname, strlen(vlan_ifname)+1);
+	if (ioctl(fd, SIOCGIFVLAN, &ifv) == 0)
+		strncpy(real_ifname, ifv.u.device2, strlen(ifv.u.device2)+1);
+	close(fd);
 }
 
 /* fcm_is_linkinfo_vlan - parse nlmsg linkinfo rtattr for vlan kind




More information about the devel mailing list