136382Ssklower /*********************************************************** 236382Ssklower Copyright IBM Corporation 1987 336382Ssklower 436382Ssklower All Rights Reserved 536382Ssklower 636382Ssklower Permission to use, copy, modify, and distribute this software and its 736382Ssklower documentation for any purpose and without fee is hereby granted, 836382Ssklower provided that the above copyright notice appear in all copies and that 936382Ssklower both that copyright notice and this permission notice appear in 1036382Ssklower supporting documentation, and that the name of IBM not be 1136382Ssklower used in advertising or publicity pertaining to distribution of the 1236382Ssklower software without specific, written prior permission. 1336382Ssklower 1436382Ssklower IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 1536382Ssklower ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL 1636382Ssklower IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR 1736382Ssklower ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 1836382Ssklower WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, 1936382Ssklower ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 2036382Ssklower SOFTWARE. 2136382Ssklower 2236382Ssklower ******************************************************************/ 2336382Ssklower 2436382Ssklower /* 2536382Ssklower * ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison 2636382Ssklower */ 2736382Ssklower /* 2836382Ssklower * $Header: if_eon.c,v 1.4 88/07/19 15:53:59 hagens Exp $ 2936382Ssklower * $Source: /usr/argo/sys/netiso/RCS/if_eon.c,v $ 30*41393Ssklower * @(#)if_eon.c 7.7 (Berkeley) 05/04/90 * 3136382Ssklower * 3236382Ssklower * EON rfc 3336382Ssklower * Layer between IP and CLNL 3436382Ssklower * 3536382Ssklower * TODO: 3636382Ssklower * Put together a current rfc986 address format and get the right offset 3736382Ssklower * for the nsel 3836382Ssklower */ 3936382Ssklower 4036382Ssklower #ifndef lint 4136382Ssklower static char *rcsid = "$Header: if_eon.c,v 1.4 88/07/19 15:53:59 hagens Exp $"; 4236382Ssklower #endif lint 4336382Ssklower 4437469Ssklower #ifdef EON 4537469Ssklower #define NEON 1 4636382Ssklower 4737469Ssklower 4836382Ssklower #include "param.h" 4936382Ssklower #include "systm.h" 5036382Ssklower #include "types.h" 5136382Ssklower #include "mbuf.h" 5236382Ssklower #include "buf.h" 5336382Ssklower #include "protosw.h" 5436382Ssklower #include "socket.h" 5536382Ssklower #include "ioctl.h" 5636382Ssklower #include "errno.h" 5736382Ssklower #include "types.h" 5836382Ssklower 5936382Ssklower #include "../net/if.h" 6039195Ssklower #include "../net/if_types.h" 6140778Ssklower #include "../net/if_dl.h" 6236382Ssklower #include "../net/netisr.h" 6336382Ssklower #include "../net/route.h" 6437518Smckusick #include "machine/mtpr.h" 6536382Ssklower 6636382Ssklower #include "../netinet/in.h" 6736382Ssklower #include "../netinet/in_systm.h" 6840778Ssklower #include "../netinet/in_var.h" 6936382Ssklower #include "../netinet/ip.h" 7036382Ssklower #include "../netinet/ip_var.h" 7136382Ssklower #include "../netinet/if_ether.h" 7236382Ssklower 7337469Ssklower #include "iso.h" 7437469Ssklower #include "iso_var.h" 7537469Ssklower #include "iso_snpac.h" 7637469Ssklower extern struct snpa_cache all_es, all_is; 7737469Ssklower #include "argo_debug.h" 7837469Ssklower #include "iso_errno.h" 7937469Ssklower #include "eonvar.h" 8039195Ssklower extern struct timeval time; 8136382Ssklower 8236382Ssklower #define EOK 0 8336382Ssklower 8436382Ssklower int eoninput(); 8536382Ssklower int eonoutput(); 8636382Ssklower int eonioctl(); 8736382Ssklower int eonattach(); 8836382Ssklower int eoninit(); 8940778Ssklower int eonrtrequest(); 9036382Ssklower extern int ip_output(); 9140778Ssklower struct ifnet eonif[1]; 9236382Ssklower 9337469Ssklower eonprotoinit() { 9440778Ssklower (void) eonattach(); 9537469Ssklower } 9640778Ssklower 9740778Ssklower struct eon_llinfo eon_llinfo; 9837469Ssklower #define PROBE_OK 0; 9936382Ssklower 10037469Ssklower 10136382Ssklower /* 10236382Ssklower * FUNCTION: eonattach 10336382Ssklower * 10436382Ssklower * PURPOSE: autoconf attach routine 10536382Ssklower * 10636382Ssklower * RETURNS: void 10736382Ssklower */ 10836382Ssklower 10940778Ssklower eonattach() 11036382Ssklower { 11140778Ssklower register struct ifnet *ifp = eonif; 11236382Ssklower 11336382Ssklower IFDEBUG(D_EON) 11436382Ssklower printf("eonattach()\n"); 11536382Ssklower ENDDEBUG 11640778Ssklower ifp->if_unit = 0; 11736382Ssklower ifp->if_name = "eon"; 11836382Ssklower ifp->if_mtu = ETHERMTU; 11936382Ssklower /* since everything will go out over ether or token ring */ 12036382Ssklower 12136382Ssklower ifp->if_init = eoninit; 12237469Ssklower ifp->if_ioctl = eonioctl; 12336382Ssklower ifp->if_output = eonoutput; 12437469Ssklower ifp->if_type = IFT_EON; 12537469Ssklower ifp->if_addrlen = 5; 12637469Ssklower ifp->if_hdrlen = EONIPLEN; 12736382Ssklower ifp->if_flags = IFF_BROADCAST; 12836382Ssklower if_attach(ifp); 12940778Ssklower eonioctl(ifp, SIOCSIFADDR, (caddr_t)ifp->if_addrlist); 13040778Ssklower eon_llinfo.el_qhdr.link = 13140778Ssklower eon_llinfo.el_qhdr.rlink = &(eon_llinfo.el_qhdr); 13236382Ssklower 13336382Ssklower IFDEBUG(D_EON) 13436382Ssklower printf("eonattach()\n"); 13536382Ssklower ENDDEBUG 13636382Ssklower } 13736382Ssklower 13836382Ssklower 13936382Ssklower /* 14036382Ssklower * FUNCTION: eonioctl 14136382Ssklower * 14236382Ssklower * PURPOSE: io controls - ifconfig 14336382Ssklower * need commands to 14436382Ssklower * link-UP (core addr) (flags: ES, IS) 14536382Ssklower * link-DOWN (core addr) (flags: ES, IS) 14636382Ssklower * must be callable from kernel or user 14736382Ssklower * 14836382Ssklower * RETURNS: nothing 14936382Ssklower */ 15036382Ssklower eonioctl(ifp, cmd, data) 15136382Ssklower register struct ifnet *ifp; 15240778Ssklower int cmd; 15336382Ssklower register caddr_t data; 15436382Ssklower { 15540778Ssklower int s = splimp(); 15636382Ssklower register int error = 0; 15736382Ssklower 15836382Ssklower IFDEBUG(D_EON) 15936382Ssklower printf("eonioctl (cmd 0x%x) \n", cmd); 16036382Ssklower ENDDEBUG 16136382Ssklower 16240778Ssklower switch (cmd) { 16340778Ssklower register struct ifaddr *ifa; 164*41393Ssklower extern link_rtrequest(); 16536382Ssklower 16636382Ssklower case SIOCSIFADDR: 16740778Ssklower if (ifa = (struct ifaddr *)data) { 16840778Ssklower ifp->if_flags |= IFF_UP; 169*41393Ssklower if (ifa->ifa_addr->sa_family != AF_LINK) 170*41393Ssklower ifa->ifa_rtrequest = eonrtrequest; 17140778Ssklower ifa->ifa_llinfolen = sizeof(struct eon_llinfo); 172*41393Ssklower } 17336382Ssklower break; 17436382Ssklower } 17536382Ssklower splx(s); 17636382Ssklower return(error); 17736382Ssklower } 17836382Ssklower 17940778Ssklower 18040778Ssklower eoniphdr(hdr, loc, ro, class, zero) 18140778Ssklower struct route *ro; 18240778Ssklower register struct eon_iphdr *hdr; 18340778Ssklower caddr_t loc; 18440778Ssklower { 18540778Ssklower struct mbuf mhead; 18640778Ssklower register struct sockaddr_in *sin = (struct sockaddr_in *)&ro->ro_dst; 18740778Ssklower if (zero) { 18840778Ssklower bzero((caddr_t)hdr, sizeof (*hdr)); 18940778Ssklower bzero((caddr_t)ro, sizeof (*ro)); 19040778Ssklower } 19140778Ssklower sin->sin_family = AF_INET; 19240778Ssklower sin->sin_len = sizeof (*sin); 19340778Ssklower bcopy(loc, (caddr_t)&sin->sin_addr, sizeof(struct in_addr)); 19440778Ssklower hdr->ei_ip.ip_dst = sin->sin_addr; 19540778Ssklower hdr->ei_ip.ip_p = IPPROTO_EON; 19640778Ssklower hdr->ei_ip.ip_ttl = MAXTTL; 19740778Ssklower hdr->ei_eh.eonh_class = class; 19840778Ssklower hdr->ei_eh.eonh_vers = EON_VERSION; 19940778Ssklower hdr->ei_eh.eonh_csum = 0; 20040778Ssklower mhead.m_data = (caddr_t) &hdr->ei_eh; 20140778Ssklower mhead.m_len = sizeof(struct eon_hdr); 20240778Ssklower mhead.m_next = 0; 20340778Ssklower IFDEBUG(D_EON) 20440778Ssklower printf("eonoutput : gen csum (0x%x, offset %d, datalen %d)\n", 20540778Ssklower &mhead, 20640778Ssklower _offsetof(struct eon_hdr, eonh_csum), sizeof(struct eon_hdr)); 20740778Ssklower ENDDEBUG 20840778Ssklower iso_gen_csum(&mhead, 20940778Ssklower _offsetof(struct eon_hdr, eonh_csum), sizeof(struct eon_hdr)); 21040778Ssklower } 21136382Ssklower /* 21240778Ssklower * FUNCTION: eonrtrequest 21336382Ssklower * 21440778Ssklower * PURPOSE: maintains list of direct eon recipients. 21540778Ssklower * sets up IP route for rest. 21636382Ssklower * 21736382Ssklower * RETURNS: nothing 21836382Ssklower */ 21940778Ssklower eonrtrequest(cmd, rt, gate) 22040778Ssklower register struct rtentry *rt; 22140778Ssklower struct sockaddr *gate; 22240778Ssklower { 22340778Ssklower caddr_t ipaddrloc = 0; 22440778Ssklower register struct eon_llinfo *el = (struct eon_llinfo *)rt->rt_llinfo; 22540778Ssklower register struct rtentry *iprt; 22640778Ssklower register struct sockaddr_in sin; 22736382Ssklower 22840778Ssklower if (el == 0) 22940778Ssklower panic("eonrtrequest"); 23040778Ssklower iprt = el->el_iproute.ro_rt; 23140778Ssklower /* 23240778Ssklower * Common Housekeeping 23340778Ssklower */ 23440778Ssklower switch (cmd) { 23540778Ssklower 23640778Ssklower case RTM_ADD: 23740778Ssklower insque(&(el->el_qhdr), &eon_llinfo.el_qhdr); 23840778Ssklower el->el_rt = rt; 23940778Ssklower break; 24040778Ssklower 24140778Ssklower case RTM_DELETE: 24240778Ssklower remque(&(el->el_qhdr)); 24340778Ssklower /* FALLTHROUGH */ 24440778Ssklower case RTM_CHANGE: 24540778Ssklower el->el_flags &= ~RTF_UP; 24640778Ssklower if (iprt) 24740778Ssklower RTFREE(iprt); 24840778Ssklower if (cmd = RTM_DELETE) 24940778Ssklower return; 25040778Ssklower } 25140778Ssklower if (gate || (gate = rt->rt_gateway)) switch (gate->sa_family) { 25240778Ssklower case AF_LINK: 25340778Ssklower ipaddrloc = LLADDR((struct sockaddr_dl *)gate); 25440778Ssklower break; 25540778Ssklower case AF_INET: 25640778Ssklower ipaddrloc = (caddr_t) &((struct sockaddr_in *)gate)->sin_addr; 25740778Ssklower break; 25840778Ssklower default: 25940778Ssklower return; 26040778Ssklower } 26140778Ssklower el->el_flags |= RTF_UP; 26240778Ssklower eoniphdr(&el->el_ei, &el->el_iproute, ipaddrloc, EON_NORMAL_ADDR, 0); 26336382Ssklower } 26436382Ssklower 26536382Ssklower /* 26640778Ssklower * FUNCTION: eoninit 26736382Ssklower * 26840778Ssklower * PURPOSE: initialization 26936382Ssklower * 27036382Ssklower * RETURNS: nothing 27136382Ssklower */ 27236382Ssklower 27340778Ssklower eoninit(unit) 27440778Ssklower int unit; 27536382Ssklower { 27640778Ssklower printf("eon driver-init eon%d\n", unit); 27736382Ssklower } 27836382Ssklower 27936382Ssklower 28036382Ssklower /* 28136382Ssklower * FUNCTION: eonoutput 28236382Ssklower * 28336382Ssklower * PURPOSE: prepend an eon header and hand to IP 28436382Ssklower * ARGUMENTS: (ifp) is points to the ifnet structure for this unit/device 28536382Ssklower * (m) is an mbuf *, *m is a CLNL packet 28636382Ssklower * (dst) is a destination address - have to interp. as 28736382Ssklower * multicast or broadcast or real address. 28836382Ssklower * 28936382Ssklower * RETURNS: unix error code 29036382Ssklower * 29136382Ssklower * NOTES: 29236382Ssklower * 29336382Ssklower */ 29440778Ssklower eonoutput(ifp, m, dst, rt) 29537469Ssklower struct ifnet *ifp; 29640778Ssklower register struct mbuf *m; /* packet */ 29736382Ssklower struct sockaddr_iso *dst; /* destination addr */ 29840778Ssklower struct rtentry *rt; 29936382Ssklower { 30040778Ssklower register struct eon_llinfo *el; 30140778Ssklower register struct eon_iphdr *ei; 30240778Ssklower struct route *ro; 30340778Ssklower int datalen; 30440778Ssklower struct mbuf *mh; 30540778Ssklower int error = 0; 30640778Ssklower caddr_t ippaddrloc; 30740778Ssklower static struct eon_iphdr eon_iphdr; 30840778Ssklower static struct route route; 30936382Ssklower 31036382Ssklower IFDEBUG(D_EON) 31136382Ssklower printf("eonoutput \n" ); 31236382Ssklower ENDDEBUG 31336382Ssklower 31439195Ssklower ifp->if_lastchange = time; 31539195Ssklower ifp->if_opackets++; 31640778Ssklower if (rt == 0 || (el = (struct eon_llinfo *)rt->rt_llinfo) == 0) { 31740778Ssklower if (dst->siso_family == AF_LINK) { 31840778Ssklower register struct sockaddr_dl *sdl = (struct sockaddr_dl *)dst; 31940778Ssklower caddr_t ipaddrloc = LLADDR(sdl); 32040778Ssklower int class = (sdl->sdl_alen == 5) ? 4[(u_char *)ipaddrloc] : 0; 32140778Ssklower 32240778Ssklower if (sdl->sdl_alen == 4 || sdl->sdl_alen == 5) { 32340778Ssklower ipaddrloc = LLADDR(sdl); 32440778Ssklower ro = &route; 32540778Ssklower ei = &eon_iphdr; 32640778Ssklower eoniphdr(ei, ipaddrloc, ro, class, 1); 32740778Ssklower goto send; 32840778Ssklower } 32940778Ssklower } 33040778Ssklower einval: 33137469Ssklower error = EINVAL; 33237469Ssklower goto flush; 33337469Ssklower } 33440778Ssklower if ((el->el_flags & RTF_UP) == 0) { 33540778Ssklower eonrtrequest(RTM_CHANGE, rt, (struct sockaddr *)0); 33640778Ssklower if ((el->el_flags & RTF_UP) == 0) { 33740778Ssklower error = EHOSTUNREACH; 33840778Ssklower goto flush; 33940778Ssklower } 34040778Ssklower } 34140778Ssklower if ((m->m_flags & M_PKTHDR) == 0) { 34237469Ssklower printf("eon: got non headered packet\n"); 34337469Ssklower goto einval; 34437469Ssklower } 34540778Ssklower ei = &el->el_ei; 34640778Ssklower ro = &el->el_iproute; 34740778Ssklower send: 34840778Ssklower /* put an eon_hdr in the buffer, prepended by an ip header */ 34940778Ssklower datalen = m->m_pkthdr.len + EONIPLEN; 35037469Ssklower MGETHDR(mh, M_DONTWAIT, MT_HEADER); 35137469Ssklower if(mh == (struct mbuf *)0) 35240778Ssklower goto flush; 35340778Ssklower mh->m_next = m; 35440778Ssklower m = mh; 35540778Ssklower MH_ALIGN(m, sizeof(struct eon_iphdr)); 35640778Ssklower m->m_len = sizeof(struct eon_iphdr); 35739195Ssklower ifp->if_obytes += 35840778Ssklower (ei->ei_ip.ip_len = (u_short)(m->m_pkthdr.len = datalen)); 35940778Ssklower *mtod(m, struct eon_iphdr *) = *ei; 36036382Ssklower 36136382Ssklower IFDEBUG(D_EON) 36240778Ssklower printf("eonoutput dst ip addr : %x\n", ei->ei_ip.ip_dst.s_addr); 36340778Ssklower printf("eonoutput ip_output : eonip header:\n"); 36440778Ssklower dump_buf(ei, sizeof(struct eon_iphdr)); 36536382Ssklower ENDDEBUG 36636382Ssklower 36740778Ssklower error = ip_output(m, (struct mbuf *)0, ro, 0); 36840778Ssklower m = 0; 36939195Ssklower if (error) { 37039195Ssklower ifp->if_oerrors++; 37139195Ssklower ifp->if_opackets--; 37240778Ssklower ifp->if_obytes -= datalen; 37339195Ssklower } 37440778Ssklower flush: 37540778Ssklower if (m) 37640778Ssklower m_freem(m); 37736382Ssklower return error; 37836382Ssklower } 37936382Ssklower 38037469Ssklower eoninput(m, iphlen) 38136382Ssklower register struct mbuf *m; 38237469Ssklower int iphlen; 38336382Ssklower { 38436382Ssklower register struct eon_hdr *eonhdr; 38536382Ssklower register struct ip *iphdr; 38636382Ssklower struct ifnet *eonifp; 38737469Ssklower int s; 38836382Ssklower 38936382Ssklower eonifp = &eonif[0]; /* kludge - really want to give CLNP 39036382Ssklower * the ifp for eon, not for the real device 39136382Ssklower */ 39236382Ssklower 39336382Ssklower IFDEBUG(D_EON) 39437469Ssklower printf("eoninput() 0x%x m_data 0x%x m_len 0x%x dequeued\n", 39537469Ssklower m, m?m->m_data:0, m?m->m_len:0); 39636382Ssklower ENDDEBUG 39736382Ssklower 39837469Ssklower if (m == 0) 39937469Ssklower return; 40037469Ssklower if (iphlen > sizeof (struct ip)) 40137469Ssklower ip_stripoptions(m, (struct mbuf *)0); 40237469Ssklower if (m->m_len < EONIPLEN) { 40337469Ssklower if ((m = m_pullup(m, EONIPLEN)) == 0) { 40437469Ssklower IncStat(es_badhdr); 40537469Ssklower drop: 40637469Ssklower IFDEBUG(D_EON) 40737469Ssklower printf("eoninput: DROP \n" ); 40837469Ssklower ENDDEBUG 40937469Ssklower eonifp->if_ierrors ++; 41037469Ssklower m_freem(m); 41137469Ssklower return; 41237469Ssklower } 41336382Ssklower } 41439195Ssklower eonif->if_ibytes += m->m_pkthdr.len; 41539195Ssklower eonif->if_lastchange = time; 41636382Ssklower iphdr = mtod(m, struct ip *); 41736382Ssklower /* do a few checks for debugging */ 41836382Ssklower if( iphdr->ip_p != IPPROTO_EON ) { 41936382Ssklower IncStat(es_badhdr); 42036382Ssklower goto drop; 42136382Ssklower } 42237469Ssklower /* temporarily drop ip header from the mbuf */ 42337469Ssklower m->m_data += sizeof(struct ip); 42436382Ssklower eonhdr = mtod(m, struct eon_hdr *); 42537469Ssklower if( iso_check_csum( m, sizeof(struct eon_hdr) ) != EOK ) { 42637469Ssklower IncStat(es_badcsum); 42737469Ssklower goto drop; 42837469Ssklower } 42937469Ssklower m->m_data -= sizeof(struct ip); 43037469Ssklower 43136382Ssklower IFDEBUG(D_EON) 43237469Ssklower printf("eoninput csum ok class 0x%x\n", eonhdr->eonh_class ); 43336382Ssklower printf("eoninput: eon header:\n"); 43436382Ssklower dump_buf(eonhdr, sizeof(struct eon_hdr)); 43536382Ssklower ENDDEBUG 43636382Ssklower 43736382Ssklower /* checks for debugging */ 43836382Ssklower if( eonhdr->eonh_vers != EON_VERSION) { 43936382Ssklower IncStat(es_badhdr); 44036382Ssklower goto drop; 44136382Ssklower } 44237469Ssklower m->m_flags &= ~(M_BCAST|M_MCAST); 44336382Ssklower switch( eonhdr->eonh_class) { 44436382Ssklower case EON_BROADCAST: 44536382Ssklower IncStat(es_in_broad); 44637469Ssklower m->m_flags |= M_BCAST; 44736382Ssklower break; 44836382Ssklower case EON_NORMAL_ADDR: 44936382Ssklower IncStat(es_in_normal); 45036382Ssklower break; 45136382Ssklower case EON_MULTICAST_ES: 45236382Ssklower IncStat(es_in_multi_es); 45337469Ssklower m->m_flags |= M_MCAST; 45436382Ssklower break; 45536382Ssklower case EON_MULTICAST_IS: 45636382Ssklower IncStat(es_in_multi_is); 45737469Ssklower m->m_flags |= M_MCAST; 45836382Ssklower break; 45936382Ssklower } 46039195Ssklower eonifp->if_ipackets++; 46136382Ssklower 46236382Ssklower { 46336382Ssklower /* put it on the CLNP queue and set soft interrupt */ 46436382Ssklower struct ifqueue *ifq; 46536382Ssklower extern struct ifqueue clnlintrq; 46636382Ssklower 46737469Ssklower m->m_pkthdr.rcvif = eonifp; /* KLUDGE */ 46836382Ssklower IFDEBUG(D_EON) 46936382Ssklower printf("eoninput to clnl IFQ\n"); 47036382Ssklower ENDDEBUG 47136382Ssklower ifq = &clnlintrq; 47237469Ssklower s = splimp(); 47336382Ssklower if (IF_QFULL(ifq)) { 47436382Ssklower IF_DROP(ifq); 47536382Ssklower m_freem(m); 47639195Ssklower eonifp->if_iqdrops++; 47739195Ssklower eonifp->if_ipackets--; 47836382Ssklower splx(s); 47936382Ssklower return; 48036382Ssklower } 48136382Ssklower IF_ENQUEUE(ifq, m); 48236382Ssklower IFDEBUG(D_EON) 48336382Ssklower printf( 48437469Ssklower "0x%x enqueued on clnp Q: m_len 0x%x m_type 0x%x m_data 0x%x\n", 48537469Ssklower m, m->m_len, m->m_type, m->m_data); 48636382Ssklower dump_buf(mtod(m, caddr_t), m->m_len); 48736382Ssklower ENDDEBUG 48837469Ssklower schednetisr(NETISR_ISO); 48937469Ssklower splx(s); 49036382Ssklower } 49136382Ssklower } 49236382Ssklower 49336382Ssklower int 49436382Ssklower eonctlinput(cmd, sin) 49536382Ssklower int cmd; 49636382Ssklower struct sockaddr_in *sin; 49736382Ssklower { 49836382Ssklower extern u_char inetctlerrmap[]; 49936382Ssklower 50036382Ssklower IFDEBUG(D_EON) 50136382Ssklower printf("eonctlinput: cmd 0x%x addr: ", cmd); 50236382Ssklower dump_isoaddr(sin); 50336382Ssklower printf("\n"); 50436382Ssklower ENDDEBUG 50536382Ssklower 50636382Ssklower if (cmd < 0 || cmd > PRC_NCMDS) 50736382Ssklower return 0; 50836382Ssklower 50936382Ssklower IncStat(es_icmp[cmd]); 51036382Ssklower switch (cmd) { 51136382Ssklower 51237469Ssklower case PRC_QUENCH: 51336382Ssklower case PRC_QUENCH2: 51436382Ssklower /* TODO: set the dec bit */ 51536382Ssklower break; 51636382Ssklower case PRC_TIMXCEED_REASS: 51736382Ssklower case PRC_ROUTEDEAD: 51836382Ssklower case PRC_HOSTUNREACH: 51936382Ssklower case PRC_UNREACH_NET: 52036382Ssklower case PRC_IFDOWN: 52136382Ssklower case PRC_UNREACH_HOST: 52236382Ssklower case PRC_HOSTDEAD: 52336382Ssklower case PRC_TIMXCEED_INTRANS: 52436382Ssklower /* TODO: mark the link down */ 52536382Ssklower break; 52636382Ssklower 52736382Ssklower case PRC_UNREACH_PROTOCOL: 52836382Ssklower case PRC_UNREACH_PORT: 52936382Ssklower case PRC_UNREACH_SRCFAIL: 53036382Ssklower case PRC_REDIRECT_NET: 53136382Ssklower case PRC_REDIRECT_HOST: 53236382Ssklower case PRC_REDIRECT_TOSNET: 53336382Ssklower case PRC_REDIRECT_TOSHOST: 53436382Ssklower case PRC_MSGSIZE: 53536382Ssklower case PRC_PARAMPROB: 53636382Ssklower printf("eonctlinput: ICMP cmd 0x%x\n", cmd ); 53736382Ssklower break; 53836382Ssklower } 53936382Ssklower return 0; 54036382Ssklower } 54136382Ssklower 54237469Ssklower #endif 543