Be careful to calculate free space using signed arithmetic.
SCCS-vsn: sys/netns/spp_usrreq.c 6.16
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*
- * @(#)spp_usrreq.c 6.15 (Berkeley) %G%
+ * @(#)spp_usrreq.c 6.16 (Berkeley) %G%
/*
* Fill in mbuf with extended SP header
* and addresses and length put into network format.
/*
* Fill in mbuf with extended SP header
* and addresses and length put into network format.
+ * Long align so prepended ip headers will work on Gould.
- m->m_off = MMAXOFF - sizeof (struct spidp);
+ m->m_off = MMAXOFF - sizeof (struct spidp) - 2;
m->m_len = sizeof (struct spidp);
m->m_next = m0;
si = mtod(m, struct spidp *);
m->m_len = sizeof (struct spidp);
m->m_next = m0;
si = mtod(m, struct spidp *);
*/
{
register struct sockbuf *sb2 = &so->so_rcv;
*/
{
register struct sockbuf *sb2 = &so->so_rcv;
- int credit = ((sb2->sb_mbmax - sb2->sb_mbcnt) /
+ int credit = ((((int)sb2->sb_mbmax) - (int)sb2->sb_mbcnt) /
((short)cb->s_mtu));
int alo = cb->s_ack + (credit > 0 ? credit : 0) - 1;
((short)cb->s_mtu));
int alo = cb->s_ack + (credit > 0 ? credit : 0) - 1;
(void) spp_output(cb, (struct mbuf *) 0);
break;
(void) spp_output(cb, (struct mbuf *) 0);
break;
- case PRU_SEND:
- error = spp_output(cb, m);
- m = NULL;
- break;
-
case PRU_ABORT:
(void) spp_drop(cb, ECONNABORTED);
break;
case PRU_ABORT:
(void) spp_drop(cb, ECONNABORTED);
break;
case PRU_SENDOOB:
if (sbspace(&so->so_snd) < -512) {
case PRU_SENDOOB:
if (sbspace(&so->so_snd) < -512) {
error = ENOBUFS;
break;
}
cb->s_oobflags |= SF_SOOB;
error = ENOBUFS;
break;
}
cb->s_oobflags |= SF_SOOB;
+ /* fall into */
+ case PRU_SEND:
error = spp_output(cb, m);
m = NULL;
break;
error = spp_output(cb, m);
m = NULL;
break;