Re: Resend: [IPROUTE2 PATCH] Interface group as new ip link option
On Tue, 2007-16-10 at 13:47 +0200, Laszlo Attila Toth wrote: > Hm, the main problem (for me) is that it requires more then one value > per net device and it should be limited. But if I say it is 5 for > instance, anyone can say it is not enough for him. Yes, those pesky humans, you give them an inch and they want a mile ;-> I think 32 for example is better than 1. So if you use a u32 variable doesnt pollute the netdevice that much - and used as a bitmap, then setting any of the 32 bits implies the device is in that group. This of course limits the group ids to be (1..32). Your mileage may vary. > ip link set ppp0 group 10 > also if "ip link set..." works for multiple interfaces it is already > done. If it is not, it will affect positively all other settings :) nice. The part that is not very useful today with ifconfig or ip link ls is i have only two choices: Either i ask for all devices or for one; i cant ask for something in the middle. If i can group them together then i can solve that problem sith some user space plumbing (which avoids 10K netlink messages). "get ppp*" may actually be a totally separate call which also traverses the list in the kernel and just returns the matching devices. cheers, jamal - To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: Resend: [IPROUTE2 PATCH] Interface group as new ip link option
jamal írta: On Tue, 2007-16-10 at 13:05 +0200, Laszlo Attila Toth wrote: That sounds great but for what whould you like to use? It may help me for the implementation. For example i may want to add a tc rule to a group of interfaces. tc BNF roughly looks like: tc Where targe is := It may be useful to extend "target" to include alternatively a group of devices. Ok, I see. Currently it is not available since the the net_device structure holds the group id and for this get operation an iteration (of net_devices) may be necessary... I understand - but i would rather do the iteration in the kernel than in user space and save myself a gazillion netlink messages. You are right - that's faster in the kernel and useless to move it to userspace. We didn't want to use multiple groups in favour of masked group ids. What kind of usage needs other implementation? Same lazyperson use cases as above; in one case i may want to set a rule to group = {eth0, eth1, eth10} and in another {eth0,eth5}. I realize this may be more involved something clever for an implementation (eg using a bitmap instead of a straight int) - so if it not a simple thing, just defer it to some later time. Hm, the main problem (for me) is that it requires more then one value per net device and it should be limited. But if I say it is 5 for instance, anyone can say it is not enough for him. Ok, now that you are asking, heres another one feature request for you;-> It would be nice if i can set a group based on a regular expression of a devices name; eg "ppp*". Use case for this, off top of my head (without looking at your syntax): ip set group 10 ppp* ip link set ppp0 group 10 also if "ip link set..." works for multiple interfaces it is already done. If it is not, it will affect positively all other settings :) -- Attila - To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: Resend: [IPROUTE2 PATCH] Interface group as new ip link option
On Tue, 2007-16-10 at 13:05 +0200, Laszlo Attila Toth wrote: > That sounds great but for what whould you like to use? It may help me > for the implementation. For example i may want to add a tc rule to a group of interfaces. tc BNF roughly looks like: tc Where targe is := It may be useful to extend "target" to include alternatively a group of devices. The way i would see that done is to add a little wrapper to tc to first ask the kernel for a list of interfaces and then invoke each with the equivalent of current syntax. Did that make sense? > Currently it is not available since the the > net_device structure holds the group id and for this get operation an > iteration (of net_devices) may be necessary... I understand - but i would rather do the iteration in the kernel than in user space and save myself a gazillion netlink messages. > We didn't want to use multiple groups in favour of masked group ids. > What kind of usage needs other implementation? Same lazyperson use cases as above; in one case i may want to set a rule to group = {eth0, eth1, eth10} and in another {eth0,eth5}. I realize this may be more involved something clever for an implementation (eg using a bitmap instead of a straight int) - so if it not a simple thing, just defer it to some later time. Ok, now that you are asking, heres another one feature request for you;-> It would be nice if i can set a group based on a regular expression of a devices name; eg "ppp*". Use case for this, off top of my head (without looking at your syntax): ip set group 10 ppp* And equivalent to "ifconfig ppp*" so i dont list 10K interfaces ip list group 10 or pass any 5K messages to user space cheers, jamal - To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: Resend: [IPROUTE2 PATCH] Interface group as new ip link option
jamal írta: On Tue, 2007-16-10 at 11:03 +0200, Laszlo Attila Toth wrote: Interfaces can be grouped and each group has an unique positive integer ID. It can be set via ip link. Feature request: Can you also implement a get operation. Perhaps something that returns from the kernel a list of ifindices when one passes a group to it? That sounds great but for what whould you like to use? It may help me for the implementation. Currently it is not available since the the net_device structure holds the group id and for this get operation an iteration (of net_devices) may be necessary... BTW, does it make sense to have one interface in multiple groups? We didn't want to use multiple groups in favour of masked group ids. What kind of usage needs other implementation? -- Attila - To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: Resend: [IPROUTE2 PATCH] Interface group as new ip link option
On Tue, 2007-16-10 at 11:03 +0200, Laszlo Attila Toth wrote: > Interfaces can be grouped and each group has an unique positive integer ID. > It can be set via ip link. Feature request: Can you also implement a get operation. Perhaps something that returns from the kernel a list of ifindices when one passes a group to it? BTW, does it make sense to have one interface in multiple groups? cheers, jamal - To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: Resend: [IPROUTE2 PATCH] Interface group as new ip link option
Laszlo Attila Toth wrote: +static int set_group(const char *dev, int ifgroup) +{ + struct { + struct nlmsghdr n; + struct ifinfomsgifi; + charbuf[256]; + } req; + struct rtnl_handle rth; + + memset(&req, 0, sizeof(req)); + req.n.nlmsg_len = NLMSG_LENGTH(sizeof(req.ifi)); + req.n.nlmsg_flags = NLM_F_REQUEST; + req.n.nlmsg_type = RTM_SETLINK; + + req.ifi.ifi_index = -1; + + addattr_l(&req.n, sizeof(req), IFLA_IFNAME, dev, strlen(dev)+1); + addattr_l(&req.n, sizeof(req), IFLA_IFGROUP, &ifgroup, sizeof(ifgroup)); + if (rtnl_open(&rth, 0) < 0) + exit(1); + if (rtnl_talk(&rth, &req.n, 0, 0, NULL, NULL, NULL) < 0) + return -1; + rtnl_close(&rth); + return 0; +} + static int get_address(const char *dev, int *htype) { struct ifreq ifr; @@ -545,6 +582,7 @@ static int do_set(int argc, char **argv) __u32 mask = 0; __u32 flags = 0; int qlen = -1; + __u32 group = 0; int mtu = -1; char *newaddr = NULL; char *newbrd = NULL; @@ -577,6 +615,13 @@ static int do_set(int argc, char **argv) duparg("txqueuelen", *argv); if (get_integer(&qlen, *argv, 0)) invarg("Invalid \"txqueuelen\" value\n", *argv); + } else if (matches(*argv, "group") == 0) { + NEXT_ARG(); + if (group != 0) + duparg("group", *argv); + + if (rtnl_ifgroup_a2n(&group, *argv) || group == 0) + invarg("\"group\" value is invalid\n", *argv); } else if (strcmp(*argv, "mtu") == 0) { NEXT_ARG(); if (mtu != -1) @@ -696,6 +741,10 @@ static int do_set(int argc, char **argv) return -1; } } + if (group) { + if (set_group(dev, group) < 0) + return -1; + } This part looks useless, for new kernels iproute always uses netlink to configure things and old kernels don't support this feature. So there's no need to support it in the ioctl-based configuration path. - To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html