X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/9bccf70c0258c7cac2dcb80011b2a964d884c552..8ad349bb6ed4a0be06e34c92be0d98b92e078db4:/bsd/net/if_faith.c diff --git a/bsd/net/if_faith.c b/bsd/net/if_faith.c index 9c9d4ebe7..997317f02 100644 --- a/bsd/net/if_faith.c +++ b/bsd/net/if_faith.c @@ -1,23 +1,31 @@ /* - * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * The contents of this file constitute Original Code as defined in and - * are subject to the Apple Public Source License Version 1.1 (the - * "License"). You may not use this file except in compliance with the - * License. Please obtain a copy of the License at - * http://www.apple.com/publicsource and read it before using this file. + * Copyright (c) 2006 Apple Computer, Inc. All Rights Reserved. * - * This Original Code and all software distributed under the License are - * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the - * License for the specific language governing rights and limitations - * under the License. + * @APPLE_LICENSE_OSREFERENCE_HEADER_START@ * - * @APPLE_LICENSE_HEADER_END@ + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the + * License may not be used to create, or enable the creation or + * redistribution of, unlawful or unlicensed copies of an Apple operating + * system, or to circumvent, violate, or enable the circumvention or + * violation of, any terms of an Apple operating system software license + * agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_OSREFERENCE_HEADER_END@ */ /* $KAME: if_faith.c,v 1.21 2001/02/20 07:59:26 itojun Exp $ */ @@ -80,7 +88,6 @@ #include #include -#include #include #include #include @@ -106,12 +113,12 @@ #include -static int faithioctl __P((struct ifnet *, u_long, void*)); -int faith_pre_output __P((struct ifnet *, register struct mbuf **, struct sockaddr *, - caddr_t, char *, char *, u_long)); -static void faithrtrequest __P((int, struct rtentry *, struct sockaddr *)); +static int faithioctl(struct ifnet *, u_long, void*); +int faith_pre_output(struct ifnet *, register struct mbuf **, + const struct sockaddr *, caddr_t, char *, char *, u_long); +static void faithrtrequest(int, struct rtentry *, struct sockaddr *); -void faithattach __P((void)); +void faithattach(void); #ifndef __APPLE__ PSEUDO_SET(faithattach, if_faith); #endif @@ -175,29 +182,10 @@ int faith_shutdown() return 0; } -void faith_reg_if_mods() -{ - struct dlil_ifmod_reg_str faith_ifmod; - - bzero(&faith_ifmod, sizeof(faith_ifmod)); - faith_ifmod.add_if = faith_add_if; - faith_ifmod.del_if = faith_del_if; - faith_ifmod.add_proto = faith_add_proto; - faith_ifmod.del_proto = faith_del_proto; - faith_ifmod.ifmod_ioctl = 0; - faith_ifmod.shutdown = faith_shutdown; - - - if (dlil_reg_if_modules(APPLE_IF_FAM_FAITH, &faith_ifmod)) - panic("Couldn't register faith modules\n"); - -} - -u_long faith_attach_inet(struct ifnet *ifp) +int faith_attach_inet(struct ifnet *ifp, u_long *dl_tag) { struct dlil_proto_reg_str reg; struct dlil_demux_desc desc; - u_long dl_tag=0; short native=0; int stat; int i; @@ -209,36 +197,61 @@ u_long faith_attach_inet(struct ifnet *ifp) kprintf("faith_array for %s%d found dl_tag=%d\n", ifp->if_name, ifp->if_unit, faith_array[i]->dl_tag); #endif - return faith_array[i]->dl_tag; + *dl_tag = faith_array[i]->dl_tag; + return 0; } } + bzero(®, sizeof(reg)); + bzero(&desc, sizeof(desc)); TAILQ_INIT(®.demux_desc_head); desc.type = DLIL_DESC_RAW; - desc.variants.bitmask.proto_id_length = 0; - desc.variants.bitmask.proto_id = 0; - desc.variants.bitmask.proto_id_mask = 0; desc.native_type = (char *) &native; TAILQ_INSERT_TAIL(®.demux_desc_head, &desc, next); reg.interface_family = ifp->if_family; reg.unit_number = ifp->if_unit; - reg.input = 0; reg.pre_output = faith_pre_output; - reg.event = 0; - reg.offer = 0; - reg.ioctl = 0; - reg.default_proto = 0; reg.protocol_family = PF_INET; - stat = dlil_attach_protocol(®, &dl_tag); + stat = dlil_attach_protocol(®, dl_tag); if (stat) { panic("faith_attach_inet can't attach interface\n"); } - return dl_tag; + return stat; } +void faith_reg_if_mods() +{ + struct dlil_ifmod_reg_str faith_ifmod; + struct dlil_protomod_reg_str faith_protoreg; + int error; + + bzero(&faith_ifmod, sizeof(faith_ifmod)); + faith_ifmod.add_if = faith_add_if; + faith_ifmod.del_if = faith_del_if; + faith_ifmod.add_proto = faith_add_proto; + faith_ifmod.del_proto = faith_del_proto; + faith_ifmod.ifmod_ioctl = 0; + faith_ifmod.shutdown = faith_shutdown; + + + if (dlil_reg_if_modules(APPLE_IF_FAM_FAITH, &faith_ifmod)) + panic("Couldn't register faith modules\n"); + + /* Register protocol registration functions */ + + bzero(&faith_protoreg, sizeof(faith_protoreg)); + faith_protoreg.attach_proto = faith_attach_inet; + faith_protoreg.detach_proto = 0; + + if ( error = dlil_reg_proto_module(PF_INET, APPLE_IF_FAM_FAITH, &faith_protoreg) != 0) + kprintf("dlil_reg_proto_module failed for AF_INET error=%d\n", error); + + +} + void faithattach(void) { @@ -276,14 +289,12 @@ int faith_pre_output(ifp, m0, dst, route_entry, frame_type, dst_addr, dl_tag) struct ifnet *ifp; register struct mbuf **m0; - struct sockaddr *dst; + const struct sockaddr *dst; caddr_t route_entry; char *frame_type; char *dst_addr; u_long dl_tag; { - int s, isr; - register struct ifqueue *ifq = 0; register struct mbuf *m = *m0; struct rtentry *rt = (struct rtentry*)route_entry; @@ -327,37 +338,10 @@ faith_pre_output(ifp, m0, dst, route_entry, frame_type, dst_addr, dl_tag) } ifp->if_opackets++; ifp->if_obytes += m->m_pkthdr.len; - switch (dst->sa_family) { -#if INET - case AF_INET: - ifq = &ipintrq; - isr = NETISR_IP; - break; -#endif -#if INET6 - case AF_INET6: - ifq = &ip6intrq; - isr = NETISR_IPV6; - break; -#endif - default: - return EAFNOSUPPORT; - } - - /* XXX do we need more sanity checks? */ - m->m_pkthdr.rcvif = ifp; - s = splimp(); - if (IF_QFULL(ifq)) { - IF_DROP(ifq); - splx(s); - return (ENOBUFS); - } - IF_ENQUEUE(ifq, m); - schednetisr(isr); + proto_inject(dst->sa_family, m); ifp->if_ipackets++; ifp->if_ibytes += m->m_pkthdr.len; - splx(s); return (EJUSTRETURN); } @@ -397,7 +381,7 @@ faithioctl(ifp, cmd, data) switch (cmd) { case SIOCSIFADDR: - ifp->if_flags |= IFF_UP | IFF_RUNNING; + ifnet_set_flags(ifp, IFF_UP | IFF_RUNNING, IFF_UP | IFF_RUNNING); ifa = (struct ifaddr *)data; ifa->ifa_rtrequest = faithrtrequest; /*