BSD 4_3_Net_2 release
[unix-history] / usr / src / sys / netiso / clnp_input.c
index c55d19a..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.9 (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"
@@ -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);
@@ -431,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);
        }
 
        /*
        }
 
        /*
@@ -478,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, &source, &target,
                (*isosw[clnp_protox[ISOPROTO_TP]].pr_input)(m, &source, &target,
-                       clnp->cnf_hdr_len);
+                       clnp->cnf_hdr_len, need_afrin);
                break;
 
        case CLNP_RAW:
                break;
 
        case CLNP_RAW:
@@ -496,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;