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*45896Ssklower * @(#)if_eon.c 7.11 (Berkeley) 01/09/91 * 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 #include "argo_debug.h" 7737469Ssklower #include "iso_errno.h" 7837469Ssklower #include "eonvar.h" 7939195Ssklower extern struct timeval time; 8036382Ssklower 8136382Ssklower #define EOK 0 8236382Ssklower 8336382Ssklower int eoninput(); 8436382Ssklower int eonoutput(); 8536382Ssklower int eonioctl(); 8636382Ssklower int eonattach(); 8736382Ssklower int eoninit(); 8840778Ssklower int eonrtrequest(); 8936382Ssklower extern int ip_output(); 9040778Ssklower struct ifnet eonif[1]; 9136382Ssklower 9237469Ssklower eonprotoinit() { 9340778Ssklower (void) eonattach(); 9437469Ssklower } 9540778Ssklower 9640778Ssklower struct eon_llinfo eon_llinfo; 9737469Ssklower #define PROBE_OK 0; 9836382Ssklower 9937469Ssklower 10036382Ssklower /* 10136382Ssklower * FUNCTION: eonattach 10236382Ssklower * 10336382Ssklower * PURPOSE: autoconf attach routine 10436382Ssklower * 10536382Ssklower * RETURNS: void 10636382Ssklower */ 10736382Ssklower 10840778Ssklower eonattach() 10936382Ssklower { 11040778Ssklower register struct ifnet *ifp = eonif; 11136382Ssklower 11236382Ssklower IFDEBUG(D_EON) 11336382Ssklower printf("eonattach()\n"); 11436382Ssklower ENDDEBUG 11540778Ssklower ifp->if_unit = 0; 11636382Ssklower ifp->if_name = "eon"; 11736382Ssklower ifp->if_mtu = ETHERMTU; 11836382Ssklower /* since everything will go out over ether or token ring */ 11936382Ssklower 12036382Ssklower ifp->if_init = eoninit; 12137469Ssklower ifp->if_ioctl = eonioctl; 12236382Ssklower ifp->if_output = eonoutput; 12337469Ssklower ifp->if_type = IFT_EON; 12437469Ssklower ifp->if_addrlen = 5; 12537469Ssklower ifp->if_hdrlen = EONIPLEN; 12636382Ssklower ifp->if_flags = IFF_BROADCAST; 12736382Ssklower if_attach(ifp); 12840778Ssklower eonioctl(ifp, SIOCSIFADDR, (caddr_t)ifp->if_addrlist); 12940778Ssklower eon_llinfo.el_qhdr.link = 13040778Ssklower eon_llinfo.el_qhdr.rlink = &(eon_llinfo.el_qhdr); 13136382Ssklower 13236382Ssklower IFDEBUG(D_EON) 13336382Ssklower printf("eonattach()\n"); 13436382Ssklower ENDDEBUG 13536382Ssklower } 13636382Ssklower 13736382Ssklower 13836382Ssklower /* 13936382Ssklower * FUNCTION: eonioctl 14036382Ssklower * 14136382Ssklower * PURPOSE: io controls - ifconfig 14236382Ssklower * need commands to 14336382Ssklower * link-UP (core addr) (flags: ES, IS) 14436382Ssklower * link-DOWN (core addr) (flags: ES, IS) 14536382Ssklower * must be callable from kernel or user 14636382Ssklower * 14736382Ssklower * RETURNS: nothing 14836382Ssklower */ 14936382Ssklower eonioctl(ifp, cmd, data) 15036382Ssklower register struct ifnet *ifp; 15140778Ssklower int cmd; 15236382Ssklower register caddr_t data; 15336382Ssklower { 15440778Ssklower int s = splimp(); 15536382Ssklower register int error = 0; 15636382Ssklower 15736382Ssklower IFDEBUG(D_EON) 15836382Ssklower printf("eonioctl (cmd 0x%x) \n", cmd); 15936382Ssklower ENDDEBUG 16036382Ssklower 16140778Ssklower switch (cmd) { 16240778Ssklower register struct ifaddr *ifa; 16336382Ssklower 16436382Ssklower case SIOCSIFADDR: 16540778Ssklower if (ifa = (struct ifaddr *)data) { 16640778Ssklower ifp->if_flags |= IFF_UP; 16741393Ssklower if (ifa->ifa_addr->sa_family != AF_LINK) 16841393Ssklower ifa->ifa_rtrequest = eonrtrequest; 16940778Ssklower ifa->ifa_llinfolen = sizeof(struct eon_llinfo); 17041393Ssklower } 17136382Ssklower break; 17236382Ssklower } 17336382Ssklower splx(s); 17436382Ssklower return(error); 17536382Ssklower } 17636382Ssklower 17740778Ssklower 17840778Ssklower eoniphdr(hdr, loc, ro, class, zero) 17940778Ssklower struct route *ro; 18040778Ssklower register struct eon_iphdr *hdr; 18140778Ssklower caddr_t loc; 18240778Ssklower { 18340778Ssklower struct mbuf mhead; 18440778Ssklower register struct sockaddr_in *sin = (struct sockaddr_in *)&ro->ro_dst; 18540778Ssklower if (zero) { 18640778Ssklower bzero((caddr_t)hdr, sizeof (*hdr)); 18740778Ssklower bzero((caddr_t)ro, sizeof (*ro)); 18840778Ssklower } 18940778Ssklower sin->sin_family = AF_INET; 19040778Ssklower sin->sin_len = sizeof (*sin); 19140778Ssklower bcopy(loc, (caddr_t)&sin->sin_addr, sizeof(struct in_addr)); 19240778Ssklower hdr->ei_ip.ip_dst = sin->sin_addr; 19340778Ssklower hdr->ei_ip.ip_p = IPPROTO_EON; 19440778Ssklower hdr->ei_ip.ip_ttl = MAXTTL; 19540778Ssklower hdr->ei_eh.eonh_class = class; 19640778Ssklower hdr->ei_eh.eonh_vers = EON_VERSION; 19740778Ssklower hdr->ei_eh.eonh_csum = 0; 19840778Ssklower mhead.m_data = (caddr_t) &hdr->ei_eh; 19940778Ssklower mhead.m_len = sizeof(struct eon_hdr); 20040778Ssklower mhead.m_next = 0; 20140778Ssklower IFDEBUG(D_EON) 20240778Ssklower printf("eonoutput : gen csum (0x%x, offset %d, datalen %d)\n", 20340778Ssklower &mhead, 20440778Ssklower _offsetof(struct eon_hdr, eonh_csum), sizeof(struct eon_hdr)); 20540778Ssklower ENDDEBUG 20640778Ssklower iso_gen_csum(&mhead, 20740778Ssklower _offsetof(struct eon_hdr, eonh_csum), sizeof(struct eon_hdr)); 20840778Ssklower } 20936382Ssklower /* 21040778Ssklower * FUNCTION: eonrtrequest 21136382Ssklower * 21240778Ssklower * PURPOSE: maintains list of direct eon recipients. 21340778Ssklower * sets up IP route for rest. 21436382Ssklower * 21536382Ssklower * RETURNS: nothing 21636382Ssklower */ 21740778Ssklower eonrtrequest(cmd, rt, gate) 21840778Ssklower register struct rtentry *rt; 21942321Ssklower register struct sockaddr *gate; 22040778Ssklower { 22142321Ssklower unsigned long zerodst = 0; 22242321Ssklower caddr_t ipaddrloc = (caddr_t) &zerodst; 22340778Ssklower register struct eon_llinfo *el = (struct eon_llinfo *)rt->rt_llinfo; 22436382Ssklower 22540778Ssklower /* 22640778Ssklower * Common Housekeeping 22740778Ssklower */ 22840778Ssklower switch (cmd) { 22943333Ssklower case RTM_DELETE: 23043333Ssklower if (el) { 23143333Ssklower remque(&(el->el_qhdr)); 23243333Ssklower if (el->el_iproute.ro_rt) 23343333Ssklower RTFREE(el->el_iproute.ro_rt); 23443333Ssklower Free(el); 23543333Ssklower rt->rt_llinfo = 0; 23643333Ssklower } 23743333Ssklower return; 23840778Ssklower 23943333Ssklower case RTM_RESOLVE: 24040778Ssklower case RTM_ADD: 24143333Ssklower R_Malloc(el, struct eon_llinfo *, sizeof(*el)); 24243333Ssklower rt->rt_llinfo = (caddr_t)el; 24343333Ssklower if (el == 0) 24443333Ssklower return; 24543333Ssklower Bzero(el, sizeof(*el)); 24640778Ssklower insque(&(el->el_qhdr), &eon_llinfo.el_qhdr); 24740778Ssklower el->el_rt = rt; 24840778Ssklower break; 24940778Ssklower } 25040778Ssklower if (gate || (gate = rt->rt_gateway)) switch (gate->sa_family) { 25140778Ssklower case AF_LINK: 25242321Ssklower #define SDL(x) ((struct sockaddr_dl *)x) 25342321Ssklower if (SDL(gate)->sdl_alen = 1) 25442321Ssklower el->el_snpaoffset = *(u_char *)LLADDR(SDL(gate)); 25542321Ssklower else 25642321Ssklower ipaddrloc = LLADDR(SDL(gate)); 25740778Ssklower break; 25840778Ssklower case AF_INET: 25942321Ssklower #define SIN(x) ((struct sockaddr_in *)x) 26042321Ssklower ipaddrloc = (caddr_t) &SIN(gate)->sin_addr; 26140778Ssklower break; 26240778Ssklower default: 26340778Ssklower return; 26440778Ssklower } 26540778Ssklower el->el_flags |= RTF_UP; 26641926Ssklower eoniphdr(&el->el_ei, ipaddrloc, &el->el_iproute, EON_NORMAL_ADDR, 0); 26736382Ssklower } 26836382Ssklower 26936382Ssklower /* 27040778Ssklower * FUNCTION: eoninit 27136382Ssklower * 27240778Ssklower * PURPOSE: initialization 27336382Ssklower * 27436382Ssklower * RETURNS: nothing 27536382Ssklower */ 27636382Ssklower 27740778Ssklower eoninit(unit) 27840778Ssklower int unit; 27936382Ssklower { 28040778Ssklower printf("eon driver-init eon%d\n", unit); 28136382Ssklower } 28236382Ssklower 28336382Ssklower 28436382Ssklower /* 28536382Ssklower * FUNCTION: eonoutput 28636382Ssklower * 28736382Ssklower * PURPOSE: prepend an eon header and hand to IP 28836382Ssklower * ARGUMENTS: (ifp) is points to the ifnet structure for this unit/device 28936382Ssklower * (m) is an mbuf *, *m is a CLNL packet 29036382Ssklower * (dst) is a destination address - have to interp. as 29136382Ssklower * multicast or broadcast or real address. 29236382Ssklower * 29336382Ssklower * RETURNS: unix error code 29436382Ssklower * 29536382Ssklower * NOTES: 29636382Ssklower * 29736382Ssklower */ 29840778Ssklower eonoutput(ifp, m, dst, rt) 29937469Ssklower struct ifnet *ifp; 30040778Ssklower register struct mbuf *m; /* packet */ 30136382Ssklower struct sockaddr_iso *dst; /* destination addr */ 30240778Ssklower struct rtentry *rt; 30336382Ssklower { 30440778Ssklower register struct eon_llinfo *el; 30540778Ssklower register struct eon_iphdr *ei; 30640778Ssklower struct route *ro; 30740778Ssklower int datalen; 30840778Ssklower struct mbuf *mh; 309*45896Ssklower int error = 0, class = 0, alen = 0; 310*45896Ssklower caddr_t ipaddrloc; 31140778Ssklower static struct eon_iphdr eon_iphdr; 31240778Ssklower static struct route route; 31336382Ssklower 31436382Ssklower IFDEBUG(D_EON) 31536382Ssklower printf("eonoutput \n" ); 31636382Ssklower ENDDEBUG 31736382Ssklower 31839195Ssklower ifp->if_lastchange = time; 31939195Ssklower ifp->if_opackets++; 32040778Ssklower if (rt == 0 || (el = (struct eon_llinfo *)rt->rt_llinfo) == 0) { 32140778Ssklower if (dst->siso_family == AF_LINK) { 32240778Ssklower register struct sockaddr_dl *sdl = (struct sockaddr_dl *)dst; 32340778Ssklower 324*45896Ssklower ipaddrloc = LLADDR(sdl); 325*45896Ssklower alen = sdl->sdl_alen; 326*45896Ssklower } else if (dst->siso_family == AF_ISO && dst->siso_data[0] == AFI_SNA) { 327*45896Ssklower alen = dst->siso_nlen - 1; 328*45896Ssklower ipaddrloc = (caddr_t) dst->siso_data + 1; 32940778Ssklower } 330*45896Ssklower switch (alen) { 331*45896Ssklower case 5: 332*45896Ssklower class = 4[(u_char *)ipaddrloc]; 333*45896Ssklower case 4: 334*45896Ssklower ro = &route; 335*45896Ssklower ei = &eon_iphdr; 336*45896Ssklower eoniphdr(ei, ipaddrloc, ro, class, 1); 337*45896Ssklower goto send; 338*45896Ssklower } 33940778Ssklower einval: 34037469Ssklower error = EINVAL; 34137469Ssklower goto flush; 34237469Ssklower } 34340778Ssklower if ((el->el_flags & RTF_UP) == 0) { 34440778Ssklower eonrtrequest(RTM_CHANGE, rt, (struct sockaddr *)0); 34540778Ssklower if ((el->el_flags & RTF_UP) == 0) { 34640778Ssklower error = EHOSTUNREACH; 34740778Ssklower goto flush; 34840778Ssklower } 34940778Ssklower } 35040778Ssklower if ((m->m_flags & M_PKTHDR) == 0) { 35137469Ssklower printf("eon: got non headered packet\n"); 35237469Ssklower goto einval; 35337469Ssklower } 35440778Ssklower ei = &el->el_ei; 35540778Ssklower ro = &el->el_iproute; 35642321Ssklower if (el->el_snpaoffset) { 35742321Ssklower if (dst->siso_family == AF_ISO) { 35842321Ssklower bcopy((caddr_t) &dst->siso_data[el->el_snpaoffset], 35942321Ssklower (caddr_t) &ei->ei_ip.ip_dst, sizeof(ei->ei_ip.ip_dst)); 36042321Ssklower } else 36142321Ssklower goto einval; 36242321Ssklower } 36340778Ssklower send: 36440778Ssklower /* put an eon_hdr in the buffer, prepended by an ip header */ 36540778Ssklower datalen = m->m_pkthdr.len + EONIPLEN; 36637469Ssklower MGETHDR(mh, M_DONTWAIT, MT_HEADER); 36737469Ssklower if(mh == (struct mbuf *)0) 36840778Ssklower goto flush; 36940778Ssklower mh->m_next = m; 37040778Ssklower m = mh; 37140778Ssklower MH_ALIGN(m, sizeof(struct eon_iphdr)); 37240778Ssklower m->m_len = sizeof(struct eon_iphdr); 37339195Ssklower ifp->if_obytes += 37440778Ssklower (ei->ei_ip.ip_len = (u_short)(m->m_pkthdr.len = datalen)); 37540778Ssklower *mtod(m, struct eon_iphdr *) = *ei; 37636382Ssklower 37736382Ssklower IFDEBUG(D_EON) 37840778Ssklower printf("eonoutput dst ip addr : %x\n", ei->ei_ip.ip_dst.s_addr); 37940778Ssklower printf("eonoutput ip_output : eonip header:\n"); 38040778Ssklower dump_buf(ei, sizeof(struct eon_iphdr)); 38136382Ssklower ENDDEBUG 38236382Ssklower 38340778Ssklower error = ip_output(m, (struct mbuf *)0, ro, 0); 38440778Ssklower m = 0; 38539195Ssklower if (error) { 38639195Ssklower ifp->if_oerrors++; 38739195Ssklower ifp->if_opackets--; 38840778Ssklower ifp->if_obytes -= datalen; 38939195Ssklower } 39040778Ssklower flush: 39140778Ssklower if (m) 39240778Ssklower m_freem(m); 39336382Ssklower return error; 39436382Ssklower } 39536382Ssklower 39637469Ssklower eoninput(m, iphlen) 39736382Ssklower register struct mbuf *m; 39837469Ssklower int iphlen; 39936382Ssklower { 40036382Ssklower register struct eon_hdr *eonhdr; 40136382Ssklower register struct ip *iphdr; 40236382Ssklower struct ifnet *eonifp; 40337469Ssklower int s; 40436382Ssklower 40536382Ssklower eonifp = &eonif[0]; /* kludge - really want to give CLNP 40636382Ssklower * the ifp for eon, not for the real device 40736382Ssklower */ 40836382Ssklower 40936382Ssklower IFDEBUG(D_EON) 41037469Ssklower printf("eoninput() 0x%x m_data 0x%x m_len 0x%x dequeued\n", 41137469Ssklower m, m?m->m_data:0, m?m->m_len:0); 41236382Ssklower ENDDEBUG 41336382Ssklower 41437469Ssklower if (m == 0) 41537469Ssklower return; 41637469Ssklower if (iphlen > sizeof (struct ip)) 41737469Ssklower ip_stripoptions(m, (struct mbuf *)0); 41837469Ssklower if (m->m_len < EONIPLEN) { 41937469Ssklower if ((m = m_pullup(m, EONIPLEN)) == 0) { 42037469Ssklower IncStat(es_badhdr); 42137469Ssklower drop: 42237469Ssklower IFDEBUG(D_EON) 42337469Ssklower printf("eoninput: DROP \n" ); 42437469Ssklower ENDDEBUG 42537469Ssklower eonifp->if_ierrors ++; 42637469Ssklower m_freem(m); 42737469Ssklower return; 42837469Ssklower } 42936382Ssklower } 43039195Ssklower eonif->if_ibytes += m->m_pkthdr.len; 43139195Ssklower eonif->if_lastchange = time; 43236382Ssklower iphdr = mtod(m, struct ip *); 43336382Ssklower /* do a few checks for debugging */ 43436382Ssklower if( iphdr->ip_p != IPPROTO_EON ) { 43536382Ssklower IncStat(es_badhdr); 43636382Ssklower goto drop; 43736382Ssklower } 43837469Ssklower /* temporarily drop ip header from the mbuf */ 43937469Ssklower m->m_data += sizeof(struct ip); 44036382Ssklower eonhdr = mtod(m, struct eon_hdr *); 44137469Ssklower if( iso_check_csum( m, sizeof(struct eon_hdr) ) != EOK ) { 44237469Ssklower IncStat(es_badcsum); 44337469Ssklower goto drop; 44437469Ssklower } 44537469Ssklower m->m_data -= sizeof(struct ip); 44637469Ssklower 44736382Ssklower IFDEBUG(D_EON) 44837469Ssklower printf("eoninput csum ok class 0x%x\n", eonhdr->eonh_class ); 44936382Ssklower printf("eoninput: eon header:\n"); 45036382Ssklower dump_buf(eonhdr, sizeof(struct eon_hdr)); 45136382Ssklower ENDDEBUG 45236382Ssklower 45336382Ssklower /* checks for debugging */ 45436382Ssklower if( eonhdr->eonh_vers != EON_VERSION) { 45536382Ssklower IncStat(es_badhdr); 45636382Ssklower goto drop; 45736382Ssklower } 45837469Ssklower m->m_flags &= ~(M_BCAST|M_MCAST); 45936382Ssklower switch( eonhdr->eonh_class) { 46036382Ssklower case EON_BROADCAST: 46136382Ssklower IncStat(es_in_broad); 46237469Ssklower m->m_flags |= M_BCAST; 46336382Ssklower break; 46436382Ssklower case EON_NORMAL_ADDR: 46536382Ssklower IncStat(es_in_normal); 46636382Ssklower break; 46736382Ssklower case EON_MULTICAST_ES: 46836382Ssklower IncStat(es_in_multi_es); 46937469Ssklower m->m_flags |= M_MCAST; 47036382Ssklower break; 47136382Ssklower case EON_MULTICAST_IS: 47236382Ssklower IncStat(es_in_multi_is); 47337469Ssklower m->m_flags |= M_MCAST; 47436382Ssklower break; 47536382Ssklower } 47639195Ssklower eonifp->if_ipackets++; 47736382Ssklower 47836382Ssklower { 47936382Ssklower /* put it on the CLNP queue and set soft interrupt */ 48036382Ssklower struct ifqueue *ifq; 48136382Ssklower extern struct ifqueue clnlintrq; 48236382Ssklower 48337469Ssklower m->m_pkthdr.rcvif = eonifp; /* KLUDGE */ 48436382Ssklower IFDEBUG(D_EON) 48536382Ssklower printf("eoninput to clnl IFQ\n"); 48636382Ssklower ENDDEBUG 48736382Ssklower ifq = &clnlintrq; 48837469Ssklower s = splimp(); 48936382Ssklower if (IF_QFULL(ifq)) { 49036382Ssklower IF_DROP(ifq); 49136382Ssklower m_freem(m); 49239195Ssklower eonifp->if_iqdrops++; 49339195Ssklower eonifp->if_ipackets--; 49436382Ssklower splx(s); 49536382Ssklower return; 49636382Ssklower } 49736382Ssklower IF_ENQUEUE(ifq, m); 49836382Ssklower IFDEBUG(D_EON) 49936382Ssklower printf( 50037469Ssklower "0x%x enqueued on clnp Q: m_len 0x%x m_type 0x%x m_data 0x%x\n", 50137469Ssklower m, m->m_len, m->m_type, m->m_data); 50236382Ssklower dump_buf(mtod(m, caddr_t), m->m_len); 50336382Ssklower ENDDEBUG 50437469Ssklower schednetisr(NETISR_ISO); 50537469Ssklower splx(s); 50636382Ssklower } 50736382Ssklower } 50836382Ssklower 50936382Ssklower int 51036382Ssklower eonctlinput(cmd, sin) 51136382Ssklower int cmd; 51236382Ssklower struct sockaddr_in *sin; 51336382Ssklower { 51436382Ssklower extern u_char inetctlerrmap[]; 51536382Ssklower 51636382Ssklower IFDEBUG(D_EON) 51736382Ssklower printf("eonctlinput: cmd 0x%x addr: ", cmd); 51836382Ssklower dump_isoaddr(sin); 51936382Ssklower printf("\n"); 52036382Ssklower ENDDEBUG 52136382Ssklower 52236382Ssklower if (cmd < 0 || cmd > PRC_NCMDS) 52336382Ssklower return 0; 52436382Ssklower 52536382Ssklower IncStat(es_icmp[cmd]); 52636382Ssklower switch (cmd) { 52736382Ssklower 52837469Ssklower case PRC_QUENCH: 52936382Ssklower case PRC_QUENCH2: 53036382Ssklower /* TODO: set the dec bit */ 53136382Ssklower break; 53236382Ssklower case PRC_TIMXCEED_REASS: 53336382Ssklower case PRC_ROUTEDEAD: 53436382Ssklower case PRC_HOSTUNREACH: 53536382Ssklower case PRC_UNREACH_NET: 53636382Ssklower case PRC_IFDOWN: 53736382Ssklower case PRC_UNREACH_HOST: 53836382Ssklower case PRC_HOSTDEAD: 53936382Ssklower case PRC_TIMXCEED_INTRANS: 54036382Ssklower /* TODO: mark the link down */ 54136382Ssklower break; 54236382Ssklower 54336382Ssklower case PRC_UNREACH_PROTOCOL: 54436382Ssklower case PRC_UNREACH_PORT: 54536382Ssklower case PRC_UNREACH_SRCFAIL: 54636382Ssklower case PRC_REDIRECT_NET: 54736382Ssklower case PRC_REDIRECT_HOST: 54836382Ssklower case PRC_REDIRECT_TOSNET: 54936382Ssklower case PRC_REDIRECT_TOSHOST: 55036382Ssklower case PRC_MSGSIZE: 55136382Ssklower case PRC_PARAMPROB: 552*45896Ssklower /* printf("eonctlinput: ICMP cmd 0x%x\n", cmd );*/ 55336382Ssklower break; 55436382Ssklower } 55536382Ssklower return 0; 55636382Ssklower } 55736382Ssklower 55837469Ssklower #endif 559