git.ucc.asn.au
/
tpg
/
acess2.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
| inline |
side by side
Usermode/libposix - Misc
[tpg/acess2.git]
/
KernelLand
/
Modules
/
IPStack
/
udp.c
diff --git
a/KernelLand/Modules/IPStack/udp.c
b/KernelLand/Modules/IPStack/udp.c
index
0f6ec3d
..
eb8281b
100644
(file)
--- a/
KernelLand/Modules/IPStack/udp.c
+++ b/
KernelLand/Modules/IPStack/udp.c
@@
-117,10
+117,8
@@
void UDP_GetPacket(tInterface *Interface, void *Address, int Length, void *Buffe
{
tUDPHeader *hdr = Buffer;
- Log_Debug("UDP", "hdr->SourcePort = %i", ntohs(hdr->SourcePort));
- Log_Debug("UDP", "hdr->DestPort = %i", ntohs(hdr->DestPort));
- Log_Debug("UDP", "hdr->Length = %i", ntohs(hdr->Length));
- Log_Debug("UDP", "hdr->Checksum = 0x%x", ntohs(hdr->Checksum));
+ Log_Debug("UDP", "%i bytes :%i->:%i (Cksum 0x%04x)",
+ ntohs(hdr->Length), ntohs(hdr->SourcePort), ntohs(hdr->Length), ntohs(hdr->Checksum));
// Check registered connections
Mutex_Acquire(&glUDP_Channels);
@@
-144,7
+142,7
@@
void UDP_Unreachable(tInterface *Interface, int Code, void *Address, int Length,
*/
void UDP_SendPacketTo(tUDPChannel *Channel, int AddrType, const void *Address, Uint16 Port, const void *Data, size_t Length)
{
- tUDPHeader
*
hdr;
+ tUDPHeader hdr;
if(Channel->Interface && Channel->Interface->Type != AddrType) return ;
@@
-152,17
+150,17
@@
void UDP_SendPacketTo(tUDPChannel *Channel, int AddrType, const void *Address, U
{
case 4:
// Create the packet
- hdr = malloc(sizeof(tUDPHeader)+Length);
- hdr->SourcePort = htons( Channel->LocalPort );
- hdr->DestPort = htons( Port );
- hdr->Length = htons( sizeof(tUDPHeader) + Length );
- hdr->Checksum = 0; // Checksum can be zero on IPv4
- memcpy(hdr->Data, Data, Length);
+ hdr.SourcePort = htons( Channel->LocalPort );
+ hdr.DestPort = htons( Port );
+ hdr.Length = htons( sizeof(tUDPHeader) + Length );
+ hdr.Checksum = 0; // Checksum can be zero on IPv4
// Pass on the the IPv4 Layer
+ tIPStackBuffer *buffer = IPStack_Buffer_CreateBuffer(2 + IPV4_BUFFERS);
+ IPStack_Buffer_AppendSubBuffer(buffer, Length, 0, Data, NULL, NULL);
+ IPStack_Buffer_AppendSubBuffer(buffer, sizeof(hdr), 0, &hdr, NULL, NULL);
// TODO: What if Channel->Interface is NULL here?
- IPv4_SendPacket(Channel->Interface, *(tIPv4*)Address, IP4PROT_UDP, 0, sizeof(tUDPHeader)+Length, hdr);
- // Free allocated packet
- free(hdr);
+ IPv4_SendPacket(Channel->Interface, *(tIPv4*)Address, IP4PROT_UDP, 0, buffer);
+ IPStack_Buffer_DestroyBuffer(buffer);
break;
}
}
@@
-255,7
+253,11
@@
size_t UDP_Channel_Write(tVFS_Node *Node, off_t Offset, size_t Length, const voi
const tUDPEndpoint *ep;
const void *data;
int ofs;
- if(chan->LocalPort == 0) return 0;
+
+ if(chan->LocalPort == 0) {
+ Log_Notice("UDP", "Write to channel %p with zero local port", chan);
+ return 0;
+ }
ep = Buffer;
ofs = 2 + 2 + IPStack_GetAddressSize( ep->AddrType );
@@
-264,7
+266,7
@@
size_t UDP_Channel_Write(tVFS_Node *Node, off_t Offset, size_t Length, const voi
UDP_SendPacketTo(chan, ep->AddrType, &ep->Addr, ep->Port, data, (size_t)Length - ofs);
- return
0
;
+ return
Length
;
}
/**
UCC
git Repository :: git.ucc.asn.au