Show
Ignore:
Timestamp:
06/03/10 22:43:33 (2 years ago)
Author:
mwhitworth
Message:

Add to network stack.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • Whitix/branches/netchannel/user/sdk/network/udp.c

    r2092 r2099  
    3636} 
    3737 
     38int UdpSocketBind(Socket* socket, struct SockAddr* address) 
     39{ 
     40        struct Ipv4EndPoint chanSrc, chanDest, *addr; 
     41 
     42        addr = (struct Ipv4EndPoint*)address; 
     43 
     44        chanSrc.address = 0; 
     45        chanSrc.port = addr->port; 
     46 
     47        chanDest.address = IPV4_BROADCAST; 
     48        chanDest.port = 0; 
     49 
     50        socket->channel = ChannelCreate(CHAN_MAKE_TYPE(CHAN_FAMILY_IP, 
     51                                CHAN_TYPE_UDP), &chanSrc, &chanDest, NULL); 
     52 
     53        if (!socket->channel) 
     54                return -1; 
     55 
     56        return 0; 
     57} 
     58 
    3859#define CHAN_TYPE_UDP   0x01 
    3960 
     
    7495} 
    7596 
     97#define UDP_IP_HDR_BYTES        (sizeof(struct IpHeader) + sizeof(struct UdpHeader)) 
     98 
    7699int UdpSocketSendTo(Socket* socket, const void* buffer, unsigned long length, int flags, struct SockAddr* dest) 
    77100{ 
    78         ChanSendBuffer* chanBuff; 
    79         int ret; 
     101        const char* p = (const char*)buffer; 
    80102        struct Ipv4EndPoint* destIp = (struct Ipv4EndPoint*)dest; 
    81103        struct Ipv4EndPoint* srcIp = (struct Ipv4EndPoint*)&socket->channel->src; 
    82         struct IpHeader* ipHeader; 
    83         struct UdpHeader* udpHeader; 
    84         char* data; 
    85         int totalLength; 
    86          
    87         totalLength = length + sizeof(struct UdpHeader) + sizeof(struct IpHeader); 
    88  
     104         
    89105        if (!dest) 
    90106                return -1; 
    91107 
    92         chanBuff = ChanSendBufferAlloc(socket->channel, &data); 
    93  
    94         if (!chanBuff) 
    95                 return -1; 
    96  
    97         ipHeader=(struct IpHeader*)data; 
    98         IpBuildHeader(ipHeader, destIp, length + sizeof(struct UdpHeader), PROTOCOL_RAW_UDP); 
    99  
    100         /* Add UDP header. */ 
    101         udpHeader = (struct UdpHeader*)(data + sizeof(struct IpHeader)); 
    102          
    103         udpHeader->sourcePort = NetToHostShort(srcIp->port); 
    104         udpHeader->destPort = NetToHostShort(destIp->port); 
    105         udpHeader->length = NetToHostShort(length + sizeof(struct UdpHeader)); 
    106          
    107         memcpy(data + sizeof(struct IpHeader) + sizeof(struct UdpHeader), buffer, length); 
    108          
    109         ret = ChanBufferSend(socket->channel, chanBuff, totalLength); 
    110          
    111         return ret; 
     108        while (length > 0) 
     109        { 
     110                ChanSendBuffer* chanBuff; 
     111                int pktLength = MIN(length, ChanMaxPacketSize(socket->channel) - UDP_IP_HDR_BYTES); 
     112                int ret; 
     113                char* data; 
     114                struct IpHeader* ipHeader; 
     115                struct UdpHeader* udpHeader; 
     116 
     117                chanBuff = ChanSendBufferAlloc(socket->channel, &data); 
     118 
     119                if (!chanBuff || !data) 
     120                        goto out; 
     121 
     122                ipHeader=(struct IpHeader*)data; 
     123                udpHeader = (struct UdpHeader*)(data + sizeof(struct IpHeader)); 
     124 
     125                IpBuildHeader(ipHeader, destIp, pktLength + sizeof(struct UdpHeader), PROTOCOL_RAW_UDP); 
     126                 
     127                udpHeader->sourcePort = NetToHostShort(srcIp->port); 
     128                udpHeader->destPort = NetToHostShort(destIp->port); 
     129                udpHeader->length = NetToHostShort(pktLength + sizeof(struct UdpHeader)); 
     130                 
     131                memcpy(data + UDP_IP_HDR_BYTES, p, pktLength); 
     132 
     133                ret = ChanBufferSend(socket->channel, chanBuff, pktLength + UDP_IP_HDR_BYTES) - UDP_IP_HDR_BYTES; 
     134                 
     135                if (ret < pktLength) 
     136                        goto out; 
     137 
     138                p += ret; 
     139                length -= ret; 
     140        } 
     141 
     142out: 
     143        return p - (const char*)buffer; 
    112144} 
    113145 
     
    136168        struct IpHeader* ipHeader; 
    137169        struct UdpHeader* udpHeader; 
     170        struct Ipv4EndPoint* address = (struct Ipv4EndPoint*)dest; 
    138171 
    139172again: 
    140         read = ChanBufferRecv(socket->channel, &chanBuff, &buf, 2000); 
     173        read = ChanBufferRecv(socket->channel, &chanBuff, &buf, -1); 
    141174 
    142175        if (read <= 0) 
    143         { 
    144                 printf("read = %d\n", read); 
    145                 return read; 
    146         } 
     176                return -1; 
    147177 
    148178        /* Verify checksum */ 
     
    152182                goto again; 
    153183 
    154         /* TODO: Current buffer. Partial recv */ 
    155  
    156184        dataByteCnt = read - sizeof(struct UdpHeader) - sizeof(struct IpHeader); 
    157185 
    158         /* FIXME: More checking. */ 
    159186        memcpy(buffer, buf + sizeof(struct IpHeader) + sizeof(struct UdpHeader), 
    160187                        dataByteCnt); 
    161188 
    162 //      ChanBufferFree(socket->channel, chanBuff); 
    163  
    164         return dataByteCnt;  
     189        ChanRecvBuffFree(socket->channel, chanBuff); 
     190 
     191        /* Fill in the structure, so we know where the packet came from */ 
     192        address->address = NetToHostLong(ipHeader->sourceAddr); 
     193        address->port = NetToHostShort(udpHeader->sourcePort); 
     194 
     195        return NetToHostShort(udpHeader->length) - sizeof(struct UdpHeader);  
    165196} 
    166197 
    167198static struct SocketOps udpSocketOps =  
    168199{ 
     200        .bind = UdpSocketBind, 
    169201        .connect = UdpSocketConnect, 
    170202        .connectEx = UdpSocketConnectEx,