BSD 4_3_Net_2 release
[unix-history] / usr / src / sys / netiso / clnp_input.c
index 60e9239..d7abd5b 100644 (file)
@@ -1,3 +1,38 @@
+/*-
+ * Copyright (c) 1991 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)clnp_input.c        7.13 (Berkeley) 5/6/91
+ */
+
 /***********************************************************
                Copyright IBM Corporation 1987
 
 /***********************************************************
                Copyright IBM Corporation 1987
 
@@ -26,11 +61,6 @@ SOFTWARE.
  */
 /* $Header: /var/src/sys/netiso/RCS/clnp_input.c,v 5.1 89/02/09 16:20:32 hagens Exp $ */
 /* $Source: /var/src/sys/netiso/RCS/clnp_input.c,v $ */
  */
 /* $Header: /var/src/sys/netiso/RCS/clnp_input.c,v 5.1 89/02/09 16:20:32 hagens Exp $ */
 /* $Source: /var/src/sys/netiso/RCS/clnp_input.c,v $ */
-/*     @(#)clnp_input.c        7.6 (Berkeley) %G% */
-
-#ifndef lint
-static char *rcsid = "$Header: /var/src/sys/netiso/RCS/clnp_input.c,v 5.1 89/02/09 16:20:32 hagens Exp $";
-#endif lint
 
 #include "types.h"
 #include "param.h"
 
 #include "types.h"
 #include "param.h"
@@ -43,7 +73,7 @@ static char *rcsid = "$Header: /var/src/sys/netiso/RCS/clnp_input.c,v 5.1 89/02/
 #include "time.h"
 
 #include "../net/if.h"
 #include "time.h"
 
 #include "../net/if.h"
-#include "../net/iftypes.h"
+#include "../net/if_types.h"
 #include "../net/route.h"
 
 #include "iso.h"
 #include "../net/route.h"
 
 #include "iso.h"
@@ -141,9 +171,18 @@ next:
 
        if (m == 0)             /* nothing to do */
                return;
 
        if (m == 0)             /* nothing to do */
                return;
-       if ((m->m_flags & M_PKTHDR) == 0) {
+       if ((m->m_flags & M_PKTHDR) == 0 || m->m_pkthdr.rcvif == 0) {
                m_freem(m);
                goto next;
                m_freem(m);
                goto next;
+       } else {
+               register struct ifaddr *ifa;
+               for (ifa = m->m_pkthdr.rcvif->if_addrlist; ifa; ifa = ifa->ifa_next)
+                       if (ifa->ifa_addr->sa_family == AF_ISO)
+                               break;
+               if (ifa == 0) {
+                       m_freem(m);
+                       goto next;
+               }
        }
        bzero((caddr_t)&sh, sizeof(sh));
        sh.snh_flags = m->m_flags & (M_MCAST|M_BCAST);
        }
        bzero((caddr_t)&sh, sizeof(sh));
        sh.snh_flags = m->m_flags & (M_MCAST|M_BCAST);
@@ -246,8 +285,10 @@ struct mbuf                *m;             /* ptr to first mbuf of pkt */
 struct snpa_hdr        *shp;   /* subnetwork header */
 {
        register struct clnp_fixed      *clnp;  /* ptr to fixed part of header */
 struct snpa_hdr        *shp;   /* subnetwork header */
 {
        register struct clnp_fixed      *clnp;  /* ptr to fixed part of header */
-       struct iso_addr                         src;    /* source address of pkt */
-       struct iso_addr                         dst;    /* destination address of pkt */
+       struct sockaddr_iso                     source; /* source address of pkt */
+       struct sockaddr_iso                     target; /* destination address of pkt */
+#define src    source.siso_addr
+#define dst    target.siso_addr
        caddr_t                                         hoff;   /* current offset in packet */
        caddr_t                                         hend;   /* address of end of header info */
        struct clnp_segment                     seg_part; /* segment part of hdr */
        caddr_t                                         hoff;   /* current offset in packet */
        caddr_t                                         hend;   /* address of end of header info */
        struct clnp_segment                     seg_part; /* segment part of hdr */
@@ -255,6 +296,7 @@ struct snpa_hdr     *shp;   /* subnetwork header */
        int                                                     seg_len;/* length of packet data&hdr in bytes */
        struct clnp_optidx                      oidx, *oidxp = NULL;    /* option index */
        extern int                                      iso_systype;    /* used by ESIS config resp */
        int                                                     seg_len;/* length of packet data&hdr in bytes */
        struct clnp_optidx                      oidx, *oidxp = NULL;    /* option index */
        extern int                                      iso_systype;    /* used by ESIS config resp */
+       extern struct sockaddr_iso      blank_siso;             /* used for initializing */
        int                                                     need_afrin = 0; 
                                                                                /* true if congestion experienced */
                                                                                /* which means you need afrin nose */
        int                                                     need_afrin = 0; 
                                                                                /* true if congestion experienced */
                                                                                /* which means you need afrin nose */
@@ -321,8 +363,7 @@ struct snpa_hdr     *shp;   /* subnetwork header */
         *      extract the source and destination address
         *      drop packet on failure
         */
         *      extract the source and destination address
         *      drop packet on failure
         */
-       bzero((caddr_t)&src, sizeof(src));
-       bzero((caddr_t)&dst, sizeof(dst));
+       source = target = blank_siso;
 
        hoff = (caddr_t)clnp + sizeof(struct clnp_fixed);
        CLNP_EXTRACT_ADDR(dst, hoff, hend);
 
        hoff = (caddr_t)clnp + sizeof(struct clnp_fixed);
        CLNP_EXTRACT_ADDR(dst, hoff, hend);
@@ -429,7 +470,7 @@ struct snpa_hdr     *shp;   /* subnetwork header */
                extern short esis_holding_time;
 
                esis_shoutput(shp->snh_ifp, ESIS_ESH, esis_holding_time,
                extern short esis_holding_time;
 
                esis_shoutput(shp->snh_ifp, ESIS_ESH, esis_holding_time,
-                       shp->snh_shost, 6);
+                       shp->snh_shost, 6, &dst);
        }
 
        /*
        }
 
        /*
@@ -447,6 +488,7 @@ struct snpa_hdr     *shp;   /* subnetwork header */
                if ((m0 = clnp_reass(m, &src, &dst, &seg_part)) != NULL) {
                        m = m0;
                        clnp = mtod(m, struct clnp_fixed *);
                if ((m0 = clnp_reass(m, &src, &dst, &seg_part)) != NULL) {
                        m = m0;
                        clnp = mtod(m, struct clnp_fixed *);
+                       INCSTAT(cns_reassembled);
                } else {
                        return;
                }
                } else {
                        return;
                }
@@ -460,6 +502,7 @@ struct snpa_hdr     *shp;   /* subnetwork header */
         *      or, if absent, the segment length field of the
         *      header.
         */
         *      or, if absent, the segment length field of the
         *      header.
         */
+       INCSTAT(cns_delivered);
        switch (clnp->cnf_type & CNF_TYPE) {
        case CLNP_ER:
                /*
        switch (clnp->cnf_type & CNF_TYPE) {
        case CLNP_ER:
                /*
@@ -474,16 +517,8 @@ struct snpa_hdr    *shp;   /* subnetwork header */
                break;
 
        case CLNP_DT:
                break;
 
        case CLNP_DT:
-               if (need_afrin) {
-                       /* NOTE: do this before TP gets the packet so tp ack can use info*/
-                       IFDEBUG(D_INPUT)
-                               printf("clnp_input: Calling tpclnp_ctlinput(%s)\n",
-                                       clnp_iso_addrp(&src));
-                       ENDDEBUG
-                       tpclnp_ctlinput1(PRC_QUENCH2, &src);
-               }
-               (*isosw[clnp_protox[ISOPROTO_TP]].pr_input)(m, &src, &dst,
-                       clnp->cnf_hdr_len);
+               (*isosw[clnp_protox[ISOPROTO_TP]].pr_input)(m, &source, &target,
+                       clnp->cnf_hdr_len, need_afrin);
                break;
 
        case CLNP_RAW:
                break;
 
        case CLNP_RAW:
@@ -492,7 +527,7 @@ struct snpa_hdr     *shp;   /* subnetwork header */
                        printf("clnp_input: raw input of %d bytes\n",
                                clnp->cnf_type & CNF_SEG_OK ? seg_part.cng_tot_len : seg_len);
                ENDDEBUG
                        printf("clnp_input: raw input of %d bytes\n",
                                clnp->cnf_type & CNF_SEG_OK ? seg_part.cng_tot_len : seg_len);
                ENDDEBUG
-               (*isosw[clnp_protox[ISOPROTO_RAW]].pr_input)(m, &src, &dst,
+               (*isosw[clnp_protox[ISOPROTO_RAW]].pr_input)(m, &source, &target,
                                        clnp->cnf_hdr_len);
                break;
 
                                        clnp->cnf_hdr_len);
                break;
 
@@ -512,13 +547,16 @@ struct snpa_hdr   *shp;   /* subnetwork header */
                /*
                 *      Forward back to sender
                 */
                /*
                 *      Forward back to sender
                 */
-               clnp_forward(m, (int)(clnp->cnf_type & CNF_SEG_OK?seg_part.cng_tot_len : seg_len),
-                       &src, oidxp, seg_off, shp);
+               clnp_forward(m, (int)
+                       (clnp->cnf_type & CNF_SEG_OK ? seg_part.cng_tot_len : seg_len),
+                       &src, oidxp, seg_off, 0);
                break;
 
        default:
                printf("clnp_input: unknown clnp pkt type %d\n",
                        clnp->cnf_type & CNF_TYPE);
                break;
 
        default:
                printf("clnp_input: unknown clnp pkt type %d\n",
                        clnp->cnf_type & CNF_TYPE);
+               clnp_stat.cns_delivered--;
+               clnp_stat.cns_noproto++;
                clnp_discard(m, GEN_HDRSYNTAX);
                break;
        }
                clnp_discard(m, GEN_HDRSYNTAX);
                break;
        }