diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-10-07 15:10:20 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2017-01-10 09:53:31 +0100 |
commit | c40e45b75eb76d79a05c7fa85c1fa9b5c728a12f (patch) | |
tree | ad4f2519067709f00ab98b3c591186c26dc3a21f /freebsd/sys/net/if_arcsubr.c | |
parent | userspace-header-gen.py: Simplify program ports (diff) | |
download | rtems-libbsd-c40e45b75eb76d79a05c7fa85c1fa9b5c728a12f.tar.bz2 |
Update to FreeBSD head 2016-08-23
Git mirror commit 9fe7c416e6abb28b1398fd3e5687099846800cfd.
Diffstat (limited to 'freebsd/sys/net/if_arcsubr.c')
-rw-r--r-- | freebsd/sys/net/if_arcsubr.c | 139 |
1 files changed, 44 insertions, 95 deletions
diff --git a/freebsd/sys/net/if_arcsubr.c b/freebsd/sys/net/if_arcsubr.c index fae432ad..1954e262 100644 --- a/freebsd/sys/net/if_arcsubr.c +++ b/freebsd/sys/net/if_arcsubr.c @@ -42,7 +42,6 @@ */ #include <rtems/bsd/local/opt_inet.h> #include <rtems/bsd/local/opt_inet6.h> -#include <rtems/bsd/local/opt_ipx.h> #include <rtems/bsd/sys/param.h> #include <sys/systm.h> @@ -59,6 +58,7 @@ #include <machine/cpu.h> #include <net/if.h> +#include <net/if_var.h> #include <net/netisr.h> #include <net/route.h> #include <net/if_dl.h> @@ -78,11 +78,6 @@ #include <netinet6/nd6.h> #endif -#ifdef IPX -#include <netipx/ipx.h> -#include <netipx/ipx_if.h> -#endif - #define ARCNET_ALLOW_BROKEN_ARP static struct mbuf *arc_defrag(struct ifnet *, struct mbuf *); @@ -94,8 +89,7 @@ u_int8_t arcbroadcastaddr = 0; #define ARC_LLADDR(ifp) (*(u_int8_t *)IF_LLADDR(ifp)) #define senderr(e) { error = (e); goto bad;} -#define SIN(s) ((struct sockaddr_in *)s) -#define SIPX(s) ((struct sockaddr_ipx *)s) +#define SIN(s) ((const struct sockaddr_in *)(s)) /* * ARCnet output routine. @@ -103,7 +97,7 @@ u_int8_t arcbroadcastaddr = 0; * Assumes that ifp is actually pointer to arccom structure. */ int -arc_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, +arc_output(struct ifnet *ifp, struct mbuf *m, const struct sockaddr *dst, struct route *ro) { struct arc_header *ah; @@ -112,7 +106,7 @@ arc_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, int loop_copy = 0; int isphds; #if defined(INET) || defined(INET6) - struct llentry *lle; + int is_gw = 0; #endif if (!((ifp->if_flags & IFF_UP) && @@ -120,6 +114,10 @@ arc_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, return(ENETDOWN); /* m, m1 aren't initialized yet */ error = 0; +#if defined(INET) || defined(INET6) + if (ro != NULL) + is_gw = (ro->ro_flags & RT_HAS_GW) != 0; +#endif switch (dst->sa_family) { #ifdef INET @@ -133,8 +131,8 @@ arc_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, else if (ifp->if_flags & IFF_NOARP) adst = ntohl(SIN(dst)->sin_addr.s_addr) & 0xFF; else { - error = arpresolve(ifp, ro ? ro->ro_rt : NULL, - m, dst, &adst, &lle); + error = arpresolve(ifp, is_gw, m, dst, &adst, NULL, + NULL); if (error) return (error == EWOULDBLOCK ? 0 : error); } @@ -172,24 +170,23 @@ arc_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, #endif #ifdef INET6 case AF_INET6: - error = nd6_storelladdr(ifp, m, dst, (u_char *)&adst, &lle); - if (error) - return (error); + if ((m->m_flags & M_MCAST) != 0) + adst = arcbroadcastaddr; /* ARCnet broadcast address */ + else { + error = nd6_resolve(ifp, is_gw, m, dst, &adst, NULL, + NULL); + if (error != 0) + return (error == EWOULDBLOCK ? 0 : error); + } atype = ARCTYPE_INET6; break; #endif -#ifdef IPX - case AF_IPX: - adst = SIPX(dst)->sipx_addr.x_host.c_host[5]; - atype = ARCTYPE_IPX; - if (adst == 0xff) - adst = arcbroadcastaddr; - break; -#endif - case AF_UNSPEC: + { + const struct arc_header *ah; + loop_copy = -1; - ah = (struct arc_header *)dst->sa_data; + ah = (const struct arc_header *)dst->sa_data; adst = ah->arc_dhost; atype = ah->arc_type; @@ -209,15 +206,15 @@ arc_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, #endif } break; - + } default: if_printf(ifp, "can't handle af%d\n", dst->sa_family); senderr(EAFNOSUPPORT); } isphds = arc_isphds(atype); - M_PREPEND(m, isphds ? ARC_HDRNEWLEN : ARC_HDRLEN, M_DONTWAIT); - if (m == 0) + M_PREPEND(m, isphds ? ARC_HDRNEWLEN : ARC_HDRLEN, M_NOWAIT); + if (m == NULL) senderr(ENOBUFS); ah = mtod(m, struct arc_header *); ah->arc_type = atype; @@ -268,12 +265,12 @@ arc_frag_next(struct ifnet *ifp) struct arc_header *ah; ac = (struct arccom *)ifp->if_l2com; - if ((m = ac->curr_frag) == 0) { + if ((m = ac->curr_frag) == NULL) { int tfrags; /* dequeue new packet */ IF_DEQUEUE(&ifp->if_snd, m); - if (m == 0) + if (m == NULL) return 0; ah = mtod(m, struct arc_header *); @@ -281,7 +278,7 @@ arc_frag_next(struct ifnet *ifp) return m; ++ac->ac_seqid; /* make the seqid unique */ - tfrags = (m->m_pkthdr.len + ARC_MAX_DATA - 1) / ARC_MAX_DATA; + tfrags = howmany(m->m_pkthdr.len, ARC_MAX_DATA); ac->fsflag = 2 * tfrags - 3; ac->sflag = 0; ac->rsflag = ac->fsflag; @@ -296,14 +293,14 @@ arc_frag_next(struct ifnet *ifp) /* split out next fragment and return it */ if (ac->sflag < ac->fsflag) { /* we CAN'T have short packets here */ - ac->curr_frag = m_split(m, ARC_MAX_DATA, M_DONTWAIT); + ac->curr_frag = m_split(m, ARC_MAX_DATA, M_NOWAIT); if (ac->curr_frag == 0) { m_freem(m); return 0; } - M_PREPEND(m, ARC_HDRNEWLEN, M_DONTWAIT); - if (m == 0) { + M_PREPEND(m, ARC_HDRNEWLEN, M_NOWAIT); + if (m == NULL) { m_freem(ac->curr_frag); ac->curr_frag = 0; return 0; @@ -321,8 +318,8 @@ arc_frag_next(struct ifnet *ifp) ARC_MAX_FORBID_LEN - ARC_HDRNEWLEN + 2)) { ac->curr_frag = 0; - M_PREPEND(m, ARC_HDRNEWLEN_EXC, M_DONTWAIT); - if (m == 0) + M_PREPEND(m, ARC_HDRNEWLEN_EXC, M_NOWAIT); + if (m == NULL) return 0; ah = mtod(m, struct arc_header *); @@ -334,8 +331,8 @@ arc_frag_next(struct ifnet *ifp) } else { ac->curr_frag = 0; - M_PREPEND(m, ARC_HDRNEWLEN, M_DONTWAIT); - if (m == 0) + M_PREPEND(m, ARC_HDRNEWLEN, M_NOWAIT); + if (m == NULL) return 0; ah = mtod(m, struct arc_header *); @@ -352,7 +349,7 @@ arc_frag_next(struct ifnet *ifp) /* * Defragmenter. Returns mbuf if last packet found, else - * NULL. frees imcoming mbuf as necessary. + * NULL. frees incoming mbuf as necessary. */ static __inline struct mbuf * @@ -371,7 +368,7 @@ arc_defrag(struct ifnet *ifp, struct mbuf *m) if (m->m_len < ARC_HDRNEWLEN) { m = m_pullup(m, ARC_HDRNEWLEN); if (m == NULL) { - ++ifp->if_ierrors; + if_inc_counter(ifp, IFCOUNTER_IERRORS, 1); return NULL; } } @@ -391,7 +388,7 @@ arc_defrag(struct ifnet *ifp, struct mbuf *m) if (m->m_len < ARC_HDRNEWLEN) { m = m_pullup(m, ARC_HDRNEWLEN); if (m == NULL) { - ++ifp->if_ierrors; + if_inc_counter(ifp, IFCOUNTER_IERRORS, 1); return NULL; } } @@ -544,11 +541,11 @@ arc_input(struct ifnet *ifp, struct mbuf *m) return; } - ifp->if_ibytes += m->m_pkthdr.len; + if_inc_counter(ifp, IFCOUNTER_IBYTES, m->m_pkthdr.len); if (ah->arc_dhost == arcbroadcastaddr) { m->m_flags |= M_BCAST|M_MCAST; - ifp->if_imcasts++; + if_inc_counter(ifp, IFCOUNTER_IMCASTS, 1); } atype = ah->arc_type; @@ -556,15 +553,11 @@ arc_input(struct ifnet *ifp, struct mbuf *m) #ifdef INET case ARCTYPE_IP: m_adj(m, ARC_HDRNEWLEN); - if ((m = ip_fastforward(m)) == NULL) - return; isr = NETISR_IP; break; case ARCTYPE_IP_OLD: m_adj(m, ARC_HDRLEN); - if ((m = ip_fastforward(m)) == NULL) - return; isr = NETISR_IP; break; @@ -600,12 +593,6 @@ arc_input(struct ifnet *ifp, struct mbuf *m) isr = NETISR_IPV6; break; #endif -#ifdef IPX - case ARCTYPE_IPX: - m_adj(m, ARC_HDRNEWLEN); - isr = NETISR_IPX; - break; -#endif default: m_freem(m); return; @@ -640,11 +627,7 @@ arc_ifattach(struct ifnet *ifp, u_int8_t lla) ifp->if_resolvemulti = arc_resolvemulti; if (ifp->if_baudrate == 0) ifp->if_baudrate = 2500000; -#if __FreeBSD_version < 500000 - ifa = ifnet_addrs[ifp->if_index - 1]; -#else ifa = ifp->if_addr; -#endif KASSERT(ifa != NULL, ("%s: no lladdr!\n", __func__)); sdl = (struct sockaddr_dl *)ifa->ifa_addr; sdl->sdl_type = IFT_ARCNET; @@ -691,26 +674,6 @@ arc_ioctl(struct ifnet *ifp, u_long command, caddr_t data) arp_ifinit(ifp, ifa); break; #endif -#ifdef IPX - /* - * XXX This code is probably wrong - */ - case AF_IPX: - { - struct ipx_addr *ina = &(IA_SIPX(ifa)->sipx_addr); - - if (ipx_nullhost(*ina)) - ina->x_host.c_host[5] = ARC_LLADDR(ifp); - else - arc_storelladdr(ifp, ina->x_host.c_host[5]); - - /* - * Set new address - */ - ifp->if_init(ifp->if_softc); - break; - } -#endif default: ifp->if_init(ifp->if_softc); break; @@ -781,21 +744,14 @@ arc_resolvemulti(struct ifnet *ifp, struct sockaddr **llsa, sdl = (struct sockaddr_dl *)sa; if (*LLADDR(sdl) != arcbroadcastaddr) return EADDRNOTAVAIL; - *llsa = 0; + *llsa = NULL; return 0; #ifdef INET case AF_INET: sin = (struct sockaddr_in *)sa; if (!IN_MULTICAST(ntohl(sin->sin_addr.s_addr))) return EADDRNOTAVAIL; - sdl = malloc(sizeof *sdl, M_IFMADDR, - M_NOWAIT | M_ZERO); - if (sdl == NULL) - return ENOMEM; - sdl->sdl_len = sizeof *sdl; - sdl->sdl_family = AF_LINK; - sdl->sdl_index = ifp->if_index; - sdl->sdl_type = IFT_ARCNET; + sdl = link_init_sdl(ifp, *llsa, IFT_ETHER); sdl->sdl_alen = ARC_ADDR_LEN; *LLADDR(sdl) = 0; *llsa = (struct sockaddr *)sdl; @@ -811,19 +767,12 @@ arc_resolvemulti(struct ifnet *ifp, struct sockaddr **llsa, * (This is used for multicast routers.) */ ifp->if_flags |= IFF_ALLMULTI; - *llsa = 0; + *llsa = NULL; return 0; } if (!IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr)) return EADDRNOTAVAIL; - sdl = malloc(sizeof *sdl, M_IFMADDR, - M_NOWAIT | M_ZERO); - if (sdl == NULL) - return ENOMEM; - sdl->sdl_len = sizeof *sdl; - sdl->sdl_family = AF_LINK; - sdl->sdl_index = ifp->if_index; - sdl->sdl_type = IFT_ARCNET; + sdl = link_init_sdl(ifp, *llsa, IFT_ETHER); sdl->sdl_alen = ARC_ADDR_LEN; *LLADDR(sdl) = 0; *llsa = (struct sockaddr *)sdl; |