the X25_MBS_HOLD flag and preserving flags through incoming call cloning and aassociation
SCCS-vsn: sys/netccitt/if_x25subr.c 7.13
SCCS-vsn: sys/netccitt/pk_subr.c 7.16
SCCS-vsn: sys/netccitt/pk_input.c 7.13
*
* %sccs.include.redist.c%
*
*
* %sccs.include.redist.c%
*
- * @(#)if_x25subr.c 7.12 (Berkeley) %G%
+ * @(#)if_x25subr.c 7.13 (Berkeley) %G%
struct llinfo_x25 llinfo_x25 = {&llinfo_x25, &llinfo_x25};
struct sockaddr *x25_dgram_sockmask;
struct llinfo_x25 llinfo_x25 = {&llinfo_x25, &llinfo_x25};
struct sockaddr *x25_dgram_sockmask;
+struct if_x25stats {
+ int ifx_wrongplen;
+ int ifx_nophdr;
+} if_x25stats;
int x25_autoconnect = 0;
#define senderr(x) {error = x; goto bad;}
int x25_autoconnect = 0;
#define senderr(x) {error = x; goto bad;}
struct pklcd *lcp;
int s, error = 0;
struct pklcd *lcp;
int s, error = 0;
+int plen;
+for (plen = 0; m; m = m->m_next)
+ plen += m->m_len;
+m = m0;
+
if ((ifp->if_flags & IFF_UP) == 0)
senderr(ENETDOWN);
while (rt == 0 || (rt->rt_flags & RTF_GATEWAY)) {
if ((ifp->if_flags & IFF_UP) == 0)
senderr(ENETDOWN);
while (rt == 0 || (rt->rt_flags & RTF_GATEWAY)) {
((lx = (struct llinfo_x25 *)rt->rt_llinfo) == 0)) {
senderr(ENETUNREACH);
}
((lx = (struct llinfo_x25 *)rt->rt_llinfo) == 0)) {
senderr(ENETUNREACH);
}
+if ((m->m_flags & M_PKTHDR) == 0) {
+ if_x25stats.ifx_nophdr++;
+ m = m_gethdr(M_NOWAIT, MT_HEADER);
+ if (m == 0)
+ senderr(ENOBUFS);
+ m->m_pkthdr.len = plen;
+ m->m_next = m0;
+}
+if (plen != m->m_pkthdr.len) {
+ if_x25stats.ifx_wrongplen++;
+ m->m_pkthdr.len = plen;
+}
next_circuit:
lcp = lx->lx_lcd;
if (lcp == 0) {
next_circuit:
lcp = lx->lx_lcd;
if (lcp == 0) {
lcp->lcd_upper = x25_connect_callback;
lcp->lcd_upnext = (caddr_t)lx;
lcp->lcd_packetsize = lx->lx_ia->ia_xc.xc_psize;
lcp->lcd_upper = x25_connect_callback;
lcp->lcd_upnext = (caddr_t)lx;
lcp->lcd_packetsize = lx->lx_ia->ia_xc.xc_psize;
+ lcp->lcd_flags = X25_MBS_HOLD;
}
switch (lcp->lcd_state) {
case READY:
}
switch (lcp->lcd_state) {
case READY:
*
* %sccs.include.redist.c%
*
*
* %sccs.include.redist.c%
*
- * @(#)pk_input.c 7.12 (Berkeley) %G%
+ * @(#)pk_input.c 7.13 (Berkeley) %G%
lcp -> lcd_upnext = l -> lcd_upnext;
lcp -> lcd_lcn = lcn;
lcp -> lcd_state = RECEIVED_CALL;
lcp -> lcd_upnext = l -> lcd_upnext;
lcp -> lcd_lcn = lcn;
lcp -> lcd_state = RECEIVED_CALL;
- sa -> x25_opts.op_flags |= sxp -> x25_opts.op_flags &
- ~X25_REVERSE_CHARGE;
+ sa -> x25_opts.op_flags |= (sxp -> x25_opts.op_flags &
+ ~X25_REVERSE_CHARGE) | l -> lcd_flags;
pk_assoc (pkp, lcp, sa);
lcp -> lcd_faddr = *sa;
lcp -> lcd_laddr.x25_udlen = sxp -> x25_udlen;
pk_assoc (pkp, lcp, sa);
lcp -> lcd_faddr = *sa;
lcp -> lcd_laddr.x25_udlen = sxp -> x25_udlen;
*
* %sccs.include.redist.c%
*
*
* %sccs.include.redist.c%
*
- * @(#)pk_subr.c 7.15 (Berkeley) %G%
+ * @(#)pk_subr.c 7.16 (Berkeley) %G%
else
sa -> x25_opts.op_wsize = lcp -> lcd_windowsize;
sa -> x25_net = pkp -> pk_xcp -> xc_addr.x25_net;
else
sa -> x25_opts.op_wsize = lcp -> lcd_windowsize;
sa -> x25_net = pkp -> pk_xcp -> xc_addr.x25_net;
- lcp -> lcd_flags = sa -> x25_opts.op_flags;
+ lcp -> lcd_flags |= sa -> x25_opts.op_flags;
lcp -> lcd_stime = time.tv_sec;
}
lcp -> lcd_stime = time.tv_sec;
}
int len0;
{
register struct mbuf *m, *n;
int len0;
{
register struct mbuf *m, *n;
+ unsigned len = len0, remain;
for (m = m0; m && len > m -> m_len; m = m -> m_next)
len -= m -> m_len;
if (m == 0)
return (0);
for (m = m0; m && len > m -> m_len; m = m -> m_next)
len -= m -> m_len;
if (m == 0)
return (0);
+ remain = m -> m_len - len;
if (m0 -> m_flags & M_PKTHDR) {
MGETHDR(n, wait, m0 -> m_type);
if (n == 0)
if (m0 -> m_flags & M_PKTHDR) {
MGETHDR(n, wait, m0 -> m_type);
if (n == 0)
m0 -> m_pkthdr.len = len0;
if (m -> m_flags & M_EXT)
goto extpacket;
m0 -> m_pkthdr.len = len0;
if (m -> m_flags & M_EXT)
goto extpacket;
/* m can't be the lead packet */
MH_ALIGN(n, 0);
n -> m_next = m_split (m, len, wait);
/* m can't be the lead packet */
MH_ALIGN(n, 0);
n -> m_next = m_split (m, len, wait);
} else
return (n);
} else
} else
return (n);
} else
- MH_ALIGN(n, len);
- } else if (len == m -> m_len) {
+ MH_ALIGN(n, remain);
+ } else if (remain == 0) {
n = m -> m_next;
m -> m_next = 0;
return (n);
n = m -> m_next;
m -> m_next = 0;
return (n);
+ } else {
+ MGET(n, wait, m -> m_type);
+ if (n == 0)
+ return (0);
+ M_ALIGN(n, remain);
- len = m -> m_len - len; /* remainder to be copied */
- m -> m_len -= len; /* now equals original len */
if (m -> m_flags & M_EXT) {
n -> m_flags |= M_EXT;
n -> m_ext = m -> m_ext;
mclrefcnt[mtocl (m -> m_ext.ext_buf)]++;
if (m -> m_flags & M_EXT) {
n -> m_flags |= M_EXT;
n -> m_ext = m -> m_ext;
mclrefcnt[mtocl (m -> m_ext.ext_buf)]++;
- n -> m_data = m -> m_data + m -> m_len;
+ n -> m_data = m -> m_data + len;
- MGET(n, wait, m -> m_type);
- if (n == 0) {
- m -> m_len += len;
- return (0);
- }
- M_ALIGN(n, len);
- bcopy (mtod (m, caddr_t), mtod (n, caddr_t), len);
+ bcopy (mtod (m, caddr_t) + len, mtod (n, caddr_t), remain);
+ n -> m_len = remain;
+ m -> m_len = len;
n -> m_next = m -> m_next;
m -> m_next = 0;
return (n);
n -> m_next = m -> m_next;
m -> m_next = 0;
return (n);