📄 tinyudp.c
字号:
/*-----------------------------------------------------------------------------*/
/* */
/* Copyright (C) 2002-2003 by Texas Instruments, Inc. All rights reserved. */
/* Copyright (C) 2002-2003 Telogy Networks, Inc. */
/* */
/* NOTE: THIS VERSION OF CODE IS MAINTAINED BY TELOGY NETWORKS AND NOT TI! */
/* */
/* IMPORTANT - READ CAREFULLY BEFORE PROCEEDING TO USE SOFTWARE. */
/* */
/* This document is displayed for you to read prior to using the software */
/* and documentation. By using the software and documentation, or opening */
/* the sealed packet containing the software, or proceeding to download the */
/* software from a Bulletin Board System(BBS) or a WEB Server, you agree to */
/* abide by the following Texas Instruments License Agreement. If you choose */
/* not to agree with these provisions, promptly discontinue use of the */
/* software and documentation and return the material to the place you */
/* obtained it. */
/* */
/* *** NOTE *** */
/* */
/* The licensed materials contain MIPS Technologies, Inc. confidential */
/* information which is protected by the appropriate MIPS Technologies, Inc. */
/* license agreement. It is your responsibility to comply with these */
/* licenses. */
/* */
/* Texas Instruments License Agreement */
/* */
/* 1. License - Texas Instruments (hereinafter "TI"), grants you a license */
/* to use the software program and documentation in this package ("Licensed */
/* Materials") for Texas Instruments broadband products. */
/* */
/* 2. Restrictions - You may not reverse-assemble or reverse-compile the */
/* Licensed Materials provided in object code or executable format. You may */
/* not sublicense, transfer, assign, rent, or lease the Licensed Materials */
/* or this Agreement without written permission from TI. */
/* */
/* 3. Copyright - The Licensed Materials are copyrighted. Accordingly, you */
/* may either make one copy of the Licensed Materials for backup and/or */
/* archival purposes or copy the Licensed Materials to another medium and */
/* keep the original Licensed Materials for backup and/or archival purposes. */
/* */
/* 4. Runtime and Applications Software - You may create modified or */
/* derivative programs of software identified as Runtime Libraries or */
/* Applications Software, which, in source code form, remain subject to this */
/* Agreement, but object code versions of such derivative programs are not */
/* subject to this Agreement. */
/* */
/* 5. Warranty - TI warrants the media to be free from defects in material */
/* and workmanship and that the software will substantially conform to the */
/* related documentation for a period of ninety (90) days after the date of */
/* your purchase. TI does not warrant that the Licensed Materials will be */
/* free from error or will meet your specific requirements. */
/* */
/* 6. Remedies - If you find defects in the media or that the software does */
/* not conform to the enclosed documentation, you may return the Licensed */
/* Materials along with the purchase receipt, postage prepaid, to the */
/* following address within the warranty period and receive a refund. */
/* */
/* TEXAS INSTRUMENTS */
/* Application Specific Products, MS 8650 */
/* c/o ADAM2 Application Manager */
/* 12500 TI Boulevard */
/* Dallas, TX 75243 - U.S.A. */
/* */
/* 7. Limitations - TI makes no warranty or condition, either expressed or */
/* implied, including, but not limited to, any implied warranties of */
/* merchantability and fitness for a particular purpose, regarding the */
/* licensed materials. */
/* */
/* Neither TI nor any applicable licensor will be liable for any indirect, */
/* incidental or consequential damages, including but not limited to loss of */
/* profits. */
/* */
/* 8. Term - The license is effective until terminated. You may terminate */
/* it at any other time by destroying the program together with all copies, */
/* modifications and merged portions in any form. It also will terminate if */
/* you fail to comply with any term or condition of this Agreement. */
/* */
/* 9. Export Control - The re-export of United States origin software and */
/* documentation is subject to the U.S. Export Administration Regulations or */
/* your equivalent local regulations. Compliance with such regulations is */
/* your responsibility. */
/* */
/* *** IMPORTANT NOTICE *** */
/* */
/* Texas Instruments (TI) reserves the right to make changes to or to */
/* discontinue any semiconductor product or service identified in this */
/* publication without notice. TI advises its customers to obtain the latest */
/* version of the relevant information to verify, before placing orders, */
/* that the information being relied upon is current. */
/* */
/* TI warrants performance of its semiconductor products and related */
/* software to current specifications in accordance with TI's standard */
/* warranty. Testing and other quality control techniques are utilized to */
/* the extent TI deems necessary to support this warranty. Unless mandated */
/* by government requirements, specific testing of all parameters of each */
/* device is not necessarily performed. */
/* */
/* Please be aware that Texas Instruments products are not intended for use */
/* in life-support appliances, devices, or systems. Use of a TI product in */
/* such applications without the written approval of the appropriate TI */
/* officer is prohibited. Certain applications using semiconductor devices */
/* may involve potential risks of injury, property damage, or loss of life. */
/* In order to minimize these risks, adequate design and operating */
/* safeguards should be provided by the customer to minimize inherent or */
/* procedural hazards. Inclusion of TI products in such applications is */
/* understood to be fully at the risk of the customer using TI devices or */
/* systems. */
/* */
/* TI assumes no liability for TI applications assistance, customer product */
/* design, software performance, or infringement of patents or services */
/* described herein. Nor does TI warrant or represent that license, either */
/* expressed or implied, is granted under any patent right, copyright, mask */
/* work right, or other intellectual property right of TI covering or */
/* relating to any combination, machine, or process in which such */
/* semiconductor products or services might be or are used. */
/* */
/* All company and/or product names are trademarks and/or registered */
/* trademarks of their respective manaufacturers. */
/* */
/*-----------------------------------------------------------------------------*/
#include "_stdio.h"
#include "tinyip.h"
/* largest chunk of data which we will pass through the network. this is
* well below the Internet's minimum MTU value so we can be assured that
* even after we tack on our own header information the complete packet
* will be passed along without being fragmented. Our packet buffer sizes
* are tied to this value.
*/
#define MTU 1024
/* resolved IP address in network byte order */
typedef unsigned long ipaddr;
/* structure for internal packet buffers - adds an in-use flag */
typedef struct _PacketBuffer {
int validData; /* does this buffer contain data? */
ipaddr src; /* source node */
unsigned length; /* length of packet data */
unsigned char data[MTU]; /* application's packet data */
} PacketBuffer;
/* packet sequence number used in the current implementation to reorder
* out-of-sequence packets we increment this value with each packet
* that we send
*/
static unsigned gl_srcport; /* currently open src port */
static unsigned gl_dstport; /* currently open dst port */
udp_Socket listen; /* socket used for listening */
udp_Socket talk; /* socket used for talking */
static PacketBuffer rxpacket; /* incoming packet buffers */
udp_Socket *udp_allsocs;
/* IP identification numbers */
static word udp_id;
/* Handler for incoming packets. */
void udp_Handler(in_Header *ip)
{
udp_Header *up;
tcp_PseudoHeader ph;
word len;
byte *dp;
udp_Socket *s;
eth_HwAddress ethAddr;
len = in_GetHdrlenBytes(ip);
up = (udp_Header *)((byte *)ip + len); /* udp segment pointer */
len = wfix(ip->length) - len;
/* demux to active sockets */
for (s = udp_allsocs; s; s = s->next)
{
if ( (s->hisport != 0) &&
(wfix(up->dstPort) == s->myport) &&
(wfix(up->srcPort) == s->hisport) &&
(lfix(ip->source) == s->hisaddr) )
break;
if ( ((s->hisaddr == 0) || (s->hisaddr == INADDR_BROADCAST)) &&
(wfix(up->dstPort) == s->myport) )
break;
}
if (s == NULL) {
return;
}
/* these parameters are used for things other than just checksums */
ph.src = ip->source;
ph.dst = ip->destination;
ph.mbz = 0;
ph.protocol = UDP_PROTO;
ph.length = wfix(len);
if (up->checksum)
{
ph.checksum = wfix(checksum(up, len));
if (checksum(&ph, sizeof(ph)) != 0xffff) {
sys_printf("Error: Invalid checksum.\n");
return;
}
}
MoveW(((byte *)ip - 8), ethAddr, sizeof(eth_HwAddress));
sar_addEntry(lfix(ip->source), ethAddr);
/* process user data */
if ((len -= UDP_LENGTH) > 0)
{
dp = (byte *)(up);
#ifdef TFTP_SERVER_SUPPORT
//wwzh add for tftp server at 2004-03-18
gl_dstport = htons(up->srcPort);
#endif
if (s->dataHandler)
s->dataHandler(s, &dp[UDP_LENGTH], len , &ph, up);
else
{
if (len > s->maxrdatalen )
len = s->maxrdatalen;
Move(&dp[UDP_LENGTH], s->rdata, len);
s->rdatalen = len;
}
}
else
{
sys_printf("Error: Invalid length.\n");
}
}
/*
* dataHandler
*
* Description: Incoming packet processor. Called by tcp_tick() for
* each incoming UDP packet. Copies the data into an available buffer
* and extracts the source node information from the packet's UDP
* pseudoheader.
*
* Parameters:
* s (in) - Pointer to the UDP socket.
* dp (in) - Pointer to the incoming data buffer.
* len (in) - Length of the data.
* ph (in) - Packet pseudoheader.
* up (in) - Upcall routine pointer - unused.
*/
void udp_dataHandler (udp_Socket *s, byte *dp, int len, void *ph, void *up)
{
s = s;
up = up;
/* look for a free data buffer */
if (rxpacket.validData != 0)
{
return;
}
if (len > 0)
{
/* perform sanity check on the packet length */
if (len < MTU)
{
/* copy data to buffer, flag buffer as in use */
sys_memcpy(rxpacket.data, dp, len);
rxpacket.src = lfix(((tcp_PseudoHeader *)ph)->src);
rxpacket.length = len;
rxpacket.validData = 1;
if (s->appHandler)
s->appHandler();
}
}
}
int udplib_open(word srcport, word dstport, procref application)
{
if (gl_srcport)
udplib_close();
gl_srcport = srcport;
gl_dstport = dstport;
if (!udp_open(&listen, gl_srcport, -1, gl_dstport, udp_dataHandler, application))
return 0;
return 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -