Changes in uspace/srv/net/nil/nildummy/nildummy.c [8d7ec69d:49bd793b] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/nil/nildummy/nildummy.c
r8d7ec69d r49bd793b 2 2 * Copyright (c) 2009 Lukas Mejdrech 3 3 * Copyright (c) 2011 Radim Vansa 4 * Copyright (c) 2011 Jiri Svoboda5 4 * All rights reserved. 6 5 * … … 54 53 #include <packet_remote.h> 55 54 #include <packet_client.h> 55 #include <devman.h> 56 56 #include <device/nic.h> 57 #include <loc.h>58 57 #include <nil_skel.h> 59 58 #include "nildummy.h" … … 70 69 DEVICE_MAP_IMPLEMENT(nildummy_devices, nildummy_device_t); 71 70 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) 71 int nil_device_state_msg_local(nic_device_id_t device_id, sysarg_t state) 76 72 { 77 73 fibril_rwlock_read_lock(&nildummy_globals.protos_lock); … … 82 78 83 79 return EOK; 84 }85 86 static int nildummy_addr_changed(nic_device_id_t device_id)87 {88 return ENOTSUP;89 80 } 90 81 … … 124 115 */ 125 116 static int nildummy_device_message(nic_device_id_t device_id, 126 service_id_t sid, size_t mtu)117 devman_handle_t handle, size_t mtu) 127 118 { 128 119 fibril_rwlock_write_lock(&nildummy_globals.devices_lock); … … 132 123 nildummy_devices_find(&nildummy_globals.devices, device_id); 133 124 if (device) { 134 if (device-> sid != sid) {125 if (device->handle != handle) { 135 126 printf("Device %d exists, handles do not match\n", 136 127 device->device_id); … … 167 158 168 159 device->device_id = device_id; 169 device-> sid = sid;160 device->handle = handle; 170 161 if (mtu > 0) 171 162 device->mtu = mtu; … … 174 165 175 166 /* Bind the device driver */ 176 device->sess = loc_service_connect(EXCHANGE_SERIALIZE, sid,167 device->sess = devman_device_connect(EXCHANGE_SERIALIZE, handle, 177 168 IPC_FLAG_BLOCKING); 178 169 if (device->sess == NULL) { … … 182 173 } 183 174 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 } 175 nic_connect_to_nil(device->sess, SERVICE_NILDUMMY, device_id); 191 176 192 177 /* Get hardware address */ 193 rc = nic_get_address(device->sess, &device->addr);178 int rc = nic_get_address(device->sess, &device->addr); 194 179 if (rc != EOK) { 195 180 fibril_rwlock_write_unlock(&nildummy_globals.devices_lock); … … 360 345 services_t sender) 361 346 { 362 packet_t *p;363 364 347 fibril_rwlock_read_lock(&nildummy_globals.devices_lock); 365 348 … … 371 354 } 372 355 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)); 356 /* Send packet queue */ 357 if (packet) 358 nic_send_message(device->sess, packet_get_id(packet)); 381 359 382 360 fibril_rwlock_read_unlock(&nildummy_globals.devices_lock); 383 361 384 362 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);406 363 } 407 364 … … 460 417 *answer_count = 1; 461 418 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; 462 433 } 463 434 464 435 return ENOTSUP; 465 436 } 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 500 437 501 438 int main(int argc, char *argv[])
Note:
See TracChangeset
for help on using the changeset viewer.