* [IPROUTE2 PATCH][GENETLINK] Add controller support for new features exposed
@ 2006-12-06 17:35 jamal
[not found] ` <200612111737.59791.netdev@axxeo.de>
0 siblings, 1 reply; 2+ messages in thread
From: jamal @ 2006-12-06 17:35 UTC (permalink / raw)
To: Stephen Hemminger; +Cc: netdev
[-- Attachment #1: Type: text/plain, Size: 88 bytes --]
Ok, heres hopefully the last one in this series for generic netlink ..
cheers,
jamal
[-- Attachment #2: genl-p3 --]
[-- Type: text/plain, Size: 3800 bytes --]
[GENL]: Add controller support for new features exposed
Update the controller to spit out the new features being exposed
from the kernel
Signed-off-by: J Hadi Salim <hadi@cyberus.ca>
---
commit 241e28d5d5d326d33b2d71752d574e2ae118f671
tree ccda0d9dd9b85180fdd803f79ad11d305f2ffc53
parent 515370c958be14b417e20611258eecbe9fda2382
author Jamal Hadi Salim <hadi@cyberus.ca> Wed, 06 Dec 2006 12:30:36 -0500
committer Jamal Hadi Salim <hadi@cyberus.ca> Wed, 06 Dec 2006 12:30:36 -0500
genl/ctrl.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 82 insertions(+), 2 deletions(-)
diff --git a/genl/ctrl.c b/genl/ctrl.c
index 0d4750d..fe010f3 100644
--- a/genl/ctrl.c
+++ b/genl/ctrl.c
@@ -22,6 +22,7 @@
#include "utils.h"
#include "genl_utils.h"
+#define GENL_MAX_FAM_OPS 256
static int usage(void)
{
fprintf(stderr,"Usage: ctrl <CMD>\n" \
@@ -108,6 +109,51 @@ errout:
return ret;
}
+void print_ctrl_cmd_flags(FILE *fp, __u32 fl)
+{
+ fprintf(fp, "\n\t\tCapabilities (0x%x):\n ", fl);
+ if (!fl) {
+ fprintf(fp, "\n");
+ return;
+ }
+ fprintf(fp, "\t\t ");
+
+ if (fl & GENL_ADMIN_PERM)
+ fprintf(fp, " requires admin permission;");
+ if (fl & GENL_CMD_CAP_DO)
+ fprintf(fp, " can doit;");
+ if (fl & GENL_CMD_CAP_DUMP)
+ fprintf(fp, " can dumpit;");
+ if (fl & GENL_CMD_CAP_HASPOL)
+ fprintf(fp, " has policy");
+
+ fprintf(fp, "\n");
+}
+
+static int print_ctrl_cmds(FILE *fp, struct rtattr *arg, __u32 ctrl_ver)
+{
+ struct rtattr *tb[CTRL_ATTR_OP_MAX + 1];
+
+ if (arg == NULL)
+ return -1;
+
+ parse_rtattr_nested(tb, CTRL_ATTR_OP_MAX, arg);
+ if (tb[CTRL_ATTR_OP_ID]) {
+ __u32 *id = RTA_DATA(tb[CTRL_ATTR_OP_ID]);
+ fprintf(fp, " ID-0x%x ",*id);
+ }
+ /* we are only gonna do this for newer version of the controller */
+ if (tb[CTRL_ATTR_OP_FLAGS] && ctrl_ver >= 0x2) {
+ __u32 *fl = RTA_DATA(tb[CTRL_ATTR_OP_FLAGS]);
+ print_ctrl_cmd_flags(fp, *fl);
+ }
+ return 0;
+
+}
+
+/*
+ * The controller sends one nlmsg per family
+*/
static int print_ctrl(const struct sockaddr_nl *who, struct nlmsghdr *n,
void *arg)
{
@@ -116,6 +162,7 @@ static int print_ctrl(const struct sockaddr_nl *who, struct nlmsghdr *n,
int len = n->nlmsg_len;
struct rtattr *attrs;
FILE *fp = (FILE *) arg;
+ __u32 ctrl_v = 0x1;
if (n->nlmsg_type != GENL_ID_CTRL) {
fprintf(stderr, "Not a controller message, nlmsg_len=%d "
@@ -142,13 +189,46 @@ static int print_ctrl(const struct sockaddr_nl *who, struct nlmsghdr *n,
if (tb[CTRL_ATTR_FAMILY_NAME]) {
char *name = RTA_DATA(tb[CTRL_ATTR_FAMILY_NAME]);
- fprintf(fp, "Name: %s\n",name);
+ fprintf(fp, "\nName: %s\n",name);
}
if (tb[CTRL_ATTR_FAMILY_ID]) {
__u16 *id = RTA_DATA(tb[CTRL_ATTR_FAMILY_ID]);
- fprintf(fp, "ID: 0x%x\n",*id);
+ fprintf(fp, "\tID: 0x%x ",*id);
+ }
+ if (tb[CTRL_ATTR_VERSION]) {
+ __u32 *v = RTA_DATA(tb[CTRL_ATTR_VERSION]);
+ fprintf(fp, " Version: 0x%x ",*v);
+ ctrl_v = *v;
}
+ if (tb[CTRL_ATTR_HDRSIZE]) {
+ __u32 *h = RTA_DATA(tb[CTRL_ATTR_HDRSIZE]);
+ fprintf(fp, " header size: %d ",*h);
+ }
+ if (tb[CTRL_ATTR_MAXATTR]) {
+ __u32 *ma = RTA_DATA(tb[CTRL_ATTR_MAXATTR]);
+ fprintf(fp, " max attribs: %d ",*ma);
+ }
+ /* end of family definitions .. */
+ fprintf(fp,"\n");
+ if (tb[CTRL_ATTR_OPS]) {
+ struct rtattr *tb2[GENL_MAX_FAM_OPS];
+ int i=0;
+ parse_rtattr_nested(tb2, GENL_MAX_FAM_OPS, tb[CTRL_ATTR_OPS]);
+ fprintf(fp, "\tcommands supported: \n");
+ for (i = 0; i < GENL_MAX_FAM_OPS; i++) {
+ if (tb2[i]) {
+ fprintf(fp, "\t\t#%d: ", i);
+ if (0 > print_ctrl_cmds(fp, tb2[i], ctrl_v)) {
+ fprintf(fp, "Error printing command\n");
+ }
+ /* for next command */
+ fprintf(fp,"\n");
+ }
+ }
+ /* end of family::cmds definitions .. */
+ fprintf(fp,"\n");
+ }
fflush(fp);
return 0;
}
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [IPROUTE2 PATCH][GENETLINK] Add controller support for new features exposed
[not found] ` <200612111737.59791.netdev@axxeo.de>
@ 2006-12-12 1:31 ` jamal
0 siblings, 0 replies; 2+ messages in thread
From: jamal @ 2006-12-12 1:31 UTC (permalink / raw)
To: Ingo Oeser; +Cc: Stephen Hemminger, netdev
On Mon, 2006-11-12 at 17:37 +0100, Ingo Oeser wrote:
> Hi Jamal,
>
> jamal wrote:
> > +
> > + if (fl & GENL_ADMIN_PERM)
> > + fprintf(fp, " requires admin permission;");
> > + if (fl & GENL_CMD_CAP_DO)
> > + fprintf(fp, " can doit;");
> > + if (fl & GENL_CMD_CAP_DUMP)
> > + fprintf(fp, " can dumpit;");
> > + if (fl & GENL_CMD_CAP_HASPOL)
> > + fprintf(fp, " has policy");
>
> Can't you think of sth. more admin/user friendly instead of "doit" and "dumpit"?
> iproute is cryptic enough already :-)
>
I have to think a little about the best way to make this more friendly.
If you have any suggestion please shoot. Lets have Stephen merge all the
patches then we can revisit. If you have time take a look at the genl
howto that Paul Moore has been tossing around and see if you can pick
some better language.
cheers,
jamal
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2006-12-12 1:31 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-12-06 17:35 [IPROUTE2 PATCH][GENETLINK] Add controller support for new features exposed jamal
[not found] ` <200612111737.59791.netdev@axxeo.de>
2006-12-12 1:31 ` jamal
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).