Date: Tue, 4 May 2004 01:20:16 -0700 (PDT) From: Gleb Smirnoff <glebius@cell.sick.ru> To: freebsd-bugs@FreeBSD.org Subject: Re: kern/66225: Extend ng_eiface(4) control messages Message-ID: <200405040820.i448KGTg031643@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/66225; it has been noted by GNATS. From: Gleb Smirnoff <glebius@cell.sick.ru> To: Robin Breathe <robin@isometry.net> Cc: FreeBSD-gnats-submit@freebsd.org Subject: Re: kern/66225: Extend ng_eiface(4) control messages Date: Tue, 4 May 2004 12:12:42 +0400 Robin, can you take a look at these threads: http://groups.google.com/groups?threadm=c2l47t%2413rc%241%40FreeBSD.csie.NCTU.edu.tw http://groups.google.com/groups?threadm=c3etc5%2422b3%241%40FreeBSD.csie.NCTU.edu.tw May be you have some ideas/comments on this. And note, that now we have one more interface node ng_sppp and we are going to have fifth - ng_atm. I think this more general solution is better. I haven't started writing it, since I can't yet understand which approach described in above links, is prefered by developers. P.S. You have forgot to bump NGM_EIFACE_COOKIE in your patch. On Mon, May 03, 2004 at 08:59:19PM +0000, Robin Breathe wrote: R> R> >Number: 66225 R> >Category: kern R> >Synopsis: Extend ng_eiface(4) control messages R> >Confidential: no R> >Severity: non-critical R> >Priority: low R> >Responsible: freebsd-bugs R> >State: open R> >Quarter: R> >Keywords: R> >Date-Required: R> >Class: change-request R> >Submitter-Id: current-users R> >Arrival-Date: Mon May 03 14:00:38 PDT 2004 R> >Closed-Date: R> >Last-Modified: R> >Originator: Robin Breathe R> >Release: FreeBSD 5.2-CURRENT i386 R> >Organization: R> isometry.net R> >Environment: R> System: FreeBSD twiddle 5.2-CURRENT FreeBSD 5.2-CURRENT #0: Thu Apr 29 23:20:35 UTC 2004 root@twiddle:/home/data/work/usr/src/sys/TWIDDLE i386 R> R> >Description: R> - Extend the ng_eiface(4) control message set with getifaddr, getifindex, getenaddr and setenaddr, c.f. ng_ether(4). R> Allows code to get a handle on the associated ngeth# interface, and change its properties without knowing the unit number. R> - Renamed NGM_EIFACE_SET (set) to NGM_EIFACE_SET_ENADDR (setenaddr) for clarity, and to match ng_ether(4). R> - Clean up some extraneous code. R> - Increased max MTU to 9000. R> - Document the new interfaces in ng_eiface.4. R> >How-To-Repeat: R> >Fix: R> Apply the following patch in /usr/src of -CURRENT. R> R> --- ng_eiface.diff begins here --- R> diff -ruN share/man/man4/ng_eiface.4 share/man/man4/ng_eiface.4.ori R> --- share/man/man4/ng_eiface.4.ori Mon May 3 20:23:57 2004 R> +++ share/man/man4/ng_eiface.4 Mon May 3 20:35:27 2004 R> @@ -65,25 +65,21 @@ R> .Sh CONTROL MESSAGES R> This node type supports the generic control messages, plus the following: R> .Bl -tag -width indent R> -.It Dv NGM_EIFACE_SET R> -Set link-level address of the interface. R> -Requires R> -.Vt "struct ether_addr" R> -as an argument. R> -This message also has an R> -.Tn ASCII R> -version, called R> -.Dq Li set , R> -which requires as an argument an R> -.Tn ASCII R> -string consisting of 6 colon-separated hex digits. R> -.It Dv NGM_EIFACE_GET_IFNAME R> -Return the name of the associated interface as a R> +.It Dv NGM_EIFACE_GET_IFNAME Pq Li getifname R> +Returns the name of the associated interface as a R> .Dv NUL Ns -terminated R> .Tn ASCII R> string. R> -.It Dv NGM_EIFACE_GET_IFADDRS R> -Return the list of link-level addresses associated with the node. R> +.It DV NGM_EIFACE_GET_IFINDEX Pq Li getifindex R> +Returns the global index of the associated inteface as a 32-bit integer. R> +.It DV NGM_EIFACE_GET_ENADDR Pq Li getenaddr R> +Returns the associated interface's unique six-byte Ethernet address. R> +.It Dv NGM_EIFACE_SET_ENADDR Pq Li setenaddr R> +Sets the associated interface's unique six-byte Ethernet address. R> +This control message is equivalent to using the R> +.Dv SIOCIFLLADDR R> +.Xr ioctl 2 R> +system call. R> .El R> .Sh SHUTDOWN R> This node shuts down upon receipt of a R> diff -ruN sys/netgraph/ng_eiface.c sys/netgraph/ng_eiface.c.ori R> --- sys/netgraph/ng_eiface.c.ori Thu Apr 22 19:11:57 2004 R> +++ sys/netgraph/ng_eiface.c Mon May 3 20:16:06 2004 R> @@ -60,8 +60,29 @@ R> static const struct ng_cmdlist ng_eiface_cmdlist[] = { R> { R> NGM_EIFACE_COOKIE, R> - NGM_EIFACE_SET, R> - "set", R> + NGM_EIFACE_GET_IFNAME, R> + "getifname", R> + NULL, R> + &ng_parse_string_type R> + }, R> + { R> + NGM_EIFACE_COOKIE, R> + NGM_EIFACE_GET_IFINDEX, R> + "getifindex", R> + NULL, R> + &ng_parse_int32_type R> + }, R> + { R> + NGM_EIFACE_COOKIE, R> + NGM_EIFACE_GET_ENADDR, R> + "getenaddr", R> + NULL, R> + &ng_parse_enaddr_type R> + }, R> + { R> + NGM_EIFACE_COOKIE, R> + NGM_EIFACE_SET_ENADDR, R> + "setenaddr", R> &ng_parse_enaddr_type, R> NULL R> }, R> @@ -486,80 +507,42 @@ R> switch (msg->header.typecookie) { R> case NGM_EIFACE_COOKIE: R> switch (msg->header.cmd) { R> - case NGM_EIFACE_SET: R> - { R> - struct ether_addr *eaddr; R> - struct ifaddr *ifa; R> - struct sockaddr_dl *sdl; R> - R> - if (msg->header.arglen != sizeof(struct ether_addr)){ R> - error = EINVAL; R> + case NGM_EIFACE_GET_IFNAME: R> + NG_MKRESPONSE(resp, msg, IFNAMSIZ + 1, M_NOWAIT); R> + if (resp == NULL) { R> + error = ENOMEM; R> break; R> } R> - eaddr = (struct ether_addr *)(msg->data); R> - bcopy(eaddr, priv->arpcom.ac_enaddr, ETHER_ADDR_LEN); R> - R> - /* And put it in the ifaddr list */ R> - TAILQ_FOREACH(ifa, &(ifp->if_addrhead), ifa_link) { R> - sdl = (struct sockaddr_dl *)ifa->ifa_addr; R> - if (sdl->sdl_type == IFT_ETHER) { R> - bcopy((IFP2AC(ifp))->ac_enaddr, R> - LLADDR(sdl), ifp->if_addrlen); R> - break; R> - } R> - } R> + strlcpy(resp->data, ifp->if_xname, IFNAMSIZ + 1); R> break; R> - } R> R> - case NGM_EIFACE_GET_IFNAME: R> - { R> - struct ng_eiface_ifname *arg; R> - R> - NG_MKRESPONSE(resp, msg, sizeof(*arg), M_NOWAIT); R> + case NGM_EIFACE_GET_IFINDEX: R> + NG_MKRESPONSE(resp, msg, sizeof(u_int32_t), M_NOWAIT); R> if (resp == NULL) { R> error = ENOMEM; R> break; R> } R> - arg = (struct ng_eiface_ifname *)resp->data; R> - strlcpy(arg->ngif_name, ifp->if_xname, R> - sizeof(arg->ngif_name)); R> + *((u_int32_t *)resp->data) = ifp->if_index; R> break; R> - } R> R> - case NGM_EIFACE_GET_IFADDRS: R> - { R> - struct ifaddr *ifa; R> - caddr_t ptr; R> - int buflen; R> - R> -#define SA_SIZE(s) ((s)->sa_len<sizeof(*(s))? sizeof(*(s)):(s)->sa_len) R> - R> - /* Determine size of response and allocate it */ R> - buflen = 0; R> - TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) R> - buflen += SA_SIZE(ifa->ifa_addr); R> - NG_MKRESPONSE(resp, msg, buflen, M_NOWAIT); R> + case NGM_EIFACE_GET_ENADDR: R> + NG_MKRESPONSE(resp, msg, ETHER_ADDR_LEN, M_NOWAIT); R> if (resp == NULL) { R> error = ENOMEM; R> break; R> } R> - /* Add addresses */ R> - ptr = resp->data; R> - TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) { R> - const int len = SA_SIZE(ifa->ifa_addr); R> - R> - if (buflen < len) { R> - log(LOG_ERR, "%s: len changed?\n", R> - ifp->if_xname); R> - break; R> - } R> - bcopy(ifa->ifa_addr, ptr, len); R> - ptr += len; R> - buflen -= len; R> + bcopy((IFP2AC(ifp))->ac_enaddr, R> + resp->data, ETHER_ADDR_LEN); R> + break; R> + R> + case NGM_EIFACE_SET_ENADDR: R> + if (msg->header.arglen != ETHER_ADDR_LEN){ R> + error = EINVAL; R> + break; R> } R> + error = if_setlladdr(ifp, R> + (u_char *)msg->data, ETHER_ADDR_LEN); R> break; R> -#undef SA_SIZE R> - } R> R> default: R> error = EINVAL; R> diff -ruN sys/netgraph/ng_eiface.h sys/netgraph/ng_eiface.h.ori R> --- sys/netgraph/ng_eiface.h.ori Wed Dec 17 13:03:32 2003 R> +++ sys/netgraph/ng_eiface.h Mon May 3 20:16:06 2004 R> @@ -38,25 +38,21 @@ R> R> /* Interface base name */ R> #define NG_EIFACE_EIFACE_NAME "ngeth" R> -#define NG_EIFACE_EIFACE_NAME_MAX 15 R> R> /* My hook names */ R> #define NG_EIFACE_HOOK_ETHER "ether" R> R> /* MTU bounds */ R> #define NG_EIFACE_MTU_MIN 72 R> -#define NG_EIFACE_MTU_MAX 2312 R> +#define NG_EIFACE_MTU_MAX 9000 R> #define NG_EIFACE_MTU_DEFAULT 1500 R> R> /* Netgraph commands */ R> enum { R> - NGM_EIFACE_GET_IFNAME = 1, /* returns struct ng_eiface_ifname */ R> - NGM_EIFACE_GET_IFADDRS, /* returns list of addresses */ R> - NGM_EIFACE_SET, /* set ethernet address */ R> -}; R> - R> -struct ng_eiface_ifname { R> - char ngif_name[NG_EIFACE_EIFACE_NAME_MAX + 1]; R> + NGM_EIFACE_GET_IFNAME = 1, /* get the interface name */ R> + NGM_EIFACE_GET_IFINDEX, /* get the interface global index # */ R> + NGM_EIFACE_GET_ENADDR, /* get Ethernet address */ R> + NGM_EIFACE_SET_ENADDR, /* set Ethernet address */ R> }; R> R> #endif /* _NETGRAPH_NG_EIFACE_H_ */ R> --- ng_eiface.diff ends here --- R> R> R> >Release-Note: R> >Audit-Trail: R> >Unformatted: R> _______________________________________________ R> freebsd-bugs@freebsd.org mailing list R> http://lists.freebsd.org/mailman/listinfo/freebsd-bugs R> To unsubscribe, send any mail to "freebsd-bugs-unsubscribe@freebsd.org" -- Totus tuus, Glebius. GLEBIUS-RIPN GLEB-RIPE
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200405040820.i448KGTg031643>