mirror of https://github.com/digarok/gsplus.git
128 lines
2.6 KiB
C
128 lines
2.6 KiB
C
/*
|
|
GSPLUS - Advanced Apple IIGS Emulator Environment
|
|
Based on the KEGS emulator written by Kent Dickey
|
|
See COPYRIGHT.txt for Copyright information
|
|
See LICENSE.txt for license (GPL v2)
|
|
*/
|
|
|
|
/** This module implements queues for storing and transferring packets within the bridge. **/
|
|
|
|
#include "../defc.h"
|
|
#include "atalk.h"
|
|
#include "port.h"
|
|
|
|
void port_init(struct packet_port_t* port)
|
|
{
|
|
if (port)
|
|
{
|
|
queue_init(&port->in);
|
|
queue_init(&port->out);
|
|
}
|
|
}
|
|
|
|
void port_shutdown(struct packet_port_t* port)
|
|
{
|
|
if (port)
|
|
{
|
|
queue_shutdown(&port->in);
|
|
queue_shutdown(&port->out);
|
|
}
|
|
}
|
|
|
|
void queue_init(struct packet_queue_t* queue)
|
|
{
|
|
if (queue)
|
|
{
|
|
queue->head = queue->tail = 0;
|
|
}
|
|
}
|
|
|
|
void queue_shutdown(struct packet_queue_t* queue)
|
|
{
|
|
if (queue)
|
|
{
|
|
struct packet_t* packet = dequeue(queue);
|
|
while (packet)
|
|
{
|
|
if (packet->data)
|
|
free(packet->data);
|
|
free(packet);
|
|
packet = dequeue(queue);
|
|
}
|
|
}
|
|
}
|
|
|
|
void enqueue(struct packet_queue_t* queue, struct at_addr_t dest, struct at_addr_t source, byte type, size_t size, byte data[])
|
|
{
|
|
if (!queue)
|
|
return;
|
|
|
|
struct packet_t* packet = (struct packet_t*)malloc(sizeof(struct packet_t));
|
|
packet->dest.network = dest.network;
|
|
packet->dest.node = dest.node;
|
|
packet->source.network = source.network;
|
|
packet->source.node = source.node;
|
|
packet->type = type;
|
|
packet->size = size;
|
|
packet->data = data;
|
|
enqueue_packet(queue, packet);
|
|
}
|
|
|
|
void enqueue_packet(struct packet_queue_t* queue, struct packet_t* packet)
|
|
{
|
|
packet->next = 0;
|
|
|
|
if (queue->tail)
|
|
queue->tail->next = packet;
|
|
else
|
|
queue->head = packet;
|
|
queue->tail = packet;
|
|
}
|
|
|
|
void insert(struct packet_queue_t* queue, struct at_addr_t dest, struct at_addr_t source, byte type, size_t size, byte data[])
|
|
{
|
|
if (!queue)
|
|
return;
|
|
|
|
struct packet_t* packet = (struct packet_t*)malloc(sizeof(struct packet_t));
|
|
packet->dest.network = dest.network;
|
|
packet->dest.node = dest.node;
|
|
packet->source.network = source.network;
|
|
packet->source.node = source.node;
|
|
packet->type = type;
|
|
packet->size = size;
|
|
packet->data = data;
|
|
insert_packet(queue, packet);
|
|
}
|
|
|
|
void insert_packet(struct packet_queue_t* queue, struct packet_t* packet)
|
|
{
|
|
packet->next = queue->head;
|
|
queue->head = packet;
|
|
if (!queue->tail)
|
|
queue->tail = queue->head;
|
|
}
|
|
|
|
struct packet_t* dequeue(struct packet_queue_t* queue)
|
|
{
|
|
if (queue && queue->head)
|
|
{
|
|
struct packet_t* packet = queue->head;
|
|
if (queue->tail == queue->head)
|
|
queue->tail = queue->head = 0;
|
|
else
|
|
queue->head = packet->next;
|
|
return packet;
|
|
}
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
struct packet_t* queue_peek(struct packet_queue_t* queue)
|
|
{
|
|
if (queue)
|
|
return queue->head;
|
|
else
|
|
return 0;
|
|
}
|