diff --git a/src/tests/kits/net/new_stack/loopback/loopback.c b/src/tests/kits/net/new_stack/loopback/loopback.c index af5d2e1841..15879b0b5b 100644 --- a/src/tests/kits/net/new_stack/loopback/loopback.c +++ b/src/tests/kits/net/new_stack/loopback/loopback.c @@ -7,6 +7,15 @@ #include "net_stack.h" #include "net_interface.h" +#define LOOPBACK_MTU 16384 // can be as large as we want + + +typedef struct loopback_interface { + ifnet_t ifnet; + net_data_queue *queue; +} loopback_interface; + + status_t std_ops(int32 op, ...); struct net_interface_module_info nimi; @@ -16,24 +25,34 @@ struct net_stack_module_info *g_stack = NULL; status_t init(void * params) { ifnet_t * iface; + loopback_interface *li; - iface = (ifnet_t *) malloc(sizeof(*iface)); - if (!iface) - return B_ERROR; - - iface->if_name = "loopback"; - iface->if_flags = 0; - iface->module = &nimi; - - g_stack->register_interface(iface); + li = (loopback_interface *) malloc(sizeof(*li)); + if (!li) + return B_NO_MEMORY; - return B_OK; + // create loopback fifo queue, to keep packets *sent* + li->queue = g_stack->new_data_queue(64*LOOPBACK_MTU); + + + iface = &li->ifnet; + iface->if_name = "loopback"; + iface->if_flags = (IFF_LOOPBACK | IFF_MULTICAST); + iface->if_type = 0x10; //IFT_LOOP + iface->if_mtu = LOOPBACK_MTU; + + // never forget to store a pointer to us, otherwise datalink layer can't call us + iface->module = &nimi; + + return g_stack->register_interface(iface); } status_t uninit(ifnet_t *iface) { + loopback_interface *li = (loopback_interface *) iface; + printf("loopback: uniniting %s interface\n", iface->if_name); - return B_OK; + return g_stack->delete_data_queue(li->queue); } status_t up(ifnet_t *iface) @@ -50,17 +69,22 @@ status_t down(ifnet_t *iface) status_t send(ifnet_t *iface, net_data *data) { + loopback_interface *li = (loopback_interface *) iface; + if (!data) return B_ERROR; - - return B_OK; + + return g_stack->enqueue_data(li->queue, data); } status_t receive(ifnet_t *iface, net_data **data) { - return B_ERROR; + loopback_interface *li = (loopback_interface *) iface; + + return g_stack->dequeue_data(li->queue, data, B_INFINITE_TIMEOUT, false); } + status_t control(ifnet_t *iface, int opcode, void *arg) { return -1; }