Make loopback interface less... useless!
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@3271 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -7,6 +7,15 @@
|
|||||||
#include "net_stack.h"
|
#include "net_stack.h"
|
||||||
#include "net_interface.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, ...);
|
status_t std_ops(int32 op, ...);
|
||||||
|
|
||||||
struct net_interface_module_info nimi;
|
struct net_interface_module_info nimi;
|
||||||
@@ -16,24 +25,34 @@ struct net_stack_module_info *g_stack = NULL;
|
|||||||
status_t init(void * params)
|
status_t init(void * params)
|
||||||
{
|
{
|
||||||
ifnet_t * iface;
|
ifnet_t * iface;
|
||||||
|
loopback_interface *li;
|
||||||
|
|
||||||
iface = (ifnet_t *) malloc(sizeof(*iface));
|
li = (loopback_interface *) malloc(sizeof(*li));
|
||||||
if (!iface)
|
if (!li)
|
||||||
return B_ERROR;
|
return B_NO_MEMORY;
|
||||||
|
|
||||||
iface->if_name = "loopback";
|
|
||||||
iface->if_flags = 0;
|
|
||||||
iface->module = &nimi;
|
|
||||||
|
|
||||||
g_stack->register_interface(iface);
|
|
||||||
|
|
||||||
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)
|
status_t uninit(ifnet_t *iface)
|
||||||
{
|
{
|
||||||
|
loopback_interface *li = (loopback_interface *) iface;
|
||||||
|
|
||||||
printf("loopback: uniniting %s interface\n", iface->if_name);
|
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)
|
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)
|
status_t send(ifnet_t *iface, net_data *data)
|
||||||
{
|
{
|
||||||
|
loopback_interface *li = (loopback_interface *) iface;
|
||||||
|
|
||||||
if (!data)
|
if (!data)
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
|
|
||||||
return B_OK;
|
return g_stack->enqueue_data(li->queue, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t receive(ifnet_t *iface, net_data **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; }
|
status_t control(ifnet_t *iface, int opcode, void *arg) { return -1; }
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user