X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Finterfaces%2Fvmm_packet.c;h=07c86ee93c926c9bbec1780445cd9036e6cdb681;hb=e3b62e7befa086a4fb320890952f54667ee46329;hp=10bdbda6fb59c01eaa1d0ca74915d43f0d698b93;hpb=3aa43c8aeb9750675238aa33db37c771d815a706;p=palacios.git diff --git a/palacios/src/interfaces/vmm_packet.c b/palacios/src/interfaces/vmm_packet.c index 10bdbda..07c86ee 100644 --- a/palacios/src/interfaces/vmm_packet.c +++ b/palacios/src/interfaces/vmm_packet.c @@ -16,7 +16,6 @@ * This is free software. You are permitted to use, * redistribute, and modify it as specified in the file "V3VEE_LICENSE". */ - #include #include #include @@ -25,35 +24,54 @@ static struct v3_packet_hooks * packet_hooks = 0; -int V3_send_raw(const char * pkt, uint32_t len) { - if(packet_hooks != NULL && packet_hooks->send != NULL){ - return packet_hooks->send(pkt, len, NULL); - } +void V3_Init_Packet(struct v3_packet_hooks * hooks) { + packet_hooks = hooks; + PrintDebug("V3 raw packet interface inited\n"); - return -1; + return; } +struct v3_packet * v3_packet_connect(struct v3_vm_info * vm, + const char * host_nic, + const char * vm_mac, + int (*input)(struct v3_packet * packet, uint8_t * buf, uint32_t len), + void * guest_packet_data) { + struct v3_packet * packet = NULL; -int V3_packet_add_recver(const char * mac, struct v3_vm_info * vm){ - if(packet_hooks != NULL && packet_hooks->add_recver != NULL){ - return packet_hooks->add_recver(mac, vm); - } + V3_ASSERT(packet_hooks != NULL); + V3_ASSERT(packet_hooks->connect != NULL); - return -1; -} + packet = V3_Malloc(sizeof(struct v3_packet)); + if (!packet) { + PrintError("Cannot allocate in connecting packet\n"); + return NULL; + } -int V3_packet_del_recver(const char * mac, struct v3_vm_info * vm){ - if(packet_hooks != NULL && packet_hooks->del_recver != NULL){ - return packet_hooks->del_recver(mac, vm); + memcpy(packet->dev_mac, vm_mac, ETH_ALEN); + packet->input = input; + packet->guest_packet_data = guest_packet_data; + if(packet_hooks->connect(packet, host_nic, vm->host_priv_data) != 0){ + V3_Free(packet); + return NULL; } - return -1; + return packet; } -void V3_Init_Packet(struct v3_packet_hooks * hooks) { - packet_hooks = hooks; - PrintDebug("V3 raw packet interface inited\n"); +int v3_packet_send(struct v3_packet * packet, uint8_t * buf, uint32_t len) { + V3_ASSERT(packet_hooks != NULL); + V3_ASSERT(packet_hooks->send != NULL); + + return packet_hooks->send(packet, buf, len); +} - return; +void v3_packet_close(struct v3_packet * packet) { + V3_ASSERT(packet_hooks != NULL); + V3_ASSERT(packet_hooks->close != NULL); + + packet_hooks->close(packet); + V3_Free(packet); } + +