add ssize_t, required by POSIX 1003.1
[unix-history] / usr / src / sys / netiso / clnp_er.c
index 58765d2..4b76ae7 100644 (file)
@@ -1,3 +1,12 @@
+/*-
+ * Copyright (c) 1991 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * %sccs.include.redist.c%
+ *
+ *     @(#)clnp_er.c   7.7 (Berkeley) %G%
+ */
+
 /***********************************************************
                Copyright IBM Corporation 1987
 
 /***********************************************************
                Copyright IBM Corporation 1987
 
@@ -27,46 +36,31 @@ SOFTWARE.
 /* $Header: /var/src/sys/netiso/RCS/clnp_er.c,v 5.1 89/02/09 16:20:18 hagens Exp $ */
 /* $Source: /var/src/sys/netiso/RCS/clnp_er.c,v $ */
 
 /* $Header: /var/src/sys/netiso/RCS/clnp_er.c,v 5.1 89/02/09 16:20:18 hagens Exp $ */
 /* $Source: /var/src/sys/netiso/RCS/clnp_er.c,v $ */
 
-#ifndef lint
-static char *rcsid = "$Header: /var/src/sys/netiso/RCS/clnp_er.c,v 5.1 89/02/09 16:20:18 hagens Exp $";
-#endif lint
-
-#ifdef ISO
-
-#include "../h/types.h"
-#include "../h/param.h"
-#include "../h/mbuf.h"
-#include "../h/domain.h"
-#include "../h/protosw.h"
-#include "../h/socket.h"
-#include "../h/socketvar.h"
-#include "../h/errno.h"
+#include "param.h"
+#include "mbuf.h"
+#include "domain.h"
+#include "protosw.h"
+#include "socket.h"
+#include "socketvar.h"
+#include "errno.h"
 
 #include "../net/if.h"
 #include "../net/route.h"
 
 
 #include "../net/if.h"
 #include "../net/route.h"
 
-#include "../netiso/iso.h"
-#include "../netiso/clnp.h"
-#include "../netiso/clnp_stat.h"
-#include "../netiso/argo_debug.h"
+#include "iso.h"
+#include "iso_var.h"
+#include "iso_pcb.h"
+#define CLNP_ER_CODES
+#include "clnp.h"
+#include "clnp_stat.h"
+#include "argo_debug.h"
 
 static struct clnp_fixed er_template = {
        ISO8473_CLNP,   /* network identifier */
        0,                              /* length */
        ISO8473_V1,             /* version */
        CLNP_TTL,               /* ttl */
 
 static struct clnp_fixed er_template = {
        ISO8473_CLNP,   /* network identifier */
        0,                              /* length */
        ISO8473_V1,             /* version */
        CLNP_TTL,               /* ttl */
-#if BYTE_ORDER == LITTLE_ENDIAN
-       CLNP_ER,                /* type */
-       0,                              /* error report */
-       0,                              /* more segments */
-       0,                              /* segmentation permitted */
-#endif
-#if BYTE_ORDER == BIG_ENDIAN
-       0,                              /* segmentation permitted */
-       0,                              /* more segments */
-       0,                              /* error report */
        CLNP_ER,                /* type */
        CLNP_ER,                /* type */
-#endif
        0,                              /* segment length */
        0                               /* checksum */
 };
        0,                              /* segment length */
        0                               /* checksum */
 };
@@ -85,7 +79,7 @@ static struct clnp_fixed er_template = {
 clnp_er_input(m, src, reason)
 struct mbuf            *m;             /* ptr to packet itself */
 struct iso_addr        *src;   /* ptr to src of er */
 clnp_er_input(m, src, reason)
 struct mbuf            *m;             /* ptr to packet itself */
 struct iso_addr        *src;   /* ptr to src of er */
-char                   reason; /* reason code of er */
+u_char                 reason; /* reason code of er */
 {
        int     cmd = -1;
        extern u_char clnp_protox[];
 {
        int     cmd = -1;
        extern u_char clnp_protox[];
@@ -95,59 +89,46 @@ char                        reason; /* reason code of er */
                        clnp_iso_addrp(src), reason);
        ENDDEBUG
 
                        clnp_iso_addrp(src), reason);
        ENDDEBUG
 
-       INCSTAT(cns_errcvd);
-
+       INCSTAT(cns_er_inhist[clnp_er_index(reason)]);
        switch (reason) {
                case GEN_NOREAS:
                case GEN_PROTOERR:
        switch (reason) {
                case GEN_NOREAS:
                case GEN_PROTOERR:
-                       INCSTAT(er_protoerr);
                        break;
                case GEN_BADCSUM:               
                        cmd = PRC_PARAMPROB;
                        break;
                case GEN_BADCSUM:               
                        cmd = PRC_PARAMPROB;
-                       INCSTAT(er_badcsum);
                        break;
                case GEN_CONGEST:               
                        cmd = PRC_QUENCH;
                        break;
                case GEN_CONGEST:               
                        cmd = PRC_QUENCH;
-                       INCSTAT(er_congest);
                        break;
                case GEN_HDRSYNTAX:             
                        cmd = PRC_PARAMPROB;
                        break;
                case GEN_HDRSYNTAX:             
                        cmd = PRC_PARAMPROB;
-                       INCSTAT(er_protoerr);
                        break;
                case GEN_SEGNEEDED:             
                        break;
                case GEN_SEGNEEDED:             
-                       cmd = PRC_UNREACH_NEEDFRAG; 
-                       INCSTAT(er_segneeded);
+                       cmd = PRC_MSGSIZE; 
                        break;
                case GEN_INCOMPLETE:    
                        cmd = PRC_PARAMPROB;            
                        break;
                case GEN_INCOMPLETE:    
                        cmd = PRC_PARAMPROB;            
-                       INCSTAT(er_reassfail);
                        break;
                case GEN_DUPOPT:                
                        cmd = PRC_PARAMPROB;            
                        break;
                case GEN_DUPOPT:                
                        cmd = PRC_PARAMPROB;            
-                       INCSTAT(er_protoerr);
                        break;
                case ADDR_DESTUNREACH:  
                        cmd = PRC_UNREACH_HOST;         
                        break;
                case ADDR_DESTUNREACH:  
                        cmd = PRC_UNREACH_HOST;         
-                       INCSTAT(er_dstunreach);
                        break;
                case ADDR_DESTUNKNOWN:  
                        cmd = PRC_UNREACH_PROTOCOL; 
                        break;
                case ADDR_DESTUNKNOWN:  
                        cmd = PRC_UNREACH_PROTOCOL; 
-                       INCSTAT(er_dstunreach);
                        break;
                case SRCRT_UNSPECERR:
                case SRCRT_SYNTAX:
                case SRCRT_UNKNOWNADDR:
                case SRCRT_BADPATH:
                        cmd = PRC_UNREACH_SRCFAIL;
                        break;
                case SRCRT_UNSPECERR:
                case SRCRT_SYNTAX:
                case SRCRT_UNKNOWNADDR:
                case SRCRT_BADPATH:
                        cmd = PRC_UNREACH_SRCFAIL;
-                       INCSTAT(er_srcrterr);
                        break;
                case TTL_EXPTRANSIT:    
                        cmd = PRC_TIMXCEED_INTRANS;     
                        break;
                case TTL_EXPTRANSIT:    
                        cmd = PRC_TIMXCEED_INTRANS;     
-                       INCSTAT(er_ttlexpired);
                        break;
                case TTL_EXPREASS:              
                        cmd = PRC_TIMXCEED_REASS;       
                        break;
                case TTL_EXPREASS:              
                        cmd = PRC_TIMXCEED_REASS;       
-                       INCSTAT(er_ttlexpired);
                        break;
                case DISC_UNSUPPOPT:
                case DISC_UNSUPPVERS:
                        break;
                case DISC_UNSUPPOPT:
                case DISC_UNSUPPVERS:
@@ -155,11 +136,9 @@ char                       reason; /* reason code of er */
                case DISC_UNSUPPSRCRT:
                case DISC_UNSUPPRECRT:
                        cmd = PRC_PARAMPROB; 
                case DISC_UNSUPPSRCRT:
                case DISC_UNSUPPRECRT:
                        cmd = PRC_PARAMPROB; 
-                       INCSTAT(er_unsupported); 
                        break;
                case REASS_INTERFERE:   
                        cmd = PRC_TIMXCEED_REASS;
                        break;
                case REASS_INTERFERE:   
                        cmd = PRC_TIMXCEED_REASS;
-                       INCSTAT(er_reassfail);
                        break;
        }
 
                        break;
        }
 
@@ -197,9 +176,10 @@ char                                       reason; /* reason for discard */
                if (m->m_len >= sizeof(struct clnp_fixed)) {
                        register struct clnp_fixed *clnp = mtod(m, struct clnp_fixed *);
 
                if (m->m_len >= sizeof(struct clnp_fixed)) {
                        register struct clnp_fixed *clnp = mtod(m, struct clnp_fixed *);
 
-                       if ((clnp->cnf_type != CLNP_ER) && (clnp->cnf_err_ok)) {
-                               clnp_emit_er(m, reason);
-                               return;
+                       if (((clnp->cnf_type & CNF_TYPE) != CLNP_ER) &&
+                               (clnp->cnf_type & CNF_ERR_OK)) {
+                                       clnp_emit_er(m, reason);
+                                       return;
                        }
                }
                m_freem(m);
                        }
                }
                m_freem(m);
@@ -229,13 +209,14 @@ char                                      reason; /* reason for discard */
 {
        register struct clnp_fixed      *clnp = mtod(m, struct clnp_fixed *);
        register struct clnp_fixed      *er;
 {
        register struct clnp_fixed      *clnp = mtod(m, struct clnp_fixed *);
        register struct clnp_fixed      *er;
-       struct route                            route;
+       struct route_iso                        route;
        struct ifnet                            *ifp;
        struct sockaddr                         *first_hop;
        struct iso_addr                         src, dst, *our_addr;
        caddr_t                                         hoff, hend;
        int                                                     total_len;              /* total len of dg */
        struct mbuf                             *m0;                    /* contains er pdu hdr */
        struct ifnet                            *ifp;
        struct sockaddr                         *first_hop;
        struct iso_addr                         src, dst, *our_addr;
        caddr_t                                         hoff, hend;
        int                                                     total_len;              /* total len of dg */
        struct mbuf                             *m0;                    /* contains er pdu hdr */
+       struct iso_ifaddr                       *ia = 0;
 
        IFDEBUG(D_DISCARD)
                printf("clnp_emit_er: m x%x, hdr len %d\n", m, clnp->cnf_hdr_len);
 
        IFDEBUG(D_DISCARD)
                printf("clnp_emit_er: m x%x, hdr len %d\n", m, clnp->cnf_hdr_len);
@@ -280,17 +261,18 @@ char                                      reason; /* reason for discard */
        }
 
        if (m->m_len > clnp->cnf_hdr_len)
        }
 
        if (m->m_len > clnp->cnf_hdr_len)
-               m_adj(m, -(m->m_len - clnp->cnf_hdr_len));
+               m_adj(m, (int)-(m->m_len - (int)clnp->cnf_hdr_len));
 
        /* route er pdu: note we send pkt to src of original packet  */
 
        /* route er pdu: note we send pkt to src of original packet  */
-       if (clnp_route(&src, &route, /* flags */0, &first_hop, &ifp) != 0)
+       if (clnp_route(&src, &route, /* flags */0, &first_hop, &ia) != 0)
                goto bad;
 
        /* compute our address based upon firsthop/ifp */
                goto bad;
 
        /* compute our address based upon firsthop/ifp */
-       our_addr = 
-                       clnp_srcaddr(ifp, &((struct sockaddr_iso *)first_hop)->siso_addr);
-       if (our_addr == NULL)
-               goto bad;
+       if (ia)
+                       our_addr = &ia->ia_addr.siso_addr;
+       else
+                       goto bad;
+       ifp = ia->ia_ifp;
 
        IFDEBUG(D_DISCARD)
                printf("clnp_emit_er: to %s", clnp_iso_addrp(&src));
 
        IFDEBUG(D_DISCARD)
                printf("clnp_emit_er: to %s", clnp_iso_addrp(&src));
@@ -314,8 +296,8 @@ char                                        reason; /* reason for discard */
        /* setup src/dst on er pdu */
        /* NOTE REVERSAL OF SRC/DST */
        hoff = (caddr_t)er + sizeof(struct clnp_fixed);
        /* setup src/dst on er pdu */
        /* NOTE REVERSAL OF SRC/DST */
        hoff = (caddr_t)er + sizeof(struct clnp_fixed);
-       CLNP_INSERT_ADDR(hoff, &src);
-       CLNP_INSERT_ADDR(hoff, our_addr);
+       CLNP_INSERT_ADDR(hoff, src);
+       CLNP_INSERT_ADDR(hoff, *our_addr);
 
        /*
         *      TODO: if complete src rt was specified, then reverse path, and
 
        /*
         *      TODO: if complete src rt was specified, then reverse path, and
@@ -341,7 +323,8 @@ char                                        reason; /* reason for discard */
                m_adj(m0, -(total_len - ifp->if_mtu));
        
        /* send packet */
                m_adj(m0, -(total_len - ifp->if_mtu));
        
        /* send packet */
-       (void) (*ifp->if_output)(ifp, m0, first_hop);
+       INCSTAT(cns_er_outhist[clnp_er_index(reason)]);
+       (void) (*ifp->if_output)(ifp, m0, first_hop, route.ro_rt);
        goto done;
 
 bad:
        goto done;
 
 bad:
@@ -352,4 +335,15 @@ done:
        if (route.ro_rt != NULL)
                RTFREE(route.ro_rt);
 }
        if (route.ro_rt != NULL)
                RTFREE(route.ro_rt);
 }
-#endif ISO
+
+clnp_er_index(p)
+u_char p;
+{
+       register u_char *cp = clnp_er_codes + CLNP_ERRORS;
+       while (cp > clnp_er_codes) {
+               cp--;
+               if (*cp == p)
+                       return (cp - clnp_er_codes);
+       }
+       return (CLNP_ERRORS + 1);
+}