if: Defer the if_up until the ifnet.if_ioctl is called.
This ensures the interface is initialized by the interface driver before it can be used by the rest of the system. Reviewed by: jhb, karels, gnn MFC after: 3 week Sponsored by: Microsoft Differential Revision: https://reviews.freebsd.org/D8905
This commit is contained in:
parent
9565357905
commit
cc5bb78be1
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=311475
@ -2300,7 +2300,7 @@ static int
|
||||
ifhwioctl(u_long cmd, struct ifnet *ifp, caddr_t data, struct thread *td)
|
||||
{
|
||||
struct ifreq *ifr;
|
||||
int error = 0;
|
||||
int error = 0, do_ifup = 0;
|
||||
int new_flags, temp_flags;
|
||||
size_t namelen, onamelen;
|
||||
size_t descrlen;
|
||||
@ -2427,7 +2427,7 @@ ifhwioctl(u_long cmd, struct ifnet *ifp, caddr_t data, struct thread *td)
|
||||
if_down(ifp);
|
||||
} else if (new_flags & IFF_UP &&
|
||||
(ifp->if_flags & IFF_UP) == 0) {
|
||||
if_up(ifp);
|
||||
do_ifup = 1;
|
||||
}
|
||||
/* See if permanently promiscuous mode bit is about to flip */
|
||||
if ((ifp->if_flags ^ new_flags) & IFF_PPROMISC) {
|
||||
@ -2446,6 +2446,8 @@ ifhwioctl(u_long cmd, struct ifnet *ifp, caddr_t data, struct thread *td)
|
||||
if (ifp->if_ioctl) {
|
||||
(void) (*ifp->if_ioctl)(ifp, cmd, data);
|
||||
}
|
||||
if (do_ifup)
|
||||
if_up(ifp);
|
||||
getmicrotime(&ifp->if_lastchange);
|
||||
break;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user