void output(envid_t ns_envid) { binaryname = "ns_output"; // LAB 6: Your code here: // - read a packet from the network server // - send the packet to the device driver int retval; envid_t envid; int perms = 0; while(1){ retval = ipc_recv(&envid, &nsipcbuf, &perms); if (retval != NSREQ_OUTPUT) continue; sys_transmit_packet(nsipcbuf.pkt.jp_data, nsipcbuf.pkt.jp_len); } }
// Dispatches to the correct kernel function, passing the arguments. int32_t syscall(uint32_t syscallno, uint32_t a1, uint32_t a2, uint32_t a3, uint32_t a4, uint32_t a5) { // Call the function corresponding to the 'syscallno' parameter. // Return any appropriate return value. // LAB 3: Your code here. int32_t ret = 0; switch (syscallno) { case SYS_cputs: sys_cputs((char *)a1, (size_t)a2); break; case SYS_cgetc: ret = sys_cgetc(); break; case SYS_getenvid: ret = sys_getenvid(); break; case SYS_env_destroy: ret = sys_env_destroy((envid_t)a1); break; case SYS_yield: sys_yield(); break; case SYS_exofork: ret = sys_exofork(); break; case SYS_env_set_status: ret = sys_env_set_status((envid_t)a1, a2); break; case SYS_page_alloc: ret = sys_page_alloc((envid_t)a1, (void *)a2, a3); break; case SYS_page_map: ret = sys_page_map((envid_t)a1, (void *)a2, (envid_t)a3, (void *)a4, a5); break; case SYS_page_unmap: ret = sys_page_unmap((envid_t)a1, (void *)a2); break; case SYS_env_set_pgfault_upcall: ret = sys_env_set_pgfault_upcall((envid_t)a1, (void *)a2); break; case SYS_ipc_recv: ret = sys_ipc_recv((void *)a1); break; case SYS_ipc_try_send: ret = sys_ipc_try_send((envid_t)a1, (uint32_t)a2, (void *)a3, (unsigned)a4); break; case SYS_env_set_trapframe: ret = sys_env_set_trapframe((envid_t)a1, (struct Trapframe *)a2); break; case SYS_time_msec: ret = sys_time_msec(); break; case SYS_transmit_packet: ret = sys_transmit_packet((void *)a1, a2); break; case SYS_receive_packet: ret = sys_receive_packet((void *)a1); break; default: return -E_INVAL; } return ret; }