vmnet - allocate one buffer and use it.

This commit is contained in:
Kelvin Sherlock 2018-12-26 22:51:04 -05:00
parent 44ee124882
commit c34b0a4c02

View File

@ -23,6 +23,7 @@ static uint8_t interface_mac[6];
static uint8_t interface_fake_mac[6];
static uint64_t interface_mtu;
static uint64_t interface_packet_size;
static uint8_t *interface_buffer = NULL;
static vmnet_return_t interface_status;
int rawnet_arch_init(void) {
@ -85,8 +86,9 @@ int rawnet_arch_activate(const char *interface_name) {
});
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
if (interface_status != VMNET_SUCCESS) {
if (interface_status == VMNET_SUCCESS) {
interface_buffer = (uint8_t *)malloc(interface_packet_size);
} else {
log_message(rawnet_arch_log, "vmnet_start_interface failed");
if (interface) {
vmnet_stop_interface(interface, q, ^(vmnet_return_t status){
@ -122,6 +124,8 @@ void rawnet_arch_deactivate(void) {
interface = NULL;
interface_status = 0;
}
free(interface_buffer);
interface_buffer = NULL;
}
@ -350,7 +354,6 @@ void rawnet_arch_transmit(int force, int onecoll, int inhibit_crc, int tx_pad_di
vmnet_return_t st;
struct vmpktdesc v;
struct iovec iov;
uint8_t *buffer;
if (txlength == 0) return;
if (txlength > interface_packet_size) {
@ -364,11 +367,10 @@ void rawnet_arch_transmit(int force, int onecoll, int inhibit_crc, int tx_pad_di
}
/* copy the buffer and fix the source mac address. */
buffer = (uint8_t *)calloc(txlength, 1);
memcpy(buffer, txframe, txlength);
fix_outgoing_packet(buffer, txlength, interface_mac, interface_fake_mac);
memcpy(interface_buffer, txframe, txlength);
fix_outgoing_packet(interface_buffer, txlength, interface_mac, interface_fake_mac);
iov.iov_base = buffer;
iov.iov_base = interface_buffer;
iov.iov_len = txlength;
v.vm_pkt_size = txlength;
@ -378,11 +380,11 @@ void rawnet_arch_transmit(int force, int onecoll, int inhibit_crc, int tx_pad_di
fprintf(stderr, "\nrawnet_arch_transmit: %u\n", (unsigned)iov.iov_len);
rawnet_hexdump(buffer, v.vm_pkt_size);
rawnet_hexdump(interface_buffer, v.vm_pkt_size);
st = vmnet_write(interface, &v, &count);
free(buffer);
if (st != VMNET_SUCCESS) {
log_message(rawnet_arch_log, "vmnet_write failed!");
}
@ -391,8 +393,6 @@ void rawnet_arch_transmit(int force, int onecoll, int inhibit_crc, int tx_pad_di
int rawnet_arch_receive(uint8_t *pbuffer, int *plen, int *phashed, int *phash_index, int *prx_ok, int *pcorrect_mac, int *pbroadcast, int *pcrc_error) {
uint8_t *buffer;
//unsigned hashreg;
int count = 1;
int xfer;
@ -400,10 +400,7 @@ int rawnet_arch_receive(uint8_t *pbuffer, int *plen, int *phashed, int *phash_in
struct vmpktdesc v;
struct iovec iov;
buffer = (uint8_t *)calloc(interface_packet_size, 1);
iov.iov_base = buffer;
iov.iov_base = interface_buffer;
iov.iov_len = interface_packet_size;
v.vm_pkt_size = interface_packet_size;
@ -414,26 +411,24 @@ int rawnet_arch_receive(uint8_t *pbuffer, int *plen, int *phashed, int *phash_in
st = vmnet_read(interface, &v, &count);
if (st != VMNET_SUCCESS) {
log_message(rawnet_arch_log, "vmnet_write failed!");
free(buffer);
return 0;
}
if (count < 1) {
free(buffer);
return 0;
}
fix_incoming_packet(buffer, v.vm_pkt_size, interface_mac, interface_fake_mac);
fix_incoming_packet(interface_buffer, v.vm_pkt_size, interface_mac, interface_fake_mac);
// iov.iov_len is not updated with the read count, apparently.
if (!is_multicast(buffer, v.vm_pkt_size)) { /* multicast crap */
if (!is_multicast(interface_buffer, v.vm_pkt_size)) { /* multicast crap */
fprintf(stderr, "\nrawnet_arch_receive: %u\n", (unsigned)v.vm_pkt_size);
rawnet_hexdump(buffer, v.vm_pkt_size);
rawnet_hexdump(interface_buffer, v.vm_pkt_size);
}
xfer = v.vm_pkt_size;
if (xfer > *plen) xfer = *plen;
memcpy(pbuffer, buffer, xfer);
memcpy(pbuffer, interface_buffer, xfer);
xfer = v.vm_pkt_size;
if (xfer & 0x01) ++xfer; /* ??? */
@ -447,13 +442,13 @@ int rawnet_arch_receive(uint8_t *pbuffer, int *plen, int *phashed, int *phash_in
*prx_ok = 1;
#if 0
*pcorrect_mac = memcmp(buffer, interface_mac, 6) == 0;
*pbroadcast = memcmp(buffer, broadcast_mac, 6) == 0;
*pcorrect_mac = memcmp(interface_buffer, interface_mac, 6) == 0;
*pbroadcast = memcmp(interface_buffer, broadcast_mac, 6) == 0;
#endif
/* vmnet won't send promiscuous packets */
#if 0
hashreg = (~crc32_buf(buffer, 6) >> 26) & 0x3f;
hashreg = (~crc32_buf(interface_buffer, 6) >> 26) & 0x3f;
if (hash_mask[hashreg >= 32] & (1 << (hashreg & 0x1F))) {
*phashed = 1;
*phash_index = hashreg;
@ -463,7 +458,6 @@ int rawnet_arch_receive(uint8_t *pbuffer, int *plen, int *phashed, int *phash_in
}
#endif
free(buffer);
return 1;
}