this version now supports IP over X.25; changes include setting
authorKeith Sklower <sklower@ucbvax.Berkeley.EDU>
Fri, 7 Jun 1991 10:39:39 +0000 (02:39 -0800)
committerKeith Sklower <sklower@ucbvax.Berkeley.EDU>
Fri, 7 Jun 1991 10:39:39 +0000 (02:39 -0800)
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

usr/src/sys/netccitt/if_x25subr.c
usr/src/sys/netccitt/pk_input.c
usr/src/sys/netccitt/pk_subr.c

index b138e4c..13cb5df 100644 (file)
@@ -4,7 +4,7 @@
  *
  * %sccs.include.redist.c%
  *
  *
  * %sccs.include.redist.c%
  *
- *     @(#)if_x25subr.c        7.12 (Berkeley) %G%
+ *     @(#)if_x25subr.c        7.13 (Berkeley) %G%
  */
 
 #include "param.h"
  */
 
 #include "param.h"
@@ -51,6 +51,10 @@ extern       struct ifnet loif;
 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;}
@@ -242,6 +246,11 @@ register struct    rtentry *rt;
        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)) {
@@ -264,6 +273,18 @@ register struct    rtentry *rt;
            ((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) {
@@ -273,6 +294,7 @@ next_circuit:
                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:
index a88919e..b6999d0 100644 (file)
@@ -9,7 +9,7 @@
  *
  * %sccs.include.redist.c%
  *
  *
  * %sccs.include.redist.c%
  *
- *     @(#)pk_input.c  7.12 (Berkeley) %G%
+ *     @(#)pk_input.c  7.13 (Berkeley) %G%
  */
 
 #include "param.h"
  */
 
 #include "param.h"
@@ -777,8 +777,8 @@ struct pkcb *pkp;
                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;
index bf1f3fb..68aa2d5 100644 (file)
@@ -9,7 +9,7 @@
  *
  * %sccs.include.redist.c%
  *
  *
  * %sccs.include.redist.c%
  *
- *     @(#)pk_subr.c   7.15 (Berkeley) %G%
+ *     @(#)pk_subr.c   7.16 (Berkeley) %G%
  */
 
 #include "param.h"
  */
 
 #include "param.h"
@@ -369,7 +369,7 @@ register struct sockaddr_x25 *sa;
        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;
 }
 
@@ -992,12 +992,13 @@ register struct mbuf *m0;
 int len0;
 {
        register struct mbuf *m, *n;
 int len0;
 {
        register struct mbuf *m, *n;
-       unsigned len = len0;
+       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)
@@ -1007,7 +1008,7 @@ int len0;
                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;
-               if (len > MHLEN) {
+               if (remain > MHLEN) {
                        /* 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);
@@ -1017,30 +1018,28 @@ int len0;
                        } 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);
        }
 extpacket:
        }
 extpacket:
-       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;
        } else {
        } else {
-               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 = len;
+       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);