示例#1
0
void do_write(OTUDP *x, long length, void *bytes) {
	/* This should never be called at interrupt level */
	OSStatus err;
	InetAddress dest_addr;
	TUnitData udata;

			
	OTInitInetAddress(&dest_addr, x->o_inetPort, x->o_inetHost);
	udata.addr.len = sizeof(dest_addr);
	udata.addr.buf = (unsigned char *) &dest_addr;
	udata.opt.len = 0;
	udata.opt.buf = nil;
	
	udata.udata.len = length;
	udata.udata.buf = bytes;
	
	err = OTSndUData(x->o_udp_ep, &udata);
	
	if (err == kOTBadSyncErr) {
		error("¥ OTUDP: failed to send data at interrupt level.  Try turning off overdrive.");
	} else if (err == kEHOSTUNREACHErr) {
		error("OTUDP: Host address is unreachable; couldn't send packet");
		post("Make sure you're really on a network.");
	} else if (err != noErr) {
		error("¥ OTUDP: OTSndUData returned error code %ld.", err);
	}
}
示例#2
0
int TCPLow_PutPacket(TCPINSTANCE* tcp, TCPPEER* pPeer,void* bufptr,ULONG len)
{
	TUnitData	udata;
	OSStatus	err;
	OTResult	theResult;
	InetAddress	destAddr;
	unsigned char *pt;
	
	OTInitInetAddress(&destAddr,pPeer->port,pPeer->addr);
	
	udata.addr.maxlen = sizeof(InetAddress);
	udata.addr.len = sizeof(InetAddress);
	udata.addr.buf = (unsigned char *) &destAddr;
	
	udata.opt.maxlen = 0;
	udata.opt.len = 0;
	udata.opt.buf = nil;
	
	udata.udata.maxlen = len;
	udata.udata.len = len;
	udata.udata.buf = (unsigned char *)bufptr;
	
	do {
		err = OTSndUData(tcp->udpEndpoint, &udata);
		if (err == kOTLookErr) {
			theResult = OTLook(tcp->udpEndpoint);
			if (theResult == T_UDERR) {
				HandleErrorUDERR();
				err = 666;
			}
		}
	} while (err == 666);

	return err;
}
示例#3
0
int tcpabi_udp_send( unsigned handle, void *buf, unsigned len, unsigned ttltos, unsigned id, unsigned char flags ) {
    TUnitData	udata;
    OSStatus	err;
    OTResult	theResult;

    udata.addr.maxlen = sizeof(gDests[handle].dest_addr);
    udata.addr.len = sizeof(gDests[handle].dest_addr);
    udata.addr.buf = (unsigned char *) &gDests[handle].dest_addr;

    udata.opt.maxlen = 0;
    udata.opt.len = 0;
    udata.opt.buf = nil;

    udata.udata.maxlen = len;
    udata.udata.len = len;
    udata.udata.buf = (unsigned char *)buf;

    do {
        err = OTSndUData(gUDPEndpoint, &udata);
        if (err == kOTLookErr) {
            theResult = OTLook(gUDPEndpoint);
            if (theResult == T_UDERR) {
                HandleErrorUDERR();
                err = 666;
            }
        }
    } while (err == 666);

    return err;
}
示例#4
0
int tcpabi_udp_broadcast(void *buf, unsigned len) {
    OSStatus			err = noErr;
    TUnitData			udata;
    OTResult			theResult;
    short				i;
    InetAddress			currentAddress;

    //	this method sends the specified packet to our list of
    //	IP addreses. We return noErr if they were all sent
    //	without any trouble (we should ignore errors which
    //	indicate that the other end is not there since we
    //	really don't care if all of these packets are delivered)

    //	we don't broadcast to the first address because it's our own

    for (i = 1; i < gAddressList.addressCount; i++) {

        OTInitInetAddress(&currentAddress, SOCKET_MW2, gAddressList.addressList[i]);

        udata.addr.maxlen = sizeof(InetAddress);
        udata.addr.len = sizeof(InetAddress);
        udata.addr.buf = (unsigned char *) &currentAddress;

        udata.opt.maxlen = 0;
        udata.opt.len = 0;
        udata.opt.buf = nil;

        udata.udata.maxlen = len;
        udata.udata.len = len;
        udata.udata.buf = (unsigned char *)buf;

        do {
            err = OTSndUData(gUDPEndpoint, &udata);
            if (err == kOTLookErr) {
                theResult = OTLook(gUDPEndpoint);
                if (theResult == T_UDERR) {
                    HandleErrorUDERR();
                    err = 666;
                }
            }
        } while (err == 666);

    }

    return err;
}
示例#5
0
int atalk_ddp_broadcast(void *buf, unsigned len) {
	OSStatus			err = noErr;
	TUnitData			udata;
	OTResult			theResult;
	short				i;
	extern short		gLookupCount;
	extern DDPAddress	gLookupResults[];
	
	//	this method sends the specified packet to our list of
	//	DDP addreses. We return noErr if they were all sent
	//	without any trouble (we should ignore errors which
	//	indicate that the other end is not there since we
	//	really don't care if all of these packets are delivered)
	
	for (i = 0; i < gLookupCount; i++) {

		udata.addr.len = sizeof(DDPAddress);
		udata.addr.buf = (unsigned char *) &gLookupResults[i];
		
		udata.opt.len = 0;
		udata.opt.buf = nil;
		
		udata.udata.len = len;
		udata.udata.buf = (unsigned char *)buf;
		
		do {
			err = OTSndUData(gDDPEndpoint, &udata);
			if (err == kOTLookErr) {
				theResult = OTLook(gDDPEndpoint);
				if (theResult == T_UDERR) {
					HandleErrorUDERR();
					err = 666;
				}
			}
		} while (err == 666);
		
	}
	
	return err;
}
示例#6
0
NMErr
OTIPEnumerator::SendQuery(void)
{
	DEBUG_ENTRY_EXIT("IPEnumerator::SendQuery");

TUnitData	udata;
OTResult	result;
InetAddress	broadcastAddr;
	
	//	Set up the unit data structure
	//	fBroadcastAddr doesn't seem to get set right, so construct it
	OTInitInetAddress(&broadcastAddr, mConfig.address.fPort, mInterfaceInfo.fAddress | ~mInterfaceInfo.fNetmask);

	udata.addr.buf = (NMUInt8 *) &broadcastAddr;
	udata.addr.len = sizeof (InetAddress);
	udata.opt.len = 0;
	udata.udata.len = kQuerySize;
	udata.udata.buf = mPacketData;
	
	do
	{
		result = OTSndUData(mEP, &udata);

		if (result < 0)
		{
			DEBUG_PRINT("OTSndUData returned an error: %ld", result);

			if (result == kOTLookErr)
				HandleLookErr();
		}
	} while (result != kNMNoError && result == kOTLookErr);
	
	//	Set the timestamp so that we'll know when to ping again
	OTGetTimeStamp(&mLastQueryTimeStamp);
	
	return result;
}
示例#7
0
int tcpabi_udp_send_to_address(InetAddress* theAddress, void *buf, unsigned len) {
    TUnitData	udata;
    OSStatus	err;
    OTResult	theResult;

    //	send our list of addresses to the destination address

    udata.addr.maxlen = sizeof(InetAddress);
    udata.addr.len = sizeof(InetAddress);
    udata.addr.buf = (unsigned char *) theAddress;

    udata.opt.maxlen = 0;
    udata.opt.len = 0;
    udata.opt.buf = nil;

    udata.udata.maxlen = len;
    udata.udata.len = len;
    udata.udata.buf = (unsigned char *)buf;

    do {
        err = OTSndUData(gUDPEndpoint, &udata);
        if (err == kOTLookErr) {
            theResult = OTLook(gUDPEndpoint);
            if (theResult == T_UDERR) {
                HandleErrorUDERR();
                err = 666;
            }
        }
    } while (err == 666);

    //	add the destination address to our list of addresses

    AddAddressToList(theAddress->fHost);

    return err;
}
示例#8
0
/* Send a vector of packets to the the channels specified within the packet.
   If the channel specified in the packet is -1, the packet will be sent to
   the address in the 'src' member of the packet.
   Each packet will be updated with the status of the packet after it has 
   been sent, -1 if the packet send failed.
   This function returns the number of packets sent.
*/
int SDLNet_UDP_SendV(UDPsocket sock, UDPpacket **packets, int npackets)
{
	int numsent, i, j;
	struct UDP_channel *binding;
	int status;
#ifndef MACOS_OPENTRANSPORT
	int sock_len;
	struct sockaddr_in sock_addr;

	/* Set up the variables to send packets */
	sock_len = sizeof(sock_addr);
#endif

	numsent = 0;
	for ( i=0; i<npackets; ++i ) 
	{
		/* if channel is < 0, then use channel specified in sock */
		
		if ( packets[i]->channel < 0 ) 
		{
#ifdef MACOS_OPENTRANSPORT
		TUnitData OTpacket;
		InetAddress address;

			memset(&OTpacket, 0, sizeof(OTpacket));
			OTpacket.addr.buf = (Uint8 *)&address;
			OTpacket.addr.len = (sizeof address);
			OTpacket.udata.buf = packets[i]->data;
			OTpacket.udata.len = packets[i]->len;
			OTInitInetAddress(&address, packets[i]->address.port, packets[i]->address.host);
#ifdef DEBUG_NET
			printf("Packet send address: 0x%8.8x:%d, length = %d\n", packets[i]->address.host, packets[i]->address.port, packets[i]->len);
#endif
			
			status = OTSndUData(sock->channel, &OTpacket);
#ifdef DEBUG_NET
			printf("SDLNet_UDP_SendV   OTSndUData return value is ;%d\n", status );
#endif

			AsyncUDPPopEvent( sock );
			packets[i]->status = status;
			
			if (status == noErr)
			{
				++numsent;
			}
#else
			sock_addr.sin_addr.s_addr = packets[i]->address.host;
			sock_addr.sin_port = packets[i]->address.port;
			sock_addr.sin_family = AF_INET;
			status = sendto(sock->channel, 
					packets[i]->data, packets[i]->len, 0,
					(struct sockaddr *)&sock_addr,sock_len);
			if ( status >= 0 )
			{
				packets[i]->status = status;
				++numsent;
			}
#endif /* MACOS_OPENTRANSPORT */
		}
		else 
		{
			/* Send to each of the bound addresses on the channel */
#ifdef DEBUG_NET
			printf("SDLNet_UDP_SendV sending packet to channel = %d\n", packets[i]->channel );
#endif
			
			binding = &sock->binding[packets[i]->channel];
			
			for ( j=binding->numbound-1; j>=0; --j ) 
			{
#ifdef MACOS_OPENTRANSPORT
			TUnitData OTpacket;
			InetAddress address;

				OTInitInetAddress(&address, binding->address[j].port,binding->address[j].host);
#ifdef DEBUG_NET
				printf("Packet send address: 0x%8.8x:%d, length = %d\n", binding->address[j].host, binding->address[j].port, packets[i]->len);
#endif
				memset(&OTpacket, 0, sizeof(OTpacket));
				OTpacket.addr.buf = (Uint8 *)&address;
				OTpacket.addr.len = (sizeof address);
				OTpacket.udata.buf = packets[i]->data;
				OTpacket.udata.len = packets[i]->len;
			                              
				status = OTSndUData(sock->channel, &OTpacket);
#ifdef DEBUG_NET
				printf("SDLNet_UDP_SendV   OTSndUData returne value is;%d\n", status );
#endif
				AsyncUDPPopEvent(sock);
				packets[i]->status = status;
				
				if (status == noErr)
				{
					++numsent;
				}

#else
				sock_addr.sin_addr.s_addr = binding->address[j].host;
				sock_addr.sin_port = binding->address[j].port;
				sock_addr.sin_family = AF_INET;
				status = sendto(sock->channel, 
						packets[i]->data, packets[i]->len, 0,
						(struct sockaddr *)&sock_addr,sock_len);
				if ( status >= 0 )
				{
					packets[i]->status = status;
					++numsent;
				}
#endif /* MACOS_OPENTRANSPORT */
			}
		}
	}
	
	return(numsent);
}
示例#9
0
// Errors:
// EBADF -- bad socket id
// EFAULT -- bad buffer
static PRInt32 SendReceiveDgram(PRFileDesc *fd, void *buf, PRInt32 amount, 
                               PRIntn flags, PRNetAddr *addr, PRUint32 *addrlen, 
                               PRIntervalTime timeout, SndRcvOpCode opCode)
{
	OSStatus err;
	PRInt32 osfd = fd->secret->md.osfd;
	EndpointRef endpoint = (EndpointRef) osfd;
	PRThread *me = _PR_MD_CURRENT_THREAD();
	PRInt32 bytesLeft = amount;
	TUnitData dgram;

	PR_ASSERT(flags == 0);
	
	if (endpoint == NULL) {
		err = kEBADFErr;
		goto ErrorExit;
	}
		
	if (buf == NULL || addr == NULL) {
		err = kEFAULTErr;
		goto ErrorExit;
	}
		
	memset(&dgram, 0 , sizeof(dgram));
	dgram.addr.maxlen = *addrlen;
	dgram.addr.len = *addrlen;
	dgram.addr.buf = (UInt8*) addr;
	dgram.udata.maxlen = amount;
	dgram.udata.len = amount;
	dgram.udata.buf = (UInt8*) buf;	

	while (bytesLeft > 0) {
	
		PrepareThreadForAsyncIO(me, endpoint, osfd);    

		if (opCode == kDGRAM_SEND)
			err = OTSndUData(endpoint, &dgram);
		else if (opCode == kDGRAM_RECEIVE)
			err = OTRcvUData(endpoint, &dgram, NULL);
		else {
			err = kEINVALErr;
			goto ErrorExit;
		}

		if (err == kOTNoError) {
			buf = (void *) ( (UInt32) buf + (UInt32)dgram.udata.len );
			bytesLeft -= dgram.udata.len;
			dgram.udata.buf = (UInt8*) buf;	
    		me->io_pending = PR_FALSE;
		}
		else {
			PR_ASSERT(err == kOTNoDataErr || err == kOTOutStateErr);
			WaitOnThisThread(me, timeout);
			err = me->md.osErrCode;
			if (err != kOTNoError)
				goto ErrorExit;

			PR_ASSERT(me->md.cookie != NULL);
		}
	}

	if (opCode == kDGRAM_RECEIVE)
		*addrlen = dgram.addr.len;

	return amount;

ErrorExit:
	macsock_map_error(err);
    return -1;
}