+ case SIOCSENDOOB: {
+ char oob;
+ struct mbuf *m;
+ if (copyin(cmdp, (caddr_t)&oob, sizeof (oob))) {
+ u.u_error = EFAULT;
+ return;
+ }
+ m = m_get(M_DONTWAIT);
+ if (m == 0) {
+ u.u_error = ENOBUFS;
+ return;
+ }
+ m->m_off = MMINOFF;
+ m->m_len = 1;
+ *mtod(m, caddr_t) = oob;
+ (*so->so_proto->pr_usrreq)(so, PRU_SENDOOB, m, 0);
+ return;
+ }
+
+ case SIOCRCVOOB: {
+ struct mbuf *m = m_get(M_DONTWAIT);
+ if (m == 0) {
+ u.u_error = ENOBUFS;
+ return;
+ }
+ m->m_off = MMINOFF; *mtod(m, caddr_t) = 0;
+ (*so->so_proto->pr_usrreq)(so, PRU_RCVOOB, m, 0);
+ if (copyout(mtod(m, caddr_t), cmdp, sizeof (char))) {
+ u.u_error = EFAULT;
+ return;
+ }
+ m_free(m);
+ return;
+ }
+
+ case SIOCATMARK: {
+ int atmark = (so->so_state&SS_RCVATMARK) != 0;
+ if (copyout((caddr_t)&atmark, cmdp, sizeof (atmark))) {
+ u.u_error = EFAULT;
+ return;
+ }
+ return;
+ }