免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1752 | 回复: 0
打印 上一主题 下一主题

[PATCH] Modify UDP interface [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-30 10:57 |只看该作者 |倒序浏览
Modify UDP interface

signed-off-by: Changxian Tan      <ChangXian.Tan@gmail.com>

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

From 33b29926157180d2a8aa3aaeca6bc61485d12da2 Mon Sep 17 00:00:00 2001
From: Changxian Tan <Changxian.Tan@gmail.com>
Date: Wed, 30 Sep 2009 10:45:32 +0800
Subject: [PATCH] modify udp interface

---
device/net/socket.c |   34 ++++++++++++----------------------
device/net/tftp.c   |   17 +++++++++--------
include/net/net.h   |    8 ++++----
3 files changed, 25 insertions(+), 34 deletions(-)

diff --git a/device/net/socket.c b/device/net/socket.c
index 1bcaeed..135bb24 100644
--- a/device/net/socket.c
+++ b/device/net/socket.c
@@ -87,25 +87,10 @@ struct sockaddr *gethostaddr(const char *sip)
        return sockAddr;
}

-int connect(int fd, const struct sockaddr *addr, socklen_t len)
-{
-        struct Socket *pSock;
-
-        pSock = GetSock(fd);
-
-        if (NULL == pSock)
-        {
-                // printf
-                return -EINVAL;
-        }
-
-        memcpy(&pSock->addr, addr, len);
-
-        return 0;
-}

//
-long send(int fd, const void *buf, ULONG n)
+long sendto(int fd, const void *buf, size_t len, int flags,
+                                const struct sockaddr *destAddr, socklen_t addrlen)
{
        struct Socket *pSock;
        struct SocketBuffer *pSockBuff;
@@ -118,19 +103,22 @@ long send(int fd, const void *buf, ULONG n)
                return -EINVAL;
        }

-        pSockBuff = GkSockBuffAlloc(ETH_HDR_LEN + IP_HDR_LEN + UDP_HDR_LEN, n);
+        memcpy(&pSock->addr, destAddr, addrlen);
+
+        pSockBuff = GkSockBuffAlloc(ETH_HDR_LEN + IP_HDR_LEN + UDP_HDR_LEN, len);

        pSockBuff->pSock = pSock;

-        memcpy(pSockBuff->pSkbData, buf, n);
+        memcpy(pSockBuff->pSkbData, buf, len);

        GUdpSendPacket(pSockBuff);

-        return n;
+        return len;
}

//
-long recv(int fd, void *buf, ULONG n)
+long recvfrom(int fd, void *buf, size_t len, int flags,
+                                struct sockaddr *srcAddr, socklen_t *addrlen)
{
        struct Socket *pSock;
        struct SocketBuffer *pSockBuff;
@@ -146,9 +134,11 @@ long recv(int fd, void *buf, ULONG n)
        pSockBuff = GUdpRecvPacket(pSock);

        // fixme !
-        nPktLen   = pSockBuff->wSkbSize <= n ? pSockBuff->wSkbSize : n;
+        nPktLen   = pSockBuff->wSkbSize <= len ? pSockBuff->wSkbSize : len;

        memcpy(buf, pSockBuff->pSkbData, nPktLen);
+        *addrlen = sizeof(pSockBuff->pSock->addr);
+        memcpy(srcAddr, &(pSockBuff->pSock->addr), *addrlen);

        GkSockBuffFree(pSockBuff);

diff --git a/device/net/tftp.c b/device/net/tftp.c
index 1f30c67..3509d70 100644
--- a/device/net/tftp.c
+++ b/device/net/tftp.c
@@ -41,14 +41,14 @@ static int TftpMakeRRQ(BYTE *pbBuff, const char *pchFileName)
}


-static void TftpSendAck(const int fd, const UINT16 nBlkNum)
+static void TftpSendAck(const int fd, const UINT16 nBlkNum, struct sockaddr *skaddr)
{
        struct TftpPacket tftpPkt;

        tftpPkt.wOpCode = TFTP_ACK;
        tftpPkt.wBlkNum = CPU_TO_BE16(nBlkNum);

-        send(fd, &tftpPkt, TFTP_HDR_LEN);
+        sendto(fd, &tftpPkt, TFTP_HDR_LEN, 0, skaddr, sizeof(struct sockaddr));
}


@@ -109,11 +109,9 @@ int GuNetTftpGetFile(struct TftpOpt *opt)
        skaddr->wSrcPort = CPU_TO_BE16(1234); // fixme: NetPortAlloc
        skaddr->wDesPort = CPU_TO_BE16(STD_PORT_TFTP);

-        ret = connect(sockfd, skaddr, sizeof(struct sockaddr));
-
        nPktLen = TftpMakeRRQ((BYTE *)pTftpPkt, opt->szFileName);

-        send(sockfd, pTftpPkt, nPktLen);
+        sendto(sockfd, pTftpPkt, nPktLen, 0, skaddr, sizeof(struct sockaddr));

        pbBufPtr   = opt->pLoadAddr;
        nLoadLen   = 0;
@@ -121,7 +119,10 @@ int GuNetTftpGetFile(struct TftpOpt *opt)

        do
        {
-                nPktLen = recv(sockfd, pTftpPkt, TFTP_BUF_LEN);
+                struct sockaddr srcAddr;
+                socklen_t srcAddrlen;
+
+                nPktLen = recvfrom(sockfd, pTftpPkt, TFTP_BUF_LEN, 0, &srcAddr, &srcAddrlen);

                nPktLen -= TFTP_HDR_LEN;

@@ -133,7 +134,7 @@ int GuNetTftpGetFile(struct TftpOpt *opt)
                case TFTP_DAT:
                        if (BE16_TO_CPU(pTftpPkt->wBlkNum) == wCurBlkNum)
                        {
-                                TftpSendAck(sockfd, wCurBlkNum);
+                                TftpSendAck(sockfd, wCurBlkNum, skaddr);
                                wCurBlkNum++;

                                nLoadLen += nPktLen;
@@ -173,7 +174,7 @@ int GuNetTftpGetFile(struct TftpOpt *opt)
                                printf("\t%s(): LOST Packet = 0x%x (0x%x).\r",
                                        __FUNC__, wCurBlkNum, BE16_TO_CPU(pTftpPkt->wBlkNum));
#endif
-                                TftpSendAck(sockfd, wCurBlkNum - 1);
+                                TftpSendAck(sockfd, wCurBlkNum - 1, skaddr);
                        }

                        break;
diff --git a/include/net/net.h b/include/net/net.h
index 1ec12c1..ed0e4f4 100644
--- a/include/net/net.h
+++ b/include/net/net.h
@@ -204,11 +204,11 @@ int socket(int domain, int type, int protocol);

struct sockaddr *getaddr(UINT32 ip);

-int connect(int fd, const struct sockaddr *addr, socklen_t len);
+long sendto(int fd, const void *buf, size_t len, int flags,
+                                const struct sockaddr *destAddr, socklen_t addrlen);

-long send(int fd, const void *buf, ULONG n);
-
-long recv(int fd, void *buf, ULONG n);
+long recvfrom(int fd, void *buf, size_t len, int flags,
+                                struct sockaddr *srcAddr, socklen_t *addrlen);

int close(int fd);

--
1.6.0.4

0001-modify-UDP-interface.patch.tar.gz

1.67 KB, 下载次数: 8

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP