diff options
author | delphij <delphij@FreeBSD.org> | 2009-11-11 21:30:58 +0000 |
---|---|---|
committer | delphij <delphij@FreeBSD.org> | 2009-11-11 21:30:58 +0000 |
commit | 13a19ef806aacb68fca8a06969fe760e790cf191 (patch) | |
tree | eea1594231338258764b9d2c6a5b8c04a07d0269 /sys/net/if.c | |
parent | 7f8b0bd4a81476d4906f4ec7983d3328593bebde (diff) | |
download | FreeBSD-src-13a19ef806aacb68fca8a06969fe760e790cf191.zip FreeBSD-src-13a19ef806aacb68fca8a06969fe760e790cf191.tar.gz |
Add interface description capability as inspired by OpenBSD.
MFC after: 3 months
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) |