* OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
* OR MODIFICATIONS.
*
- * $Id: ppp.c,v 1.4 1996/04/04 02:45:29 paulus Exp $
+ * $Id: ppp.c,v 1.7 1996/08/28 06:35:30 paulus Exp $
*/
/*
- * This file is used under Solaris 2, SVR4, and SunOS 4.
+ * This file is used under Solaris 2, SVR4, SunOS 4, and Digital UNIX.
*/
#include <sys/types.h>
#include <sys/stream.h>
#include <sys/stropts.h>
#include <sys/errno.h>
+#ifdef __osf__
+#include <sys/ioctl.h>
+#include <sys/cmn_err.h>
+#define queclass(mp) ((mp)->b_band & QPCTL)
+#else
#include <sys/ioccom.h>
+#endif
#include <sys/time.h>
#ifdef SVR4
#include <sys/cmn_err.h>
#endif /* SVR4 */
#include <net/ppp_defs.h>
#include <net/pppio.h>
-#include <net/bpf.h>
#include "ppp_mod.h"
#ifdef __STDC__
struct pppstat stats; /* statistics */
time_t last_sent; /* time last NP packet sent */
time_t last_recv; /* time last NP packet rcvd */
- struct bpf_program active_f;/* filter for active packets */
- struct bpf_program pass_f; /* filter for packets to pass */
#ifdef SOL2
kstat_t *kstats; /* stats for netstat */
#endif /* SOL2 */
static int putctl2 __P((queue_t *, int, int, int));
static int putctl4 __P((queue_t *, int, int, int));
+#define PPP_ID 0xb1a6
static struct module_info ppp_info = {
- 0xb1a6, "ppp", 0, 512, 512, 128
+ PPP_ID, "ppp", 0, 512, 512, 128
};
static struct qinit pppurint = {
kstat_delete(up->kstats);
#endif
- if (up->active_f.bf_insns) {
- kmem_free(up->active_f.bf_insns, up->active_f.bf_len);
- up->active_f.bf_insns = 0;
- }
- if (up->pass_f.bf_insns) {
- kmem_free(up->pass_f.bf_insns, up->pass_f.bf_len);
- up->pass_f.bf_insns = 0;
- }
-
q->q_ptr = NULL;
WR(q)->q_ptr = NULL;
break;
}
}
- kmem_free(up, sizeof(upperstr_t));
+ FREE(up, sizeof(upperstr_t));
--ppp_count;
return 0;
mblk_t *mq;
struct ppp_idle *pip;
int len;
- struct bpf_insn *ip;
- struct bpf_program *dest;
us = (upperstr_t *) q->q_ptr;
switch (mp->b_datap->db_type) {
for (nps = us->next; nps != 0; nps = nps->next)
if (nps->sap == sap)
break;
- if (nps == 0)
+ if (nps == 0) {
+ if (us->flags & US_DBGLOG)
+ DPRINT2("ppp/%d: no stream for sap %x\n", us->mn, sap);
break;
+ }
nps->npmode = (enum NPmode) ((int *)mp->b_cont->b_rptr)[1];
if (nps->npmode == NPMODE_DROP || nps->npmode == NPMODE_ERROR)
flushq(WR(nps->q), FLUSHDATA);
error = 0;
break;
- case PPPIO_PASSFILT:
- case PPPIO_ACTIVEFILT:
- if ((us->flags & US_CONTROL) == 0)
- break;
- len = iop->ioc_count;
- if (len > BPF_MAXINSNS * sizeof(struct bpf_insn)
- || len % sizeof(struct bpf_insn) != 0)
- break;
- if (len > 0) {
- if (!bpf_validate((struct bpf_insn *) mp->b_cont->b_rptr,
- len / sizeof(struct bpf_insn)))
- break;
- ip = (struct bpf_insn *) ALLOC_NOSLEEP(len);
- if (ip == 0) {
- error = ENOSR;
- break;
- }
- bcopy((caddr_t)mp->b_cont->b_rptr, (caddr_t)ip, len);
- } else
- ip = 0;
- dest = iop->ioc_cmd == PPPIO_ACTIVEFILT?
- &us->active_f: &us->pass_f;
- if (dest->bf_insns != 0)
- kmem_free((caddr_t) dest->bf_insns, dest->bf_len);
- dest->bf_len = len;
- dest->bf_insns = ip;
- break;
-
#ifdef LACHTCP
case SIOCSIFNAME:
printf("SIOCSIFNAME\n");
dl_bind_ack_t *ackp;
if (us->flags & US_DBGLOG)
- cmn_err(CE_CONT, "ppp/%d: dlpi prim %x len=%d\n", us->mn,
+ DPRINT3("ppp/%d: dlpi prim %x len=%d\n", us->mn,
d->dl_primitive, size);
switch (d->dl_primitive) {
case DL_INFO_REQ:
except that we accept ETHERTYPE_IP in place of PPP_IP. */
sap = d->bind_req.dl_sap;
us->req_sap = sap;
- DPRINT1("ppp bind %x\n", sap);
if (sap == ETHERTYPE_IP)
sap = PPP_IP;
if (sap < 0x21 || sap > 0x3fff || (sap & 0x101) != 1) {
mp->b_rptr[1] = PPP_UI;
mp->b_rptr[2] = us->sap >> 8;
mp->b_rptr[3] = us->sap;
- if (!pass_packet(ppa, mp, 1))
+ if (!pass_packet(ppa, mp, 1)) {
freemsg(mp);
- else {
+ } else {
if (!send_data(mp, us))
putq(q, mp);
}
mblk_t *mp;
int outbound;
{
- int len, adr, pass;
-
- if (PPP_PROTOCOL(mp->b_rptr) >= 0x8000
- || (ppa->pass_f.bf_insns == 0 && ppa->active_f.bf_insns == 0))
- return 1;
- len = msgdsize(mp);
- adr = *mp->b_rptr;
- *mp->b_rptr = outbound;
- pass = ppa->pass_f.bf_insns == 0
- || bpf_filter(ppa->pass_f.bf_insns, mp, len, 0);
- if (pass && (ppa->active_f.bf_insns == 0
- || bpf_filter(ppa->active_f.bf_insns, mp, len, 0))) {
- if (outbound)
- ppa->last_sent = time;
- else
- ppa->last_recv = time;
- }
- *mp->b_rptr = adr;
- return pass;
+ /*
+ * Here is where we might, in future, decide whether to pass
+ * or drop the packet, and whether it counts as link activity.
+ */
+ if (outbound)
+ ppa->last_sent = time;
+ else
+ ppa->last_recv = time;
+ return 1;
}
static int
queue_t *q;
upperstr_t *ppa;
- if (us->flags & US_BLOCKED || us->npmode == NPMODE_QUEUE)
+ if ((us->flags & US_BLOCKED) || us->npmode == NPMODE_QUEUE)
return 0;
ppa = us->ppa;
if (ppa == 0 || us->npmode == NPMODE_DROP || us->npmode == NPMODE_ERROR) {
+ if (us->flags & US_DBGLOG)
+ DPRINT2("ppp/%d: dropping pkt (npmode=%d)\n", us->mn, us->npmode);
freemsg(mp);
return 1;
}
if ((q = ppa->lowerq) == 0) {
/* try to send it up the control stream */
if (canputnext(ppa->q)) {
- putnext(ppa->q, mp);
+ /*
+ * The message seems to get corrupted for some reason if
+ * we just send the message up as it is, so we send a copy.
+ */
+ mblk_t *np = copymsg(mp);
+ freemsg(mp);
+ if (np != 0)
+ putnext(ppa->q, np);
return 1;
}
} else {
putnext(us->q, mp);
break;
+ case M_HANGUP:
+ /*
+ * The serial device has hung up. We don't want to send
+ * the M_HANGUP message up to pppd because that will stop
+ * us from using the control stream any more. Instead we
+ * send a zero-length message as an end-of-file indication.
+ */
+ freemsg(mp);
+ mp = allocb(1, BPRI_HI);
+ if (mp == 0) {
+ DPRINT1("ppp/%d: couldn't allocate eof message!\n", ppa->mn);
+ break;
+ }
+ putnext(ppa->q, mp);
+ break;
+
default:
if (mp->b_datap->db_type == M_DATA) {
len = msgdsize(mp);