Index: sbin/ifconfig/ifconfig.c =================================================================== RCS file: /cvs/src/sbin/ifconfig/ifconfig.c,v retrieving revision 1.315 diff -u -p -r1.315 ifconfig.c --- sbin/ifconfig/ifconfig.c 13 Jan 2016 09:35:45 -0000 1.315 +++ sbin/ifconfig/ifconfig.c 1 Mar 2016 11:48:09 -0000 @@ -181,6 +181,9 @@ void settunnelinst(const char *, int); void settunnelttl(const char *, int); void setvnetid(const char *, int); void delvnetid(const char *, int); +void setifparent(const char *, int); +void delifparent(const char *, int); +void getifparent(void); #ifdef INET6 void setia6flags(const char *, int); void setia6pltime(const char *, int); @@ -412,6 +415,8 @@ const struct cmd { { "tunnelttl", NEXTARG, 0, settunnelttl } , { "vnetid", NEXTARG, 0, setvnetid }, { "-vnetid", 0, 0, delvnetid }, + { "parent", NEXTARG, 0, setifparent }, + { "-parent", 1, 0, delifparent }, { "pppoedev", NEXTARG, 0, setpppoe_dev }, { "pppoesvc", NEXTARG, 0, setpppoe_svc }, { "-pppoesvc", 1, 0, setpppoe_svc }, @@ -2938,6 +2943,7 @@ status(int link, struct sockaddr_dl *sdl printf("\tpatch: %s\n", ifname); #endif vlan_status(); + getifparent(); #ifndef SMALL carp_status(); pfsync_status(); @@ -3390,6 +3396,51 @@ delvnetid(const char *ignored, int alsoi { if (ioctl(s, SIOCDVNETID, &ifr) < 0) warn("SIOCDVNETID"); +} + +void +setifparent(const char *id, int param) +{ + struct if_parent ifp; + + if (strlcpy(ifp.ifp_name, name, sizeof(ifp.ifp_name)) >= + sizeof(ifp.ifp_name)) + errx(1, "parent: name too long"); + + if (strlcpy(ifp.ifp_parent, id, sizeof(ifp.ifp_parent)) >= + sizeof(ifp.ifp_parent)) + errx(1, "parent: parent too long"); + + if (ioctl(s, SIOCSIFPARENT, (caddr_t)&ifp) < 0) + warn("SIOCSIFPARENT"); +} + +/* ARGSUSED */ +void +delifparent(const char *ignored, int alsoignored) +{ + if (ioctl(s, SIOCDIFPARENT, &ifr) < 0) + warn("SIOCDIFPARENT"); +} + +void +getifparent(void) +{ + struct if_parent ifp; + const char *parent = "none"; + + memset(&ifp, 0, sizeof(ifp)); + if (strlcpy(ifp.ifp_name, name, sizeof(ifp.ifp_name)) >= + sizeof(ifp.ifp_name)) + errx(1, "parent: name too long"); + + if (ioctl(s, SIOCGIFPARENT, (caddr_t)&ifp) == -1) { + if (errno != EADDRNOTAVAIL) + return; + } else + parent = ifp.ifp_parent; + + printf("\tparent: %s\n", parent); } void Index: sys/net/if.c =================================================================== RCS file: /cvs/src/sys/net/if.c,v retrieving revision 1.426 diff -u -p -r1.426 if.c --- sys/net/if.c 28 Feb 2016 15:46:19 -0000 1.426 +++ sys/net/if.c 1 Mar 2016 11:48:13 -0000 @@ -1754,6 +1754,8 @@ ifioctl(struct socket *so, u_long cmd, c case SIOCSIFMEDIA: case SIOCSVNETID: case SIOCSIFPAIR: + case SIOCSIFPARENT: + case SIOCDIFPARENT: if ((error = suser(p, 0)) != 0) return (error); /* FALLTHROUGH */ @@ -1765,6 +1767,7 @@ ifioctl(struct socket *so, u_long cmd, c case SIOCGIFMEDIA: case SIOCGVNETID: case SIOCGIFPAIR: + case SIOCGIFPARENT: if (ifp->if_ioctl == 0) return (EOPNOTSUPP); error = (*ifp->if_ioctl)(ifp, cmd, data); Index: sys/net/if.h =================================================================== RCS file: /cvs/src/sys/net/if.h,v retrieving revision 1.175 diff -u -p -r1.175 if.h --- sys/net/if.h 5 Dec 2015 19:04:37 -0000 1.175 +++ sys/net/if.h 1 Mar 2016 11:48:13 -0000 @@ -444,6 +444,12 @@ struct if_afreq { sa_family_t ifar_af; }; +/* SIOC[SG]IFPARENT */ +struct if_parent { + char ifp_name[IFNAMSIZ]; + char ifp_parent[IFNAMSIZ]; +}; + #include #ifdef _KERNEL Index: sys/sys/sockio.h =================================================================== RCS file: /cvs/src/sys/sys/sockio.h,v retrieving revision 1.62 diff -u -p -r1.62 sockio.h --- sys/sys/sockio.h 24 Oct 2015 10:52:05 -0000 1.62 +++ sys/sys/sockio.h 1 Mar 2016 11:48:13 -0000 @@ -199,6 +199,10 @@ #define SIOCSIFPAIR _IOW('i', 176, struct ifreq) /* set paired if */ #define SIOCGIFPAIR _IOWR('i', 177, struct ifreq) /* get paired if */ +#define SIOCSIFPARENT _IOW('i', 178, struct if_parent) /* set parent if */ +#define SIOCGIFPARENT _IOWR('i', 179, struct if_parent) /* get parent if */ +#define SIOCDIFPARENT _IOW('i', 180, struct ifreq) /* del parent if */ + #define SIOCSVH _IOWR('i', 245, struct ifreq) /* set carp param */ #define SIOCGVH _IOWR('i', 246, struct ifreq) /* get carp param */