194,8 → 194,8 |
case NET_PACKET_GET_SIZE: |
packet = pm_find( IPC_GET_ID( call )); |
if( ! packet_is_valid( packet )) return ENOENT; |
IPC_SET_ARG1( * answer, packet->length ); |
* answer_count = 1; |
IPC_SET_ARG1( * answer, packet->length ); |
return EOK; |
case NET_PACKET_RELEASE: |
return packet_release_wrapper( IPC_GET_ID( call )); |
234,7 → 234,12 |
while( packet_is_valid( packet ) && ( packet->length < length )){ |
packet = pm_find( packet->next ); |
} |
if( packet ){ |
if( packet_is_valid( packet )){ |
if( packet == ps_globals.free[ index ] ){ |
ps_globals.free[ index ] = pq_detach( packet ); |
}else{ |
pq_detach( packet ); |
} |
packet_init( packet, addr_len, max_prefix, max_content, max_suffix ); |
futex_up( & ps_globals.lock ); |
return packet; |
258,29 → 263,24 |
packet->packet_id = ps_globals.count; |
packet->length = length; |
packet_init( packet, addr_len, max_prefix, max_content, max_suffix ); |
packet->magic_value = PACKET_MAGIC_VALUE; |
if( ERROR_OCCURRED( pm_add( packet ))){ |
munmap( packet, packet->length ); |
return NULL; |
} |
packet_release( packet ); |
return packet; |
} |
|
void packet_init( packet_t packet, size_t addr_len, size_t max_prefix, size_t max_content, size_t max_suffix ){ |
int length; |
|
// clear whole packet |
length = packet->length; |
bzero( packet, packet->length ); |
packet->length = length; |
packet->magic_value = PACKET_MAGIC_VALUE; |
/* // clear the packet header |
// clear the packet content |
bzero((( void * ) packet ) + sizeof( struct packet ), packet->length - sizeof( struct packet )); |
// clear the packet header |
packet->order = 0; |
packet->metric = 0; |
packet->previous = 0; |
packet->next = 0; |
packet->addr_len = 0; |
*/ packet->src_addr = sizeof( struct packet ); |
packet->src_addr = sizeof( struct packet ); |
packet->dest_addr = packet->src_addr + addr_len; |
packet->max_prefix = max_prefix; |
packet->max_content = max_content; |