* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
- * $Id: ppp_ahdlc.c,v 1.3 2002/12/06 09:49:16 paulus Exp $
+ * $Id: ppp_ahdlc.c,v 1.5 2005/06/27 00:59:57 carlsonj Exp $
*/
/*
#include <sys/types.h>
#include <sys/param.h>
#include <sys/stream.h>
+#include <sys/stropts.h>
#include <sys/errno.h>
#ifdef SVR4
#define USE_MUTEX
#endif /* SOL2 */
+#ifdef USE_MUTEX
+#define MUTEX_ENTER(x) mutex_enter(x)
+#define MUTEX_EXIT(x) mutex_exit(x)
+#else
+#define MUTEX_ENTER(x)
+#define MUTEX_EXIT(x)
+#endif
+
/*
* intpointer_t and uintpointer_t are signed and unsigned integer types
* large enough to hold any data pointer; that is, data pointers can be
MOD_OPEN_DECL(ahdlc_open);
MOD_CLOSE_DECL(ahdlc_close);
-static int ahdlc_wput __P((queue_t *, mblk_t *));
-static int ahdlc_rput __P((queue_t *, mblk_t *));
-static void ahdlc_encode __P((queue_t *, mblk_t *));
-static void ahdlc_decode __P((queue_t *, mblk_t *));
-static int msg_byte __P((mblk_t *, unsigned int));
+static int ahdlc_wput(queue_t *, mblk_t *);
+static int ahdlc_rput(queue_t *, mblk_t *);
+static void ahdlc_encode(queue_t *, mblk_t *);
+static void ahdlc_decode(queue_t *, mblk_t *);
+static int msg_byte(mblk_t *, unsigned int);
#if defined(SOL2)
/*
MOD_OPEN(ahdlc_open)
{
ahdlc_state_t *state;
+ mblk_t *mp;
/*
* Return if it's already opened
* This can only be opened as a module
*/
if (sflag != MODOPEN) {
- return 0;
+ OPEN_ERROR(EINVAL);
}
state = (ahdlc_state_t *) ALLOC_NOSLEEP(sizeof(ahdlc_state_t));
#if defined(USE_MUTEX)
mutex_init(&state->lock, NULL, MUTEX_DEFAULT, NULL);
- mutex_enter(&state->lock);
#endif /* USE_MUTEX */
state->xaccm[0] = ~0; /* escape 0x00 through 0x1f */
state->flag_time = drv_usectohz(FLAG_TIME);
#endif /* SOL2 */
-#if defined(USE_MUTEX)
- mutex_exit(&state->lock);
-#endif /* USE_MUTEX */
-
#if defined(SUNOS4)
ppp_ahdlc_count++;
#endif /* SUNOS4 */
qprocson(q);
-
+
+ if ((mp = allocb(1, BPRI_HI)) != NULL) {
+ mp->b_datap->db_type = M_FLUSH;
+ *mp->b_wptr++ = FLUSHR;
+ putnext(q, mp);
+ }
+
return 0;
}
return 0;
}
-#if defined(USE_MUTEX)
- mutex_enter(&state->lock);
-#endif /* USE_MUTEX */
-
if (state->rx_buf != 0) {
freemsg(state->rx_buf);
state->rx_buf = 0;
}
#if defined(USE_MUTEX)
- mutex_exit(&state->lock);
mutex_destroy(&state->lock);
#endif /* USE_MUTEX */
DPRINT1("ahdlc_wput/%d: PPPIO_XACCM b_cont = 0!\n", state->unit);
break;
}
-#if defined(USE_MUTEX)
- mutex_enter(&state->lock);
-#endif /* USE_MUTEX */
+ MUTEX_ENTER(&state->lock);
bcopy((caddr_t)mp->b_cont->b_rptr, (caddr_t)state->xaccm,
iop->ioc_count);
state->xaccm[2] &= ~0x40000000; /* don't escape 0x5e */
state->xaccm[3] |= 0x60000000; /* do escape 0x7d, 0x7e */
-#if defined(USE_MUTEX)
- mutex_exit(&state->lock);
-#endif /* USE_MUTEX */
+ MUTEX_EXIT(&state->lock);
iop->ioc_count = 0;
error = 0;
break;
DPRINT1("ahdlc_wput/%d: PPPIO_RACCM b_cont = 0!\n", state->unit);
break;
}
-#if defined(USE_MUTEX)
- mutex_enter(&state->lock);
-#endif /* USE_MUTEX */
+ MUTEX_ENTER(&state->lock);
bcopy((caddr_t)mp->b_cont->b_rptr, (caddr_t)&state->raccm,
sizeof(u_int32_t));
-#if defined(USE_MUTEX)
- mutex_exit(&state->lock);
-#endif /* USE_MUTEX */
+ MUTEX_EXIT(&state->lock);
iop->ioc_count = 0;
error = 0;
break;
if (mp->b_cont != 0)
freemsg(mp->b_cont);
mp->b_cont = np;
-#if defined(USE_MUTEX)
- mutex_enter(&state->lock);
-#endif /* USE_MUTEX */
+ MUTEX_ENTER(&state->lock);
*(int *)np->b_wptr = state->flags & RCV_FLAGS;
-#if defined(USE_MUTEX)
- mutex_exit(&state->lock);
-#endif /* USE_MUTEX */
+ MUTEX_EXIT(&state->lock);
np->b_wptr += sizeof(int);
iop->ioc_count = sizeof(int);
error = 0;
case M_CTL:
switch (*mp->b_rptr) {
case PPPCTL_MTU:
-#if defined(USE_MUTEX)
- mutex_enter(&state->lock);
-#endif /* USE_MUTEX */
+ MUTEX_ENTER(&state->lock);
state->mtu = ((unsigned short *)mp->b_rptr)[1];
-#if defined(USE_MUTEX)
- mutex_exit(&state->lock);
-#endif /* USE_MUTEX */
- freemsg(mp);
+ MUTEX_EXIT(&state->lock);
break;
case PPPCTL_MRU:
-#if defined(USE_MUTEX)
- mutex_enter(&state->lock);
-#endif /* USE_MUTEX */
+ MUTEX_ENTER(&state->lock);
state->mru = ((unsigned short *)mp->b_rptr)[1];
-#if defined(USE_MUTEX)
- mutex_exit(&state->lock);
-#endif /* USE_MUTEX */
- freemsg(mp);
+ MUTEX_EXIT(&state->lock);
break;
case PPPCTL_UNIT:
-#if defined(USE_MUTEX)
- mutex_enter(&state->lock);
-#endif /* USE_MUTEX */
+ MUTEX_ENTER(&state->lock);
state->unit = mp->b_rptr[1];
-#if defined(USE_MUTEX)
- mutex_exit(&state->lock);
-#endif /* USE_MUTEX */
+ MUTEX_EXIT(&state->lock);
break;
default:
putnext(q, mp);
+ return 0;
}
+ freemsg(mp);
break;
default:
break;
case M_HANGUP:
-#if defined(USE_MUTEX)
- mutex_enter(&state->lock);
-#endif /* USE_MUTEX */
+ MUTEX_ENTER(&state->lock);
if (state->rx_buf != 0) {
/* XXX would like to send this up for debugging */
freemsg(state->rx_buf);
state->rx_buf = 0;
}
state->flags = IFLUSH;
-#if defined(USE_MUTEX)
- mutex_exit(&state->lock);
-#endif /* USE_MUTEX */
+ MUTEX_EXIT(&state->lock);
putnext(q, mp);
break;
}
state = (ahdlc_state_t *)q->q_ptr;
-#if defined(USE_MUTEX)
- mutex_enter(&state->lock);
-#endif /* USE_MUTEX */
+ MUTEX_ENTER(&state->lock);
/*
* Allocate an output buffer large enough to handle a case where all
outmp = allocb(outmp_len, BPRI_MED);
if (outmp == NULL) {
state->stats.ppp_oerrors++;
-#if defined(USE_MUTEX)
- mutex_exit(&state->lock);
-#endif /* USE_MUTEX */
+ MUTEX_EXIT(&state->lock);
putctl1(RD(q)->q_next, M_CTL, PPPCTL_OERROR);
return;
}
state->stats.ppp_obytes += msgdsize(outmp);
state->stats.ppp_opackets++;
-#if defined(USE_MUTEX)
- mutex_exit(&state->lock);
-#endif /* USE_MUTEX */
+ MUTEX_EXIT(&state->lock);
putnext(q, outmp);
- return;
}
/*
state = (ahdlc_state_t *) q->q_ptr;
-#if defined(USE_MUTEX)
- mutex_enter(&state->lock);
-#endif /* USE_MUTEX */
+ MUTEX_ENTER(&state->lock);
state->stats.ppp_ibytes += msgdsize(mp);
}
}
-#if defined(USE_MUTEX)
- mutex_exit(&state->lock);
-#endif /* USE_MUTEX */
+ MUTEX_EXIT(&state->lock);
}
static int