void output(envid_t ns_envid) { binaryname = "ns_output"; int32_t reqType; int perm; envid_t envid_sender; // LAB 6: Your code here: // - read a packet from the network server // - send the packet to the device driver while(1) { perm = 0; //Read a packet from ns reqType = ipc_recv(&envid_sender, &nsipcbuf, &perm); //Check if ipc_recv has received correctly if(!(perm & PTE_P)) { cprintf("Invalid request from network server[%08x]:no page",envid_sender); continue; } if(reqType != NSREQ_OUTPUT) { cprintf("Invalid request from network server[%08x]:not a NSREQ_OUTPUT message",envid_sender); continue; } //Send packet to device driver.If packet send fails, give up CPU while(sys_send_packet(nsipcbuf.pkt.jp_data, nsipcbuf.pkt.jp_len) < 0) sys_yield(); } }
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 struct jif_pkt *p = (struct jif_pkt *)&nsipcbuf; envid_t from; int32_t req, perm; while(1) { //listening to new ipcs //cprintf("ana hon\n"); req = ipc_recv(&from, &nsipcbuf ,&perm); if(! (perm & PTE_P)) { cprintf("Output env: invalid request from %08x: page not present\n",from); sys_yield(); continue; } if(ns_envid != from) { cprintf("Output env: request not from network server: %08x, %08x\n",from,ns_envid); sys_yield(); continue; } if(req != NSREQ_OUTPUT) { cprintf("Output env: invalid request\n"); sys_yield(); continue; } if((req = sys_send_packet(p->jp_data, p->jp_len)) <0) { cprintf("Output env: couldn't transmit output: %e\n",req); } } //sys_page_unmap(0, (void *)PKTMAP); }
// 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. switch (syscallno) { case SYS_cputs : sys_cputs((const char*) a1, (size_t) a2); return 0; case SYS_env_set_trapframe: return sys_env_set_trapframe((envid_t)a1, (struct Trapframe*) a2); case SYS_cgetc : return sys_cgetc(); case SYS_getenvid: return sys_getenvid(); case SYS_env_destroy: return sys_env_destroy((envid_t) a1); case SYS_yield: sys_yield(); return 0; case SYS_exofork: return sys_exofork(); case SYS_env_set_status: return sys_env_set_status((envid_t)a1,(int)a2); case SYS_page_alloc: return sys_page_alloc((envid_t)a1, (void *)a2, (int)a3); case SYS_page_map: return sys_page_map((envid_t)a1, (void *)a2, (envid_t)a3, (void *)a4, (int)a5); case SYS_page_unmap: return sys_page_unmap((envid_t)a1, (void *)a2); case SYS_env_set_pgfault_upcall: return sys_env_set_pgfault_upcall((envid_t)a1, (void *)a2); case SYS_ipc_try_send: //cprintf("Sending ipc..\n\n\n"); return sys_ipc_try_send((envid_t)a1, (uint32_t)a2, (void *)a3, (unsigned)a4); case SYS_ipc_recv: return sys_ipc_recv((void *)a1); case SYS_clear_block_access_bit: return sys_clear_block_access_bit((envid_t)a1, (void*) a2); case SYS_time_msec: return sys_time_msec(); case SYS_send_packet: return sys_send_packet((void *)a1, (unsigned)a2); case SYS_receive_packet: return sys_receive_packet((void *)a1); case SYS_get_mac_address: return sys_get_mac_address((uint8_t *) a1); case SYS_get_logged_user_name: return sys_get_logged_user_name((char *)a1); case SYS_get_current_path: return sys_get_current_path((char *)a1); case SYS_update_current_path: return sys_update_current_path((char *)a1); case SYS_get_home_dir: return sys_get_home_dir((char *)a1); default: return -E_INVAL; } //panic("syscall not implemented"); }