The following edits were made: \

1. Updated UDP send data code\
2. Corrected internet checksum\
3. Moved udp_buffer() and udp_buflen() to udp.c from udp.h
This commit is contained in:
Nikhil Chandru Rao
2006-07-19 16:25:23 +00:00
parent b8d619e822
commit ab577e1a3a
4 changed files with 62 additions and 33 deletions

View File

@@ -107,30 +107,19 @@ int trans_tx ( struct pk_buff *pkb, struct tcpip_protocol *tcpip,
/**
* Calculate internet checksum
*
* @v data Pointer to the data
* @v len Length of data to be checksummed
* @ret chksum 16 bit internet checksum
*
* This function calculates the internet checksum (refer RFC1071) for "len"
* bytes beginning at the location "data"
* @v b Pointer to the data
* @v len Length of data to be checksummed
* @ret result 16 bit internet checksum
*/
uint16_t calc_chksum ( void *data, size_t len ) {
register long sum = 0;
uint16_t checksum;
unsigned short *temp;
while ( len > 1 ) {
temp = (unsigned short*) data++;
sum += *temp;
len -= 2;
}
if ( len > 0 ) {
sum += *(unsigned char *)data;
}
while ( sum >> 16 ) {
sum = ( sum & 0xffff ) + ( sum >> 16 );
}
checksum = ~sum;
return checksum;
uint16_t calc_chksum(void *b, int len) {
uint16_t *buf = b, result;
uint16_t sum=0;
for ( sum = 0; len > 1; len -= 2 ) /* Sum all 16b words */
sum += *buf++;
if ( len == 1 ) /* If any stray bytes, */
sum += *(unsigned char*)buf; /* add to sum */
sum = (sum >> 16) + (sum & 0xffff); /* Add the carry */
sum += (sum >> 16); /* (again) */
result = ~sum; /* Take the one's complement */
return result; /* Return 16b value */
}

View File

@@ -18,6 +18,14 @@
* UDP protocol
*/
/**
* List of registered UDP connections
*/
static LIST_HEAD ( udp_conns );
/**
* Some utility functions
*/
static inline void copy_sockaddr ( struct sockaddr *source, struct sockaddr *dest ) {
memcpy ( dest, source, sizeof ( *dest ) );
}
@@ -98,7 +106,27 @@ int udp_buf_alloc ( struct udp_connection *conn, size_t len ) {
}
/**
* Send data via a UDP connection
* User request to send data via a UDP connection
*
* @v conn UDP connection
*
* This function allocates buffer space and invokes the function's senddata()
* callback. The callback may use the buffer space
*/
int udp_senddata ( struct udp_connection *conn ) {
conn->tx_pkb = pkb_alloc ( UDP_MAX_TXPKB );
if ( conn->tx_pkb == NULL ) {
DBG ( "Error allocating packet buffer of length %d\n",
UDP_MAX_TXPKB );
return -ENOMEM;
}
conn->udp_op->senddata ( conn, conn->tx_pkb, pkb_len ( conn->tx_pkb ) );
return 0;
}
/**
* Transmit data via a UDP connection
*
* @v conn UDP connection
* @v data Data to send
@@ -124,7 +152,7 @@ int udp_send ( struct udp_connection *conn, const void *data, size_t len ) {
/* Reserve space for the headers and copy contents */
pkb_reserve ( conn->tx_pkb, UDP_MAX_HLEN );
memcpy ( pkb_put ( conn->tx_pkb, len ), data, len );
memmove ( pkb_put ( conn->tx_pkb, len ), data, len );
}
/*