sockaddrs in response to imp stuff, add option for larger mtu's (default
is now and was supposed to be 576 bytes).
SCCS-vsn: sys/netns/spp_usrreq.c 6.11
struct spidp spp_savesi;
int traceallspps = 0;
extern int sppconsdebug;
struct spidp spp_savesi;
int traceallspps = 0;
extern int sppconsdebug;
+
+/*ARGSUSED*/
+spp_input(m, nsp, ifp)
register struct mbuf *m;
register struct nspcb *nsp;
register struct mbuf *m;
register struct nspcb *nsp;
{
register struct sppcb *cb;
register struct spidp *si = mtod(m, struct spidp *);
{
register struct sppcb *cb;
register struct spidp *si = mtod(m, struct spidp *);
extern struct nspcb *idp_drop();
struct ns_errp *errp;
struct nspcb *nsp;
extern struct nspcb *idp_drop();
struct ns_errp *errp;
struct nspcb *nsp;
+ struct sockaddr_ns *sns;
int type;
if (cmd < 0 || cmd > PRC_NCMDS)
int type;
if (cmd < 0 || cmd > PRC_NCMDS)
- na = &((struct sockaddr_ns *)arg)->sns_addr;
- break;
-
case PRC_HOSTDEAD:
case PRC_HOSTUNREACH:
case PRC_HOSTDEAD:
case PRC_HOSTUNREACH:
- na = (struct ns_addr *)arg;
+ sns = (struct sockaddr_ns *)arg;
+ if (sns->sns_family != AF_NS)
+ return;
+ na = &sns->sns_addr;
register struct spidp *si = (struct spidp *) 0;
register struct sockbuf *sb = &(so->so_snd);
register int len = 0;
register struct spidp *si = (struct spidp *) 0;
register struct sockbuf *sb = &(so->so_snd);
register int len = 0;
int error = 0;
u_short lookfor = 0;
struct mbuf *mprev;
extern int idpcksum;
if (m0) {
int error = 0;
u_short lookfor = 0;
struct mbuf *mprev;
extern int idpcksum;
if (m0) {
+ int mtu = cb->s_mtu;
+ int datalen;
+ /*
+ * Make sure that packet isn't too big.
+ */
for (m = m0; m ; m = m->m_next) {
mprev = m;
len += m->m_len;
}
for (m = m0; m ; m = m->m_next) {
mprev = m;
len += m->m_len;
}
+ datalen = (cb->s_flags & SF_HO) ?
+ len - sizeof (struct sphdr) : len;
+ if (datalen > mtu) {
if (cb->s_flags & SF_PI) {
m_freem(m0);
return (EMSGSIZE);
} else {
int off = 0;
if (cb->s_flags & SF_PI) {
m_freem(m0);
return (EMSGSIZE);
} else {
int off = 0;
+ int oldEM = cb->s_cc & SP_EM;
+
+ cb->s_cc &= ~SP_EM;
while (len > mtu) {
m = m_copy(m0, off, mtu);
if (m == NULL) {
while (len > mtu) {
m = m_copy(m0, off, mtu);
if (m == NULL) {
- m_freem(m0);
- return (ENOBUFS);
+ error = ENOBUFS;
+ goto bad_copy;
}
error = spp_output(cb, m);
if (error) {
}
error = spp_output(cb, m);
if (error) {
+ bad_copy:
+ cb->s_cc |= oldEM;
}
m_adj(m0, mtu);
len -= mtu;
}
}
m_adj(m0, mtu);
len -= mtu;
}
m_freem(m0);
return (ENOBUFS);
}
m_freem(m0);
return (ENOBUFS);
}
/*
* 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.
*mtod(m, short *) = cb->s_flags & mask;
break;
*mtod(m, short *) = cb->s_flags & mask;
break;
+ case SO_MTU:
+ m->m_len = sizeof(u_short);
+ m->m_off = MMAXOFF - sizeof(short);
+ *mtod(m, short *) = cb->s_mtu;
+ break;
+
case SO_LAST_HEADER:
m->m_len = sizeof(struct sphdr);
m->m_off = MMAXOFF - sizeof(struct sphdr);
case SO_LAST_HEADER:
m->m_len = sizeof(struct sphdr);
m->m_off = MMAXOFF - sizeof(struct sphdr);
+ if (value == 0 || *value == 0) {
+ error = EINVAL;
+ break;
+ }
case SO_HEADERS_ON_OUTPUT:
mask = SF_HO;
set_head:
case SO_HEADERS_ON_OUTPUT:
mask = SF_HO;
set_head:
+ if (cb->s_flags & SF_PI) {
ok = mtod(*value, int *);
if (*ok)
cb->s_flags |= mask;
ok = mtod(*value, int *);
if (*ok)
cb->s_flags |= mask;
} else error = EINVAL;
break;
} else error = EINVAL;
break;
+ case SO_MTU:
+ cb->s_mtu = *(mtod(*value, u_short *));
+ break;
+
case SO_DEFAULT_HEADERS:
{
register struct sphdr *sp
case SO_DEFAULT_HEADERS:
{
register struct sphdr *sp
cb->s_cc = sp->sp_cc & SP_EM;
}
}
cb->s_cc = sp->sp_cc & SP_EM;
}
}
- if (value && *value)
- m_freem(*value);
register struct nspcb *nsp = cb->s_nspcb;
register struct spidp *n = &(cb->s_shdr);
register struct nspcb *nsp = cb->s_nspcb;
register struct spidp *n = &(cb->s_shdr);
+ cb->s_mtu = 576 - sizeof (struct spidp);
n->si_pt = NSPROTO_SPP;
n->si_sna = nsp->nsp_laddr;
n->si_dna = nsp->nsp_faddr;
n->si_pt = NSPROTO_SPP;
n->si_sna = nsp->nsp_laddr;
n->si_dna = nsp->nsp_faddr;
{ 1.0, 1.2, 1.4, 1.7, 2.0, 3.0, 5.0, 8.0, 16.0, 32.0 };
int sppexprexmtbackoff = 0;
/*
{ 1.0, 1.2, 1.4, 1.7, 2.0, 3.0, 5.0, 8.0, 16.0, 32.0 };
int sppexprexmtbackoff = 0;
/*
- * TCP timer processing.
+ * SPP timer processing.
*/
struct sppcb *
spp_timers(cb, timer)
*/
struct sppcb *
spp_timers(cb, timer)