* SUCH DAMAGE.
*
* $FreeBSD: src/sys/netgraph/ng_eiface.c,v 1.39 2007/07/26 10:54:33 glebius Exp $
- * $DragonFly: src/sys/netgraph7/ng_eiface.c,v 1.2 2008/06/26 23:05:35 dillon Exp $
*/
#include <sys/param.h>
#include <net/if_types.h>
#include <net/netisr.h>
-#include "ng_message.h"
-#include "netgraph.h"
-#include "ng_parse.h"
+#include <netgraph7/netgraph.h>
+#include <netgraph7/ng_message.h>
+#include <netgraph7/ng_parse.h>
#include "ng_eiface.h"
#include <net/bpf.h>
/* Interface methods */
static void ng_eiface_init(void *xsc);
static void ng_eiface_start(struct ifnet *ifp);
-static int ng_eiface_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data);
+static int ng_eiface_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data,
+ struct ucred *cr);
#ifdef DEBUG
static void ng_eiface_print_ioctl(struct ifnet *ifp, int cmd, caddr_t data);
#endif
};
NETGRAPH_INIT(eiface, &typestruct);
-static struct unrhdr *ng_eiface_unit;
+static int ng_eiface_next_unit;
/************************************************************************
INTERFACE STUFF
* Process an ioctl for the virtual interface
*/
static int
-ng_eiface_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
+ng_eiface_ioctl(struct ifnet *ifp, u_long command, caddr_t data, struct ucred *cr)
{
struct ifreq *const ifr = (struct ifreq *)data;
- int s, error = 0;
+ int error = 0;
#ifdef DEBUG
ng_eiface_print_ioctl(ifp, command, data);
#endif
- s = splimp();
+ crit_enter();
switch (command) {
/* These two are mostly handled at a higher layer */
* If it is marked down and running, then stop it.
*/
if (ifp->if_flags & IFF_UP) {
- if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
- ifp->if_drv_flags &= ~(IFF_DRV_OACTIVE);
- ifp->if_drv_flags |= IFF_DRV_RUNNING;
+ if (!(ifp->if_flags & IFF_RUNNING)) {
+ ifp->if_flags &= ~(IFF_OACTIVE);
+ ifp->if_flags |= IFF_RUNNING;
}
} else {
- if (ifp->if_drv_flags & IFF_DRV_RUNNING)
- ifp->if_drv_flags &= ~(IFF_DRV_RUNNING |
- IFF_DRV_OACTIVE);
+ if (ifp->if_flags & IFF_RUNNING)
+ ifp->if_flags &= ~(IFF_RUNNING |
+ IFF_OACTIVE);
}
break;
error = EINVAL;
break;
}
- splx(s);
+ crit_exit();
return (error);
}
{
priv_p sc = xsc;
struct ifnet *ifp = sc->ifp;
- int s;
- s = splimp();
+ crit_enter();
+
+ ifp->if_flags |= IFF_RUNNING;
+ ifp->if_flags &= ~IFF_OACTIVE;
- ifp->if_drv_flags |= IFF_DRV_RUNNING;
- ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
+ crit_exit();
- splx(s);
}
/*
/* Check interface flags */
if (!((ifp->if_flags & IFF_UP) &&
- (ifp->if_drv_flags & IFF_DRV_RUNNING)))
+ (ifp->if_flags & IFF_RUNNING)))
return;
for (;;) {
ifp->if_oerrors++;
}
- ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
+ ifp->if_flags &= ~IFF_OACTIVE;
return;
}
const priv_p priv = (priv_p)ifp->if_softc;
/* Don't do anything if output is active */
- if (ifp->if_drv_flags & IFF_DRV_OACTIVE)
+ if (ifp->if_flags & IFF_OACTIVE)
return;
- ifp->if_drv_flags |= IFF_DRV_OACTIVE;
+ ifp->if_flags |= IFF_OACTIVE;
if (ng_send_fn(priv->node, NULL, &ng_eiface_start2, ifp, 0) != 0)
- ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
+ ifp->if_flags &= ~IFF_OACTIVE;
}
#ifdef DEBUG
ifp->if_softc = priv;
/* Get an interface unit number */
- priv->unit = alloc_unr(ng_eiface_unit);
+ priv->unit = ng_eiface_next_unit++;
/* Link together node and private info */
NG_NODE_SET_PRIVATE(node, priv);
/* Initialize interface structure */
if_initname(ifp, NG_EIFACE_EIFACE_NAME, priv->unit);
ifp->if_init = ng_eiface_init;
+/*
ifp->if_output = ether_output;
+*/
ifp->if_start = ng_eiface_start;
ifp->if_ioctl = ng_eiface_ioctl;
ifp->if_watchdog = NULL;
#endif
/* Attach the interface */
- ether_ifattach(ifp, eaddr);
+ ether_ifattach(ifp, eaddr, NULL);
/* Done */
return (0);
priv->ether = hook;
NG_HOOK_SET_PRIVATE(hook, &priv->ether);
- if_link_state_change(ifp, LINK_STATE_UP);
+ ifp->if_link_state = LINK_STATE_UP;
+ if_link_state_change(ifp);
return (0);
}
case NGM_EIFACE_GET_IFADDRS:
{
- struct ifaddr *ifa;
+ struct ifaddr_container *ifac;
caddr_t ptr;
int buflen;
/* Determine size of response and allocate it */
buflen = 0;
- TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link)
- buflen += SA_SIZE(ifa->ifa_addr);
+ TAILQ_FOREACH(ifac, &ifp->if_addrheads[mycpuid],
+ ifa_link)
+ buflen += SA_SIZE(ifac->ifa->ifa_addr);
NG_MKRESPONSE(resp, msg, buflen, M_WAITOK | M_NULLOK);
if (resp == NULL) {
error = ENOMEM;
/* Add addresses */
ptr = resp->data;
- TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
+ TAILQ_FOREACH(ifac, &ifp->if_addrheads[mycpuid],
+ ifa_link) {
+ struct ifaddr *ifa = ifac->ifa;
const int len = SA_SIZE(ifa->ifa_addr);
if (buflen < len) {
case NGM_FLOW_COOKIE:
switch (msg->header.cmd) {
case NGM_LINK_IS_UP:
- if_link_state_change(ifp, LINK_STATE_UP);
+ ifp->if_link_state = LINK_STATE_UP;
+ if_link_state_change(ifp);
break;
case NGM_LINK_IS_DOWN:
- if_link_state_change(ifp, LINK_STATE_DOWN);
+ ifp->if_link_state = LINK_STATE_DOWN;
+ if_link_state_change(ifp);
break;
default:
break;
NG_FREE_ITEM(item);
if (!((ifp->if_flags & IFF_UP) &&
- (ifp->if_drv_flags & IFF_DRV_RUNNING))) {
+ (ifp->if_flags & IFF_RUNNING))) {
NG_FREE_M(m);
return (ENETDOWN);
}
ether_ifdetach(ifp);
if_free(ifp);
- free_unr(ng_eiface_unit, priv->unit);
kfree(priv, M_NETGRAPH);
NG_NODE_SET_PRIVATE(node, NULL);
NG_NODE_UNREF(node);
switch (event) {
case MOD_LOAD:
- ng_eiface_unit = new_unrhdr(0, 0xffff, NULL);
break;
case MOD_UNLOAD:
- delete_unrhdr(ng_eiface_unit);
break;
default:
error = EOPNOTSUPP;