BSD 4_3_Reno release
[unix-history] / usr / src / sys / netiso / tp_iso.c
index 3c6a160..ca01c48 100644 (file)
@@ -28,7 +28,7 @@ SOFTWARE.
  * ARGO TP
  * $Header: /var/src/sys/netiso/RCS/tp_iso.c,v 5.1 89/02/09 16:20:51 hagens Exp $
  * $Source: /var/src/sys/netiso/RCS/tp_iso.c,v $
  * ARGO TP
  * $Header: /var/src/sys/netiso/RCS/tp_iso.c,v 5.1 89/02/09 16:20:51 hagens Exp $
  * $Source: /var/src/sys/netiso/RCS/tp_iso.c,v $
- *     @(#)tp_iso.c    7.4 (Berkeley) %G%
+ *     @(#)tp_iso.c    7.8 (Berkeley) 6/28/90
  *
  * Here is where you find the iso-dependent code.  We've tried
  * keep all net-level and (primarily) address-family-dependent stuff
  *
  * Here is where you find the iso-dependent code.  We've tried
  * keep all net-level and (primarily) address-family-dependent stuff
@@ -40,6 +40,7 @@ SOFTWARE.
  *             iso_putsufx: put transport suffix into an isopcb structure.
  *             iso_putnetaddr: put a whole net addr into an isopcb.
  *             iso_getnetaddr: get a whole net addr from an isopcb.
  *             iso_putsufx: put transport suffix into an isopcb structure.
  *             iso_putnetaddr: put a whole net addr into an isopcb.
  *             iso_getnetaddr: get a whole net addr from an isopcb.
+ *             iso_cmpnetaddr: compare a whole net addr from an isopcb.
  *             iso_recycle_suffix: clear suffix for reuse in isopcb
  *             tpclnp_ctlinput: handle ER CNLPdu : icmp-like stuff
  *             tpclnp_mtu: figure out what size tpdu to use
  *             iso_recycle_suffix: clear suffix for reuse in isopcb
  *             tpclnp_ctlinput: handle ER CNLPdu : icmp-like stuff
  *             tpclnp_mtu: figure out what size tpdu to use
@@ -76,6 +77,7 @@ static char *rcsid = "$Header: /var/src/sys/netiso/RCS/tp_iso.c,v 5.1 89/02/09 1
 #include "tp_stat.h"
 #include "tp_tpdu.h"
 #include "tp_clnp.h"
 #include "tp_stat.h"
 #include "tp_tpdu.h"
 #include "tp_clnp.h"
+#include "cltp_var.h"
 
 /*
  * CALLED FROM:
 
 /*
  * CALLED FROM:
@@ -198,6 +200,9 @@ iso_putnetaddr(isop, name, which)
        register struct sockaddr_iso *siso;
 
        switch (which) {
        register struct sockaddr_iso *siso;
 
        switch (which) {
+       default:
+               printf("iso_putnetaddr: should panic\n");
+               return;
        case TP_LOCAL:
                sisop = &isop->isop_laddr;
                backup = &isop->isop_sladdr;
        case TP_LOCAL:
                sisop = &isop->isop_laddr;
                backup = &isop->isop_sladdr;
@@ -214,6 +219,47 @@ iso_putnetaddr(isop, name, which)
        siso->siso_addr = name->siso_addr;
 }
 
        siso->siso_addr = name->siso_addr;
 }
 
+/*
+ * CALLED FROM:
+ *     tp_input() when a connection is being established by an
+ *     incoming CR_TPDU, and considered for interception.
+ *
+ * FUNCTION and ARGUMENTS:
+ *     compare a whole net addr from a struct sockaddr (name),
+ *     with that implicitly stored in an isopcb (isop).
+ *     The argument (which) takes values TP_LOCAL or TP_FOREIGN.
+ */ 
+iso_cmpnetaddr(isop, name, which)
+       register struct isopcb  *isop;
+       register struct sockaddr_iso    *name;
+       int which;
+{
+       struct sockaddr_iso **sisop, *backup;
+       register struct sockaddr_iso *siso;
+
+       switch (which) {
+       default:
+               printf("iso_cmpnetaddr: should panic\n");
+               return 0;
+       case TP_LOCAL:
+               sisop = &isop->isop_laddr;
+               backup = &isop->isop_sladdr;
+               break;
+       case TP_FOREIGN:
+               sisop = &isop->isop_faddr;
+               backup = &isop->isop_sfaddr;
+       }
+       siso = ((*sisop == 0) ? (*sisop = backup) : *sisop);
+       IFDEBUG(D_TPISO)
+               printf("ISO_CMPNETADDR\n");
+               dump_isoaddr(siso);
+       ENDDEBUG
+       if (name->siso_tlen && bcmp(TSEL(name), TSEL(siso), name->siso_tlen))
+               return (0);
+       return (bcmp((caddr_t)name->siso_data,
+                        (caddr_t)siso->siso_data, name->siso_nlen) == 0);
+}
+
 /*
  * CALLED FROM:
  *  pr_usrreq() PRU_SOCKADDR, PRU_ACCEPT, PRU_PEERADDR
 /*
  * CALLED FROM:
  *  pr_usrreq() PRU_SOCKADDR, PRU_ACCEPT, PRU_PEERADDR
@@ -320,14 +366,7 @@ tpclnp_mtu(so, isop, size, negot )
                *size, *negot, i, 0);
        ENDTRACE
 
                *size, *negot, i, 0);
        ENDTRACE
 
-       /* are we on the same LAN? if so, negotiate one tpdu size larger,
-        * and actually send the real mtu size
-        */
-       if (iso_localifa(isop->isop_faddr)) {
-               i++;
-       } else {
-               *size = 1<<i;
-       }
+       *size = 1<<i;
        *negot = i;
 
        IFDEBUG(D_CONN)
        *negot = i;
 
        IFDEBUG(D_CONN)
@@ -445,7 +484,6 @@ tpclnp_output_dg(laddr, faddr, m0, datalen, ro, nochksum)
        
        return(err);
 }
        
        return(err);
 }
-extern struct sockaddr_iso blank_siso;
 /*
  * CALLED FROM:
  *     clnp's input routine, indirectly through the protosw.
 /*
  * CALLED FROM:
  *     clnp's input routine, indirectly through the protosw.
@@ -454,14 +492,14 @@ extern struct sockaddr_iso blank_siso;
  * No return value.  
  */
 ProtoHook
  * No return value.  
  */
 ProtoHook
-tpclnp_input(m, faddr, laddr, clnp_len)
-       struct mbuf *m;
-       struct iso_addr *faddr, *laddr;
-       int clnp_len;
+tpclnp_input(m, src, dst, clnp_len, ce_bit)
+       register struct mbuf *m;
+       struct sockaddr_iso *src, *dst;
+       int clnp_len, ce_bit;
 {
 {
-       struct sockaddr_iso src, dst;
        int s = splnet();
        struct mbuf *tp_inputprep();
        int s = splnet();
        struct mbuf *tp_inputprep();
+       int tp_input(), cltp_input(), (*input)() = tp_input;
 
        IncStat(ts_pkt_rcvd);
 
 
        IncStat(ts_pkt_rcvd);
 
@@ -480,25 +518,25 @@ tpclnp_input(m, faddr, laddr, clnp_len)
        m->m_data += clnp_len;
 
        m = tp_inputprep(m);
        m->m_data += clnp_len;
 
        m = tp_inputprep(m);
+       if (m == 0)
+               return 0;
+       if (mtod(m, u_char *)[1] == UD_TPDU_type)
+               input = cltp_input;
 
        IFDEBUG(D_TPINPUT)
                dump_mbuf(m, "after tpclnp_input both pullups");
        ENDDEBUG
 
 
        IFDEBUG(D_TPINPUT)
                dump_mbuf(m, "after tpclnp_input both pullups");
        ENDDEBUG
 
-       src = blank_siso; dst = blank_siso;
-       bcopy((caddr_t)faddr, (caddr_t)&src.siso_addr, 1 + faddr->isoa_len);
-       bcopy((caddr_t)laddr, (caddr_t)&dst.siso_addr, 1 + laddr->isoa_len);
-
        IFDEBUG(D_TPISO)
        IFDEBUG(D_TPISO)
-               printf("calling tp_input: &src 0x%x  &dst 0x%x, src addr:\n", 
-                       &src, &dst);
+               printf("calling %sinput : src 0x%x, dst 0x%x, src addr:\n", 
+                       (input == tp_input ? "tp_" : "clts_"), src, dst);
+               dump_isoaddr(src);
                printf(" dst addr:\n");
                printf(" dst addr:\n");
-               dump_isoaddr(&src);
-               dump_isoaddr(&dst);
+               dump_isoaddr(dst);
        ENDDEBUG
 
        ENDDEBUG
 
-       (void) tp_input(m, (struct sockaddr *)&src, (struct sockaddr *)&dst,
-                               0, tpclnp_output_dg);
+       (void) (*input)(m, (struct sockaddr *)src, (struct sockaddr *)dst,
+                               0, tpclnp_output_dg, ce_bit);
 
        IFDEBUG(D_QUENCH)
                { 
 
        IFDEBUG(D_QUENCH)
                { 
@@ -564,17 +602,6 @@ ProtoHook
 tpclnp_ctlinput(cmd, siso)
        int cmd;
        struct sockaddr_iso *siso;
 tpclnp_ctlinput(cmd, siso)
        int cmd;
        struct sockaddr_iso *siso;
-{
-       return tpclnp_ctlinput1(cmd, &siso->siso_addr);
-}
-
-/*
- *     Entry to ctlinput with argument of an iso_addr rather than a sockaddr
- */
-ProtoHook
-tpclnp_ctlinput1(cmd, isoa)
-       int cmd;
-       struct iso_addr *isoa;
 {
        extern u_char inetctlerrmap[];
        extern ProtoHook tpiso_abort();
 {
        extern u_char inetctlerrmap[];
        extern ProtoHook tpiso_abort();
@@ -583,32 +610,34 @@ tpclnp_ctlinput1(cmd, isoa)
        void iso_pcbnotify();
 
        IFDEBUG(D_TPINPUT)
        void iso_pcbnotify();
 
        IFDEBUG(D_TPINPUT)
-               printf("tpclnp_ctlinput1: cmd 0x%x addr: %s\n", cmd, 
-                       clnp_iso_addrp(isoa));
+               printf("tpclnp_ctlinput1: cmd 0x%x addr: \n", cmd);
+               dump_isoaddr(siso);
        ENDDEBUG
 
        if (cmd < 0 || cmd > PRC_NCMDS)
                return 0;
        ENDDEBUG
 
        if (cmd < 0 || cmd > PRC_NCMDS)
                return 0;
+       if (siso->siso_family != AF_ISO)
+               return 0;
        switch (cmd) {
 
                case    PRC_QUENCH2:
        switch (cmd) {
 
                case    PRC_QUENCH2:
-                       iso_pcbnotify(&tp_isopcb, isoa, 0, (int (*)())tpiso_decbit);
+                       iso_pcbnotify(&tp_isopcb, siso, 0, (int (*)())tpiso_decbit);
                        break;
 
                case    PRC_QUENCH:
                        break;
 
                case    PRC_QUENCH:
-                       iso_pcbnotify(&tp_isopcb, isoa, 0, (int (*)())tpiso_quench);
+                       iso_pcbnotify(&tp_isopcb, siso, 0, (int (*)())tpiso_quench);
                        break;
 
                case    PRC_TIMXCEED_REASS:
                case    PRC_ROUTEDEAD:
                        break;
 
                case    PRC_TIMXCEED_REASS:
                case    PRC_ROUTEDEAD:
-                       iso_pcbnotify(&tp_isopcb, isoa, 0, tpiso_reset);
+                       iso_pcbnotify(&tp_isopcb, siso, 0, tpiso_reset);
                        break;
 
                case    PRC_HOSTUNREACH:
                case    PRC_UNREACH_NET:
                case    PRC_IFDOWN:
                case    PRC_HOSTDEAD:
                        break;
 
                case    PRC_HOSTUNREACH:
                case    PRC_UNREACH_NET:
                case    PRC_IFDOWN:
                case    PRC_HOSTDEAD:
-                       iso_pcbnotify(&tp_isopcb, isoa,
+                       iso_pcbnotify(&tp_isopcb, siso,
                                        (int)inetctlerrmap[cmd], iso_rtchange);
                        break;
 
                                        (int)inetctlerrmap[cmd], iso_rtchange);
                        break;
 
@@ -627,11 +656,25 @@ tpclnp_ctlinput1(cmd, isoa)
                case    PRC_TIMXCEED_INTRANS:
                case    PRC_PARAMPROB:
                */
                case    PRC_TIMXCEED_INTRANS:
                case    PRC_PARAMPROB:
                */
-               iso_pcbnotify(&tp_isopcb, isoa, (int)inetctlerrmap[cmd], tpiso_abort);
+               iso_pcbnotify(&tp_isopcb, siso, (int)inetctlerrmap[cmd], tpiso_abort);
                break;
        }
        return 0;
 }
                break;
        }
        return 0;
 }
+/*
+ * XXX - Variant which is called by clnp_er.c with an isoaddr rather
+ * than a sockaddr_iso.
+ */
+
+static struct sockaddr_iso siso = {sizeof(siso), AF_ISO};
+tpclnp_ctlinput1(cmd, isoa)
+       int cmd;
+       struct iso_addr *isoa;
+{
+       bzero((caddr_t)&siso.siso_addr, sizeof(siso.siso_addr));
+       bcopy((caddr_t)isoa, (caddr_t)&siso.siso_addr, isoa->isoa_len);
+       tpclnp_ctlinput(cmd, &siso);
+}
 
 /*
  * These next 2 routines are
 
 /*
  * These next 2 routines are