static struct pkt0_packet * alloc_pkt0_packet(struct vr_packet *vrp) { struct pkt0_packet *packet; unsigned int pkt_size = pkt_len(vrp); int ret; packet = ExAllocatePoolWithTag(NonPagedPoolNx, sizeof(struct pkt0_packet), pkt0_allocation_tag); if (packet == NULL) return NULL; RtlZeroMemory(packet, sizeof(*packet)); packet->buffer = ExAllocatePoolWithTag(NonPagedPoolNx, pkt_size, pkt0_allocation_tag); if (packet->buffer == NULL) goto failure; RtlZeroMemory(packet->buffer, pkt_size); ret = vr_pcopy(packet->buffer, vrp, vrp->vp_data, pkt_size); if (ret != pkt_size) { goto failure; } packet->length = ret; return packet; failure: if (packet) free_pkt0_packet(packet); return NULL; }
struct vr_packet * pkt_copy(struct vr_packet *pkt, unsigned short off, unsigned short len) { struct vr_packet *pkt_c; unsigned short head_space; /* * one eth header for agent, and one more for packets from * tun interfaces */ head_space = (2 * sizeof(struct vr_eth)) + sizeof(struct agent_hdr); pkt_c = vr_palloc(head_space + len); if (!pkt_c) return pkt_c; pkt_c->vp_data += head_space; pkt_c->vp_tail += head_space; if (vr_pcopy(pkt_data(pkt_c), pkt, off, len) < 0) { vr_pfree(pkt_c, VP_DROP_MISC); return NULL; } pkt_pull_tail(pkt_c, len); pkt_c->vp_if = pkt->vp_if; pkt_c->vp_flags = pkt->vp_flags; pkt_c->vp_cpu = pkt->vp_cpu; pkt_c->vp_network_h = 0; return pkt_c; }