Changes in uspace/srv/net/structures/packet/packet_server.c [1e2e0c1e:aadf01e] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/structures/packet/packet_server.c
r1e2e0c1e raadf01e 76 76 /** Free packet queues. 77 77 */ 78 packet_t free[ FREE_QUEUES_COUNT];78 packet_t free[FREE_QUEUES_COUNT]; 79 79 /** Packet length upper bounds of the free packet queues. 80 80 * The maximal lengths of packets in each queue in the ascending order. 81 81 * The last queue is not limited. 82 82 */ 83 size_t sizes[ FREE_QUEUES_COUNT];83 size_t sizes[FREE_QUEUES_COUNT]; 84 84 /** Total packets allocated. 85 85 */ … … 89 89 .counter = 1, 90 90 .waiters = { 91 .prev = & 92 .next = & 91 .prev = &ps_globals.lock.waiters, 92 .next = &ps_globals.lock.waiters, 93 93 } 94 94 }, 95 .free = { NULL, NULL, NULL, NULL, NULL, NULL, NULL},96 .sizes = { PAGE_SIZE, PAGE_SIZE * 2, PAGE_SIZE * 4, PAGE_SIZE * 8, PAGE_SIZE * 16, PAGE_SIZE * 32, PAGE_SIZE * 64},95 .free = {NULL, NULL, NULL, NULL, NULL, NULL, NULL}, 96 .sizes = {PAGE_SIZE, PAGE_SIZE * 2, PAGE_SIZE * 4, PAGE_SIZE * 8, PAGE_SIZE * 16, PAGE_SIZE * 32, PAGE_SIZE * 64}, 97 97 .count = 0 98 98 }; … … 113 113 * @returns NULL if there is not enough memory left. 114 114 */ 115 packet_t packet_get( size_t addr_len, size_t max_prefix, size_t max_content, size_t max_suffix);115 packet_t packet_get(size_t addr_len, size_t max_prefix, size_t max_content, size_t max_suffix); 116 116 117 117 /** Releases the packet queue. … … 120 120 * @returns ENOENT if there is no such packet. 121 121 */ 122 int packet_release_wrapper( packet_id_t packet_id);122 int packet_release_wrapper(packet_id_t packet_id); 123 123 124 124 /** Releases the packet and returns it to the appropriate free packet queue. … … 126 126 * @param[in] packet The packet to be released. 127 127 */ 128 void packet_release( packet_t packet);128 void packet_release(packet_t packet); 129 129 130 130 /** Creates a new packet of dimensions at least as given. … … 138 138 * @returns NULL if there is not enough memory left. 139 139 */ 140 packet_t packet_create( size_t length, size_t addr_len, size_t max_prefix, size_t max_content, size_t max_suffix);140 packet_t packet_create(size_t length, size_t addr_len, size_t max_prefix, size_t max_content, size_t max_suffix); 141 141 142 142 /** Clears and initializes the packet according to the given dimensions. … … 147 147 * @param[in] max_suffix The maximal suffix length in bytes. 148 148 */ 149 void packet_init( packet_t packet, size_t addr_len, size_t max_prefix, size_t max_content, size_t max_suffix);149 void packet_init(packet_t packet, size_t addr_len, size_t max_prefix, size_t max_content, size_t max_suffix); 150 150 151 151 /** Shares the packet memory block. … … 157 157 * @returns Other error codes as defined for the async_share_in_finalize() function. 158 158 */ 159 int packet_reply( const packet_t packet);159 int packet_reply(const packet_t packet); 160 160 161 161 /*@}*/ 162 162 163 int packet_translate( int phone, packet_ref packet, packet_id_t packet_id ){ 164 if( ! packet ) return EINVAL; 165 * packet = pm_find( packet_id ); 166 return ( * packet ) ? EOK : ENOENT; 167 } 168 169 packet_t packet_get_4( int phone, size_t max_content, size_t addr_len, size_t max_prefix, size_t max_suffix ){ 170 return packet_get( addr_len, max_prefix, max_content, max_suffix ); 171 } 172 173 packet_t packet_get_1( int phone, size_t content ){ 174 return packet_get( DEFAULT_ADDR_LEN, DEFAULT_PREFIX, content, DEFAULT_SUFFIX ); 175 } 176 177 void pq_release( int phone, packet_id_t packet_id ){ 178 ( void ) packet_release_wrapper( packet_id ); 179 } 180 181 int packet_server_message( ipc_callid_t callid, ipc_call_t * call, ipc_call_t * answer, int * answer_count ){ 163 int packet_translate(int phone, packet_ref packet, packet_id_t packet_id){ 164 if(! packet){ 165 return EINVAL; 166 } 167 *packet = pm_find(packet_id); 168 return (*packet) ? EOK : ENOENT; 169 } 170 171 packet_t packet_get_4(int phone, size_t max_content, size_t addr_len, size_t max_prefix, size_t max_suffix){ 172 return packet_get(addr_len, max_prefix, max_content, max_suffix); 173 } 174 175 packet_t packet_get_1(int phone, size_t content){ 176 return packet_get(DEFAULT_ADDR_LEN, DEFAULT_PREFIX, content, DEFAULT_SUFFIX); 177 } 178 179 void pq_release(int phone, packet_id_t packet_id){ 180 (void) packet_release_wrapper(packet_id); 181 } 182 183 int packet_server_message(ipc_callid_t callid, ipc_call_t * call, ipc_call_t * answer, int * answer_count){ 182 184 packet_t packet; 183 185 184 * 185 switch( IPC_GET_METHOD( * call)){186 *answer_count = 0; 187 switch(IPC_GET_METHOD(*call)){ 186 188 case IPC_M_PHONE_HUNGUP: 187 189 return EOK; 188 190 case NET_PACKET_CREATE_1: 189 packet = packet_get( DEFAULT_ADDR_LEN, DEFAULT_PREFIX, IPC_GET_CONTENT( call ), DEFAULT_SUFFIX ); 190 if( ! packet ) return ENOMEM; 191 * answer_count = 2; 192 IPC_SET_ARG1( * answer, packet->packet_id ); 193 IPC_SET_ARG2( * answer, packet->length ); 191 packet = packet_get(DEFAULT_ADDR_LEN, DEFAULT_PREFIX, IPC_GET_CONTENT(call), DEFAULT_SUFFIX); 192 if(! packet){ 193 return ENOMEM; 194 } 195 *answer_count = 2; 196 IPC_SET_ARG1(*answer, packet->packet_id); 197 IPC_SET_ARG2(*answer, packet->length); 194 198 return EOK; 195 199 case NET_PACKET_CREATE_4: 196 packet = packet_get((( DEFAULT_ADDR_LEN < IPC_GET_ADDR_LEN( call )) ? IPC_GET_ADDR_LEN( call ) : DEFAULT_ADDR_LEN ), DEFAULT_PREFIX + IPC_GET_PREFIX( call ), IPC_GET_CONTENT( call ), DEFAULT_SUFFIX + IPC_GET_SUFFIX( call )); 197 if( ! packet ) return ENOMEM; 198 * answer_count = 2; 199 IPC_SET_ARG1( * answer, packet->packet_id ); 200 IPC_SET_ARG2( * answer, packet->length ); 200 packet = packet_get(((DEFAULT_ADDR_LEN < IPC_GET_ADDR_LEN(call)) ? IPC_GET_ADDR_LEN(call) : DEFAULT_ADDR_LEN), DEFAULT_PREFIX + IPC_GET_PREFIX(call), IPC_GET_CONTENT(call), DEFAULT_SUFFIX + IPC_GET_SUFFIX(call)); 201 if(! packet){ 202 return ENOMEM; 203 } 204 *answer_count = 2; 205 IPC_SET_ARG1(*answer, packet->packet_id); 206 IPC_SET_ARG2(*answer, packet->length); 201 207 return EOK; 202 208 case NET_PACKET_GET: 203 packet = pm_find( IPC_GET_ID( call )); 204 if( ! packet_is_valid( packet )) return ENOENT; 205 return packet_reply( packet ); 209 packet = pm_find(IPC_GET_ID(call)); 210 if(! packet_is_valid(packet)){ 211 return ENOENT; 212 } 213 return packet_reply(packet); 206 214 case NET_PACKET_GET_SIZE: 207 packet = pm_find( IPC_GET_ID( call )); 208 if( ! packet_is_valid( packet )) return ENOENT; 209 IPC_SET_ARG1( * answer, packet->length ); 210 * answer_count = 1; 215 packet = pm_find(IPC_GET_ID(call)); 216 if(! packet_is_valid(packet)){ 217 return ENOENT; 218 } 219 IPC_SET_ARG1(*answer, packet->length); 220 *answer_count = 1; 211 221 return EOK; 212 222 case NET_PACKET_RELEASE: 213 return packet_release_wrapper( IPC_GET_ID( call));223 return packet_release_wrapper(IPC_GET_ID(call)); 214 224 } 215 225 return ENOTSUP; 216 226 } 217 227 218 int packet_release_wrapper( packet_id_t packet_id ){ 219 packet_t packet; 220 221 packet = pm_find( packet_id ); 222 if( ! packet_is_valid( packet )) return ENOENT; 223 fibril_mutex_lock( & ps_globals.lock ); 224 pq_destroy( packet, packet_release ); 225 fibril_mutex_unlock( & ps_globals.lock ); 228 int packet_release_wrapper(packet_id_t packet_id){ 229 packet_t packet; 230 231 packet = pm_find(packet_id); 232 if(! packet_is_valid(packet)){ 233 return ENOENT; 234 } 235 fibril_mutex_lock(&ps_globals.lock); 236 pq_destroy(packet, packet_release); 237 fibril_mutex_unlock(&ps_globals.lock); 226 238 return EOK; 227 239 } 228 240 229 void packet_release( packet_t packet){241 void packet_release(packet_t packet){ 230 242 int index; 231 243 int result; 232 244 233 245 // remove debug dump 234 // printf( "packet %d released\n", packet->packet_id);235 for( index = 0; ( index < FREE_QUEUES_COUNT - 1 ) && ( packet->length > ps_globals.sizes[ index ] ); ++ index);236 result = pq_add( & ps_globals.free[ index ], packet, packet->length, packet->length);237 assert( result == EOK);238 } 239 240 packet_t packet_get( size_t addr_len, size_t max_prefix, size_t max_content, size_t max_suffix){246 // printf("packet %d released\n", packet->packet_id); 247 for(index = 0; (index < FREE_QUEUES_COUNT - 1) && (packet->length > ps_globals.sizes[index]); ++ index); 248 result = pq_add(&ps_globals.free[index], packet, packet->length, packet->length); 249 assert(result == EOK); 250 } 251 252 packet_t packet_get(size_t addr_len, size_t max_prefix, size_t max_content, size_t max_suffix){ 241 253 int index; 242 254 packet_t packet; 243 255 size_t length; 244 256 245 length = ALIGN_UP( sizeof( struct packet ) + 2 * addr_len + max_prefix + max_content + max_suffix, PAGE_SIZE);246 fibril_mutex_lock( & ps_globals.lock);247 for( index = 0; index < FREE_QUEUES_COUNT - 1; ++ index){248 if( length <= ps_globals.sizes[ index ]){249 packet = ps_globals.free[ index];250 while( packet_is_valid( packet ) && ( packet->length < length)){251 packet = pm_find( packet->next);252 } 253 if( packet_is_valid( packet)){254 if( packet == ps_globals.free[ index ]){255 ps_globals.free[ index ] = pq_detach( packet);257 length = ALIGN_UP(sizeof(struct packet) + 2 * addr_len + max_prefix + max_content + max_suffix, PAGE_SIZE); 258 fibril_mutex_lock(&ps_globals.lock); 259 for(index = 0; index < FREE_QUEUES_COUNT - 1; ++ index){ 260 if(length <= ps_globals.sizes[index]){ 261 packet = ps_globals.free[index]; 262 while(packet_is_valid(packet) && (packet->length < length)){ 263 packet = pm_find(packet->next); 264 } 265 if(packet_is_valid(packet)){ 266 if(packet == ps_globals.free[index]){ 267 ps_globals.free[index] = pq_detach(packet); 256 268 }else{ 257 pq_detach( packet);269 pq_detach(packet); 258 270 } 259 packet_init( packet, addr_len, max_prefix, max_content, max_suffix);260 fibril_mutex_unlock( & ps_globals.lock);271 packet_init(packet, addr_len, max_prefix, max_content, max_suffix); 272 fibril_mutex_unlock(&ps_globals.lock); 261 273 // remove debug dump 262 // printf( "packet %d got\n", packet->packet_id);274 // printf("packet %d got\n", packet->packet_id); 263 275 return packet; 264 276 } 265 277 } 266 278 } 267 packet = packet_create( length, addr_len, max_prefix, max_content, max_suffix);268 fibril_mutex_unlock( & ps_globals.lock);279 packet = packet_create(length, addr_len, max_prefix, max_content, max_suffix); 280 fibril_mutex_unlock(&ps_globals.lock); 269 281 // remove debug dump 270 // printf( "packet %d created\n", packet->packet_id);282 // printf("packet %d created\n", packet->packet_id); 271 283 return packet; 272 284 } 273 285 274 packet_t packet_create( size_t length, size_t addr_len, size_t max_prefix, size_t max_content, size_t max_suffix){286 packet_t packet_create(size_t length, size_t addr_len, size_t max_prefix, size_t max_content, size_t max_suffix){ 275 287 ERROR_DECLARE; 276 288 277 packet_t 289 packet_t packet; 278 290 279 291 // already locked 280 packet = ( packet_t ) mmap( NULL, length, PROTO_READ | PROTO_WRITE, MAP_SHARED | MAP_ANONYMOUS, 0, 0 ); 281 if( packet == MAP_FAILED ) return NULL; 292 packet = (packet_t) mmap(NULL, length, PROTO_READ | PROTO_WRITE, MAP_SHARED | MAP_ANONYMOUS, 0, 0); 293 if(packet == MAP_FAILED){ 294 return NULL; 295 } 282 296 ++ ps_globals.count; 283 297 packet->packet_id = ps_globals.count; 284 298 packet->length = length; 285 packet_init( packet, addr_len, max_prefix, max_content, max_suffix);299 packet_init(packet, addr_len, max_prefix, max_content, max_suffix); 286 300 packet->magic_value = PACKET_MAGIC_VALUE; 287 if( ERROR_OCCURRED( pm_add( packet))){288 munmap( packet, packet->length);301 if(ERROR_OCCURRED(pm_add(packet))){ 302 munmap(packet, packet->length); 289 303 return NULL; 290 304 } … … 292 306 } 293 307 294 void packet_init( packet_t packet, size_t addr_len, size_t max_prefix, size_t max_content, size_t max_suffix){308 void packet_init(packet_t packet, size_t addr_len, size_t max_prefix, size_t max_content, size_t max_suffix){ 295 309 // clear the packet content 296 bzero((( void * ) packet ) + sizeof( struct packet ), packet->length - sizeof( struct packet));310 bzero(((void *) packet) + sizeof(struct packet), packet->length - sizeof(struct packet)); 297 311 // clear the packet header 298 312 packet->order = 0; … … 301 315 packet->next = 0; 302 316 packet->addr_len = 0; 303 packet->src_addr = sizeof( struct packet);317 packet->src_addr = sizeof(struct packet); 304 318 packet->dest_addr = packet->src_addr + addr_len; 305 319 packet->max_prefix = max_prefix; … … 309 323 } 310 324 311 int packet_reply( const packet_t packet ){ 312 ipc_callid_t callid; 313 size_t size; 314 315 if( ! packet_is_valid( packet )) return EINVAL; 316 if( async_share_in_receive( & callid, & size ) <= 0 ) return EINVAL; 317 if( size != packet->length ) return ENOMEM; 318 return async_share_in_finalize( callid, packet, PROTO_READ | PROTO_WRITE ); 325 int packet_reply(const packet_t packet){ 326 ipc_callid_t callid; 327 size_t size; 328 329 if(! packet_is_valid(packet)){ 330 return EINVAL; 331 } 332 if(async_share_in_receive(&callid, &size) <= 0) return EINVAL; 333 if(size != packet->length){ 334 return ENOMEM; 335 } 336 return async_share_in_finalize(callid, packet, PROTO_READ | PROTO_WRITE); 319 337 } 320 338
Note:
See TracChangeset
for help on using the changeset viewer.