Changes in uspace/srv/net/nil/nildummy/nildummy.c [49bd793b:8d7ec69d] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/nil/nildummy/nildummy.c
r49bd793b r8d7ec69d 2 2 * Copyright (c) 2009 Lukas Mejdrech 3 3 * Copyright (c) 2011 Radim Vansa 4 * Copyright (c) 2011 Jiri Svoboda 4 5 * All rights reserved. 5 6 * … … 53 54 #include <packet_remote.h> 54 55 #include <packet_client.h> 55 #include <devman.h>56 56 #include <device/nic.h> 57 #include <loc.h> 57 58 #include <nil_skel.h> 58 59 #include "nildummy.h" … … 69 70 DEVICE_MAP_IMPLEMENT(nildummy_devices, nildummy_device_t); 70 71 71 int nil_device_state_msg_local(nic_device_id_t device_id, sysarg_t state) 72 static void nildummy_nic_cb_conn(ipc_callid_t iid, ipc_call_t *icall, 73 void *arg); 74 75 static int nildummy_device_state(nic_device_id_t device_id, sysarg_t state) 72 76 { 73 77 fibril_rwlock_read_lock(&nildummy_globals.protos_lock); … … 78 82 79 83 return EOK; 84 } 85 86 static int nildummy_addr_changed(nic_device_id_t device_id) 87 { 88 return ENOTSUP; 80 89 } 81 90 … … 115 124 */ 116 125 static int nildummy_device_message(nic_device_id_t device_id, 117 devman_handle_t handle, size_t mtu)126 service_id_t sid, size_t mtu) 118 127 { 119 128 fibril_rwlock_write_lock(&nildummy_globals.devices_lock); … … 123 132 nildummy_devices_find(&nildummy_globals.devices, device_id); 124 133 if (device) { 125 if (device-> handle != handle) {134 if (device->sid != sid) { 126 135 printf("Device %d exists, handles do not match\n", 127 136 device->device_id); … … 158 167 159 168 device->device_id = device_id; 160 device-> handle = handle;169 device->sid = sid; 161 170 if (mtu > 0) 162 171 device->mtu = mtu; … … 165 174 166 175 /* Bind the device driver */ 167 device->sess = devman_device_connect(EXCHANGE_SERIALIZE, handle,176 device->sess = loc_service_connect(EXCHANGE_SERIALIZE, sid, 168 177 IPC_FLAG_BLOCKING); 169 178 if (device->sess == NULL) { … … 173 182 } 174 183 175 nic_connect_to_nil(device->sess, SERVICE_NILDUMMY, device_id); 184 int rc = nic_callback_create(device->sess, device_id, 185 nildummy_nic_cb_conn, NULL); 186 if (rc != EOK) { 187 async_hangup(device->sess); 188 189 return ENOENT; 190 } 176 191 177 192 /* Get hardware address */ 178 intrc = nic_get_address(device->sess, &device->addr);193 rc = nic_get_address(device->sess, &device->addr); 179 194 if (rc != EOK) { 180 195 fibril_rwlock_write_unlock(&nildummy_globals.devices_lock); … … 345 360 services_t sender) 346 361 { 362 packet_t *p; 363 347 364 fibril_rwlock_read_lock(&nildummy_globals.devices_lock); 348 365 … … 354 371 } 355 372 356 /* Send packet queue */ 357 if (packet) 358 nic_send_message(device->sess, packet_get_id(packet)); 373 p = packet; 374 do { 375 nic_send_frame(device->sess, packet_get_data(p), 376 packet_get_data_length(p)); 377 p = pq_next(p); 378 } while (p != NULL); 379 380 pq_release_remote(nildummy_globals.net_sess, packet_get_id(packet)); 359 381 360 382 fibril_rwlock_read_unlock(&nildummy_globals.devices_lock); 361 383 362 384 return EOK; 385 } 386 387 static int nildummy_received(nic_device_id_t device_id) 388 { 389 void *data; 390 size_t size; 391 int rc; 392 393 rc = async_data_write_accept(&data, false, 0, 0, 0, &size); 394 if (rc != EOK) 395 return rc; 396 397 packet_t *packet = packet_get_1_remote(nildummy_globals.net_sess, size); 398 if (packet == NULL) 399 return ENOMEM; 400 401 void *pdata = packet_suffix(packet, size); 402 memcpy(pdata, data, size); 403 free(pdata); 404 405 return nil_received_msg_local(device_id, packet); 363 406 } 364 407 … … 417 460 *answer_count = 1; 418 461 return rc; 419 case NET_NIL_DEVICE_STATE:420 rc = nil_device_state_msg_local(IPC_GET_DEVICE(*call),421 IPC_GET_STATE(*call));422 async_answer_0(callid, (sysarg_t) rc);423 return rc;424 425 case NET_NIL_RECEIVED:426 rc = packet_translate_remote(nildummy_globals.net_sess, &packet,427 IPC_GET_ARG2(*call));428 if (rc == EOK)429 rc = nil_received_msg_local(IPC_GET_ARG1(*call), packet);430 431 async_answer_0(callid, (sysarg_t) rc);432 return rc;433 462 } 434 463 435 464 return ENOTSUP; 436 465 } 466 467 static void nildummy_nic_cb_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg) 468 { 469 int rc; 470 471 async_answer_0(iid, EOK); 472 473 while (true) { 474 ipc_call_t call; 475 ipc_callid_t callid = async_get_call(&call); 476 477 if (!IPC_GET_IMETHOD(call)) 478 break; 479 480 switch (IPC_GET_IMETHOD(call)) { 481 case NIC_EV_DEVICE_STATE: 482 rc = nildummy_device_state(IPC_GET_ARG1(call), 483 IPC_GET_ARG2(call)); 484 async_answer_0(callid, (sysarg_t) rc); 485 break; 486 case NIC_EV_RECEIVED: 487 rc = nildummy_received(IPC_GET_ARG1(call)); 488 async_answer_0(callid, (sysarg_t) rc); 489 break; 490 case NIC_EV_ADDR_CHANGED: 491 rc = nildummy_addr_changed(IPC_GET_ARG1(call)); 492 async_answer_0(callid, (sysarg_t) rc); 493 break; 494 default: 495 async_answer_0(callid, ENOTSUP); 496 } 497 } 498 } 499 437 500 438 501 int main(int argc, char *argv[])
Note:
See TracChangeset
for help on using the changeset viewer.