From owner-freebsd-bugs@FreeBSD.ORG Mon May 3 14:00:39 2004 Return-Path: Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 459DB16A4CE for ; Mon, 3 May 2004 14:00:39 -0700 (PDT) Received: from freefall.freebsd.org (freefall.freebsd.org [216.136.204.21]) by mx1.FreeBSD.org (Postfix) with ESMTP id B33E243D31 for ; Mon, 3 May 2004 14:00:38 -0700 (PDT) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) i43L0crd057529 for ; Mon, 3 May 2004 14:00:38 -0700 (PDT) (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.12.11/8.12.11/Submit) id i43L0cmt057528; Mon, 3 May 2004 14:00:38 -0700 (PDT) (envelope-from gnats) Resent-Date: Mon, 3 May 2004 14:00:38 -0700 (PDT) Resent-Message-Id: <200405032100.i43L0cmt057528@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-bugs@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, Robin Breathe Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id D728816A4CE for ; Mon, 3 May 2004 13:59:22 -0700 (PDT) Received: from mail.dsl.isometry.net (cpc3-oxfd2-6-0-cust207.oxfd.cable.ntl.com [81.103.193.207]) by mx1.FreeBSD.org (Postfix) with ESMTP id 0056743D31 for ; Mon, 3 May 2004 13:59:22 -0700 (PDT) (envelope-from isometry@mail.dsl.isometry.net) Received: by mail.dsl.isometry.net (Postfix, from userid 1000) id 87DC220A; Mon, 3 May 2004 20:59:19 +0000 (UTC) Message-Id: <20040503205919.87DC220A@mail.dsl.isometry.net> Date: Mon, 3 May 2004 20:59:19 +0000 (UTC) From: Robin Breathe To: FreeBSD-gnats-submit@FreeBSD.org X-Send-Pr-Version: 3.113 Subject: kern/66225: Extend ng_eiface(4) control messages X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list Reply-To: Robin Breathe List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 03 May 2004 21:00:39 -0000 >Number: 66225 >Category: kern >Synopsis: Extend ng_eiface(4) control messages >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: change-request >Submitter-Id: current-users >Arrival-Date: Mon May 03 14:00:38 PDT 2004 >Closed-Date: >Last-Modified: >Originator: Robin Breathe >Release: FreeBSD 5.2-CURRENT i386 >Organization: isometry.net >Environment: 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 >Description: - Extend the ng_eiface(4) control message set with getifaddr, getifindex, getenaddr and setenaddr, c.f. ng_ether(4). Allows code to get a handle on the associated ngeth# interface, and change its properties without knowing the unit number. - Renamed NGM_EIFACE_SET (set) to NGM_EIFACE_SET_ENADDR (setenaddr) for clarity, and to match ng_ether(4). - Clean up some extraneous code. - Increased max MTU to 9000. - Document the new interfaces in ng_eiface.4. >How-To-Repeat: >Fix: Apply the following patch in /usr/src of -CURRENT. --- ng_eiface.diff begins here --- diff -ruN share/man/man4/ng_eiface.4 share/man/man4/ng_eiface.4.ori --- share/man/man4/ng_eiface.4.ori Mon May 3 20:23:57 2004 +++ share/man/man4/ng_eiface.4 Mon May 3 20:35:27 2004 @@ -65,25 +65,21 @@ .Sh CONTROL MESSAGES This node type supports the generic control messages, plus the following: .Bl -tag -width indent -.It Dv NGM_EIFACE_SET -Set link-level address of the interface. -Requires -.Vt "struct ether_addr" -as an argument. -This message also has an -.Tn ASCII -version, called -.Dq Li set , -which requires as an argument an -.Tn ASCII -string consisting of 6 colon-separated hex digits. -.It Dv NGM_EIFACE_GET_IFNAME -Return the name of the associated interface as a +.It Dv NGM_EIFACE_GET_IFNAME Pq Li getifname +Returns the name of the associated interface as a .Dv NUL Ns -terminated .Tn ASCII string. -.It Dv NGM_EIFACE_GET_IFADDRS -Return the list of link-level addresses associated with the node. +.It DV NGM_EIFACE_GET_IFINDEX Pq Li getifindex +Returns the global index of the associated inteface as a 32-bit integer. +.It DV NGM_EIFACE_GET_ENADDR Pq Li getenaddr +Returns the associated interface's unique six-byte Ethernet address. +.It Dv NGM_EIFACE_SET_ENADDR Pq Li setenaddr +Sets the associated interface's unique six-byte Ethernet address. +This control message is equivalent to using the +.Dv SIOCIFLLADDR +.Xr ioctl 2 +system call. .El .Sh SHUTDOWN This node shuts down upon receipt of a diff -ruN sys/netgraph/ng_eiface.c sys/netgraph/ng_eiface.c.ori --- sys/netgraph/ng_eiface.c.ori Thu Apr 22 19:11:57 2004 +++ sys/netgraph/ng_eiface.c Mon May 3 20:16:06 2004 @@ -60,8 +60,29 @@ static const struct ng_cmdlist ng_eiface_cmdlist[] = { { NGM_EIFACE_COOKIE, - NGM_EIFACE_SET, - "set", + NGM_EIFACE_GET_IFNAME, + "getifname", + NULL, + &ng_parse_string_type + }, + { + NGM_EIFACE_COOKIE, + NGM_EIFACE_GET_IFINDEX, + "getifindex", + NULL, + &ng_parse_int32_type + }, + { + NGM_EIFACE_COOKIE, + NGM_EIFACE_GET_ENADDR, + "getenaddr", + NULL, + &ng_parse_enaddr_type + }, + { + NGM_EIFACE_COOKIE, + NGM_EIFACE_SET_ENADDR, + "setenaddr", &ng_parse_enaddr_type, NULL }, @@ -486,80 +507,42 @@ switch (msg->header.typecookie) { case NGM_EIFACE_COOKIE: switch (msg->header.cmd) { - case NGM_EIFACE_SET: - { - struct ether_addr *eaddr; - struct ifaddr *ifa; - struct sockaddr_dl *sdl; - - if (msg->header.arglen != sizeof(struct ether_addr)){ - error = EINVAL; + case NGM_EIFACE_GET_IFNAME: + NG_MKRESPONSE(resp, msg, IFNAMSIZ + 1, M_NOWAIT); + if (resp == NULL) { + error = ENOMEM; break; } - eaddr = (struct ether_addr *)(msg->data); - bcopy(eaddr, priv->arpcom.ac_enaddr, ETHER_ADDR_LEN); - - /* And put it in the ifaddr list */ - TAILQ_FOREACH(ifa, &(ifp->if_addrhead), ifa_link) { - sdl = (struct sockaddr_dl *)ifa->ifa_addr; - if (sdl->sdl_type == IFT_ETHER) { - bcopy((IFP2AC(ifp))->ac_enaddr, - LLADDR(sdl), ifp->if_addrlen); - break; - } - } + strlcpy(resp->data, ifp->if_xname, IFNAMSIZ + 1); break; - } - case NGM_EIFACE_GET_IFNAME: - { - struct ng_eiface_ifname *arg; - - NG_MKRESPONSE(resp, msg, sizeof(*arg), M_NOWAIT); + case NGM_EIFACE_GET_IFINDEX: + NG_MKRESPONSE(resp, msg, sizeof(u_int32_t), M_NOWAIT); if (resp == NULL) { error = ENOMEM; break; } - arg = (struct ng_eiface_ifname *)resp->data; - strlcpy(arg->ngif_name, ifp->if_xname, - sizeof(arg->ngif_name)); + *((u_int32_t *)resp->data) = ifp->if_index; break; - } - case NGM_EIFACE_GET_IFADDRS: - { - struct ifaddr *ifa; - caddr_t ptr; - int buflen; - -#define SA_SIZE(s) ((s)->sa_lensa_len) - - /* Determine size of response and allocate it */ - buflen = 0; - TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) - buflen += SA_SIZE(ifa->ifa_addr); - NG_MKRESPONSE(resp, msg, buflen, M_NOWAIT); + case NGM_EIFACE_GET_ENADDR: + NG_MKRESPONSE(resp, msg, ETHER_ADDR_LEN, M_NOWAIT); if (resp == NULL) { error = ENOMEM; break; } - /* Add addresses */ - ptr = resp->data; - TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) { - const int len = SA_SIZE(ifa->ifa_addr); - - if (buflen < len) { - log(LOG_ERR, "%s: len changed?\n", - ifp->if_xname); - break; - } - bcopy(ifa->ifa_addr, ptr, len); - ptr += len; - buflen -= len; + bcopy((IFP2AC(ifp))->ac_enaddr, + resp->data, ETHER_ADDR_LEN); + break; + + case NGM_EIFACE_SET_ENADDR: + if (msg->header.arglen != ETHER_ADDR_LEN){ + error = EINVAL; + break; } + error = if_setlladdr(ifp, + (u_char *)msg->data, ETHER_ADDR_LEN); break; -#undef SA_SIZE - } default: error = EINVAL; diff -ruN sys/netgraph/ng_eiface.h sys/netgraph/ng_eiface.h.ori --- sys/netgraph/ng_eiface.h.ori Wed Dec 17 13:03:32 2003 +++ sys/netgraph/ng_eiface.h Mon May 3 20:16:06 2004 @@ -38,25 +38,21 @@ /* Interface base name */ #define NG_EIFACE_EIFACE_NAME "ngeth" -#define NG_EIFACE_EIFACE_NAME_MAX 15 /* My hook names */ #define NG_EIFACE_HOOK_ETHER "ether" /* MTU bounds */ #define NG_EIFACE_MTU_MIN 72 -#define NG_EIFACE_MTU_MAX 2312 +#define NG_EIFACE_MTU_MAX 9000 #define NG_EIFACE_MTU_DEFAULT 1500 /* Netgraph commands */ enum { - NGM_EIFACE_GET_IFNAME = 1, /* returns struct ng_eiface_ifname */ - NGM_EIFACE_GET_IFADDRS, /* returns list of addresses */ - NGM_EIFACE_SET, /* set ethernet address */ -}; - -struct ng_eiface_ifname { - char ngif_name[NG_EIFACE_EIFACE_NAME_MAX + 1]; + NGM_EIFACE_GET_IFNAME = 1, /* get the interface name */ + NGM_EIFACE_GET_IFINDEX, /* get the interface global index # */ + NGM_EIFACE_GET_ENADDR, /* get Ethernet address */ + NGM_EIFACE_SET_ENADDR, /* set Ethernet address */ }; #endif /* _NETGRAPH_NG_EIFACE_H_ */ --- ng_eiface.diff ends here --- >Release-Note: >Audit-Trail: >Unformatted: