1/* 2 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. 3 * 4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. The rights granted to you under the License 10 * may not be used to create, or enable the creation or redistribution of, 11 * unlawful or unlicensed copies of an Apple operating system, or to 12 * circumvent, violate, or enable the circumvention or violation of, any 13 * terms of an Apple operating system software license agreement. 14 * 15 * Please obtain a copy of the License at 16 * http://www.opensource.apple.com/apsl/ and read it before using this file. 17 * 18 * The Original Code and all software distributed under the License are 19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23 * Please see the License for the specific language governing rights and 24 * limitations under the License. 25 * 26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27 */ 28/* 29 * Copyright (c) 1988, 1989, 1997, 1998 Apple Computer, Inc. 30 * 31 * Modified for MP, 1996 by Tuyen Nguyen 32 * Modified, March 17, 1997 by Tuyen Nguyen for MacOSX. 33 */ 34 35/* ddp_proto.c: 2.0, 1.23; 10/18/93; Apple Computer, Inc. */ 36 37#include <sys/errno.h> 38#include <sys/types.h> 39#include <sys/param.h> 40#include <machine/spl.h> 41#include <sys/systm.h> 42#include <sys/kernel.h> 43#include <sys/proc.h> 44#include <sys/filedesc.h> 45#include <sys/fcntl.h> 46#include <sys/mbuf.h> 47#include <sys/ioctl.h> 48#include <sys/malloc.h> 49#include <sys/socket.h> 50#include <sys/socketvar.h> 51 52#include <net/if.h> 53 54#include <netat/sysglue.h> 55#include <netat/appletalk.h> 56#include <netat/at_pcb.h> 57#include <netat/at_var.h> 58#include <netat/ddp.h> 59#include <netat/zip.h> 60 61extern at_ifaddr_t *ifID_home; 62 63void ddp_putmsg(gref, mp) 64 gref_t *gref; 65 gbuf_t *mp; 66{ 67 register ioc_t *iocbp; 68 register int error; 69 at_ddp_t *ddp; 70 71 switch(gbuf_type(mp)) { 72 case MSG_DATA : 73 /* If this message is going out on a socket that's not bound, 74 * nail it. 75 */ 76 ddp = (at_ddp_t *)gbuf_rptr(mp); 77 if ((ddp->type == DDP_ATP) || (ddp->type == DDP_ADSP)) { 78 if ((gref == 0) || (gref->lport == 0)) { 79 int src_addr_included = 80 ((ddp->type==DDP_ATP) && ddp->src_node)? 1 : 0; 81 (void)ddp_output(&mp, ddp->src_socket, 82 src_addr_included); 83 return; 84 } 85 } 86 87 if ((gref == 0) || (gref->lport == 0)) { 88 gbuf_freel(mp); 89 if (gref) 90 atalk_notify(gref, ENOTCONN); 91 return; 92 } 93 if ((error = ddp_output(&mp, gref->lport, 0)) != 0) { 94 if (gref) 95 atalk_notify(gref, error); 96 } 97 return; 98 99 case MSG_IOCTL : 100 iocbp = (ioc_t *)gbuf_rptr(mp); 101 if (DDP_IOC_MYIOCTL(iocbp->ioc_cmd)) { 102 switch(iocbp->ioc_cmd) { 103 case DDP_IOC_GET_CFG : 104 /* Note that DDP_IOC_GET_CFG / AppleTalk ddp_config() 105 fills in the net and node of the ddp_addr_t param 106 with the net and node of the default interface, 107 not the net and node that has been bound, as 108 getsockname() and sockopt DDP_GETSOCKNAME do. 109 */ 110#ifdef APPLETALK_DEBUG 111 kprintf("ddp_putmsg: DDP_IOC_GET_CFG\n"); 112#endif 113 if (gbuf_cont(mp)) 114 gbuf_freem(gbuf_cont(mp)); 115 if ((gbuf_cont(mp) = 116 gbuf_alloc(sizeof(ddp_addr_t), 117 PRI_MED)) == NULL) { 118 ioc_ack(ENOBUFS, mp, gref); 119 break; 120 } 121 { 122 /* *** was ddp_get_cfg() *** */ 123 ddp_addr_t *cfgp = 124 (ddp_addr_t *)gbuf_rptr(gbuf_cont(mp)); 125 cfgp->inet.net = ifID_home->ifThisNode.s_net; 126 cfgp->inet.node = ifID_home->ifThisNode.s_node; 127#ifdef NOT_YET 128 cfgp->inet.net = gref->laddr.s_net; 129 cfgp->inet.node = gref->laddr.s_node; 130#endif 131 cfgp->inet.socket = gref->lport; 132 cfgp->ddptype = gref->ddptype; 133 } 134 gbuf_wset(gbuf_cont(mp), sizeof(ddp_addr_t)); 135 iocbp->ioc_count = sizeof(ddp_addr_t); 136 ioc_ack(0, mp, gref); 137 break; 138 default: 139 ioc_ack(EINVAL, mp, gref); 140 break; 141 } 142 } else { 143 /* Unknown ioctl */ 144 ioc_ack(EINVAL, mp, gref); 145 } 146 break; 147 default : 148#ifdef APPLETALK_DEBUG 149 kprintf("unexpected message type in ddp_putmsg: %d/n", 150 gbuf_type(mp)); 151#endif 152 gbuf_freem(mp); 153 break; 154 } 155 return; 156} /* ddp_putmsg */ 157 158gbuf_t *ddp_compress_msg(mp) 159register gbuf_t *mp; 160{ 161 register gbuf_t *tmp; 162 163 while (gbuf_len(mp) == 0) { 164 tmp = mp; 165 mp = gbuf_cont(mp); 166 gbuf_freeb(tmp); 167 168 if (mp == NULL) 169 break; 170 } 171 return (mp); 172} 173