public inbox for b.a.t.m.a.n@lists.open-mesh.org
 help / color / mirror / Atom feed
From: Marco Dalla Torre <marco.dallato@gmail.com>
To: The list for a Better Approach To Mobile Ad-hoc Networking
	<b.a.t.m.a.n@lists.open-mesh.org>
Subject: [B.A.T.M.A.N.] [PATCH] batctl: add sys framework for VLAN support
Date: Tue, 27 Aug 2013 14:29:40 +0200	[thread overview]
Message-ID: <521C9BB4.2010306@gmail.com> (raw)
In-Reply-To: <y>

[-- Attachment #1: Type: text/plain, Size: 3435 bytes --]

Version 2 - code style fixes

If no directory entry corresponding to the user-selected device is found 
at the
standard location for non VLAN interfaces (/sys/class/net/${base_device}),
'batctl' now looks into directory:
      /sys/devices/virtual/net/${base_device}/mesh/vlan${vid}
Where:
     -${base_device}: the batman device on top of which the VLAN is sitting
     -${device}: the device interface for the VLAN,
     -${vid}: the identifier assigned to the VLAN.

Information on VLAN devices (base device, vid) necessary to construct the
directory path is acquired by parsing /proc/net/vlan/${device}.

If the user-selected command is not supported by the VLAN, an appropriate
error is shown.
---
  functions.c |  3 +++
  sys.c       | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
  2 files changed, 54 insertions(+)

diff --git a/functions.c b/functions.c
index cc05a48..ed010ea 100644
--- a/functions.c
+++ b/functions.c
@@ -135,6 +135,9 @@ static void file_open_problem_dbg(char *dir, char 
*fname, char *full_path)
  			fprintf(stderr, "Error - the folder '/sys/' was not found on the 
system\n");
  			fprintf(stderr, "Please make sure that the sys filesystem is 
properly mounted\n");
  			return;
+		} else if (strstr(dir, "/sys/devices/virtual/")) {
+			fprintf(stderr, "The selected feature '%s' is not supported for 
vlans\n", fname);
+			return;
  		}
  	}
  diff --git a/sys.c b/sys.c
index b1d7ea8..942ead0 100644
--- a/sys.c
+++ b/sys.c
@@ -371,6 +371,37 @@ static void settings_usage(int setting)
  	fprintf(stderr, " \t -h print this help\n");
  }
  +int get_basedev_vid(char *mesh_iface, char **base_dev, unsigned short 
*vid)
+{
+	char *vdev;
+	char line[100];
+	const char path[] = "/proc/net/vlan/";
+	int size = sizeof(path) + sizeof(mesh_iface);
+	FILE *fp = NULL;
+
+	char *fpath = malloc(size);
+	strcpy(fpath, path);
+	/* prepare path file path: /proc/net/vlan/$mesh_iface*/
+	strcat(fpath, mesh_iface);
+
+	fp = fopen(fpath, "r");
+	if (fp == NULL)
+		return 1;
+
+	if (fscanf(fp, "%ms %*s %hu %*s %*d %*s %*d", &vdev, vid) == 0)
+		return 0;
+
+	while (fgets(line, sizeof(line), fp) != NULL) {
+		if (sscanf(line, "Device: %ms", base_dev) == 1)
+			break;
+	}
+	// handle base device not found case
+	if (*base_dev == NULL)
+		return 0;
+
+	return 1;
+}
+
  int handle_sys_setting(char *mesh_iface, int setting, int argc, char 
**argv)
  {
  	int optchar, res = EXIT_FAILURE;
@@ -392,6 +423,26 @@ int handle_sys_setting(char *mesh_iface, int 
setting, int argc, char **argv)
  	snprintf(path_buff, PATH_BUFF_LEN, SYS_BATIF_PATH_FMT, mesh_iface);
  	path_buff[PATH_BUFF_LEN - 1] = '\0';
  +	if (access(path_buff, F_OK) != 0) {
+		if (errno == ENOENT) {
+			// path does not exist, no lan interface: check vlan
+			unsigned short vid = 0;
+			char *base_dev = NULL;
+			if (get_basedev_vid(mesh_iface, &base_dev, &vid) == 1) {
+				free(path_buff);
+				char sys_vlan_path[] = "/sys/devices/virtual/net/%s/mesh/vlan%d/";
+				int size = sizeof(sys_vlan_path) + sizeof(base_dev);
+				path_buff = malloc(size);
+				sprintf(path_buff, sys_vlan_path, base_dev, vid);
+			}
+		}
+		if (errno == ENOTDIR) {
+			// not a directory, something wrong here
+			fprintf(stderr, "Error - expected directory at '%s'\n",
+				path_buff);
+			return EXIT_FAILURE;
+		}
+	}
  	if (argc == 1) {
  		res = read_file(path_buff, (char *)batctl_settings[setting].sysfs_name,
  				NO_FLAGS, 0, 0, 0);
-- 
1.8.3.2


[-- Attachment #2: Attached Message Part --]
[-- Type: text/plain, Size: 0 bytes --]



             reply	other threads:[~2013-08-27 12:29 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-08-27 12:29 Marco Dalla Torre [this message]
2013-08-28 15:05 ` [B.A.T.M.A.N.] [PATCH] batctl: add sys framework for VLAN support Antonio Quartulli
2013-08-29 12:18 ` Marek Lindner
2013-08-29 15:15   ` [B.A.T.M.A.N.] [PATCHv3] " Marco Dalla Torre
2013-08-29 18:43   ` Marco Dalla Torre
2013-09-02  7:03     ` Antonio Quartulli
2013-09-03 12:45       ` [B.A.T.M.A.N.] [PATCHv4] " Marco Dalla Torre
2013-09-04  6:48         ` Marek Lindner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=521C9BB4.2010306@gmail.com \
    --to=marco.dallato@gmail.com \
    --cc=b.a.t.m.a.n@lists.open-mesh.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox