diff options
Diffstat (limited to 'sys/net/if.c')
-rw-r--r-- | sys/net/if.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/sys/net/if.c b/sys/net/if.c index 55de666..4ba453a 100644 --- a/sys/net/if.c +++ b/sys/net/if.c @@ -463,6 +463,8 @@ if_free_internal(struct ifnet *ifp) #ifdef MAC mac_ifnet_destroy(ifp); #endif /* MAC */ + if (ifp->if_description != NULL) + sbuf_delete(ifp->if_description); IF_AFDATA_DESTROY(ifp); IF_ADDR_LOCK_DESTROY(ifp); ifq_delete(&ifp->if_snd); @@ -2090,6 +2092,45 @@ ifhwioctl(u_long cmd, struct ifnet *ifp, caddr_t data, struct thread *td) ifr->ifr_phys = ifp->if_physical; break; + case SIOCGIFDESCR: + IF_AFDATA_RLOCK(ifp); + if (ifp->if_description == NULL) + error = ENOMSG; + else + error = copystr(sbuf_data(ifp->if_description), + ifr->ifr_buffer.buffer, + ifr->ifr_buffer.length, NULL); + IF_AFDATA_RUNLOCK(ifp); + break; + + case SIOCSIFDESCR: + error = priv_check(td, PRIV_NET_SETIFDESCR); + if (error) + return (error); + + IF_AFDATA_WLOCK(ifp); + if (ifp->if_description == NULL) { + ifp->if_description = sbuf_new_auto(); + if (ifp->if_description == NULL) { + error = ENOMEM; + IF_AFDATA_WUNLOCK(ifp); + break; + } + } else + sbuf_clear(ifp->if_description); + + if (sbuf_copyin(ifp->if_description, ifr->ifr_buffer.buffer, + ifr->ifr_buffer.length) == -1) + error = EFAULT; + + if (error == 0) { + sbuf_finish(ifp->if_description); + getmicrotime(&ifp->if_lastchange); + } + IF_AFDATA_WUNLOCK(ifp); + + break; + case SIOCSIFFLAGS: error = priv_check(td, PRIV_NET_SETIFFLAGS); if (error) |