www.pudn.com > dsr-uu-0.2.rar > dsr.h


/* Copyright (C) Uppsala University
 *
 * This file is distributed under the terms of the GNU general Public
 * License (GPL), see the file LICENSE
 *
 * Author: Erik Nordström, 
 */
#ifndef _DSR_H
#define _DSR_H

#ifdef __KERNEL__
#include 
#include 
//#include 
#include 
#include 
#include 
#include 
#ifdef KERNEL26
#include 
#endif
#else
#include 
#include 
#include 
#include 
#include 
#endif				/* __KERNEL__ */

#include "dsr-pkt.h"
#include "timer.h"

#ifndef NO_GLOBALS

#define DSR_BROADCAST ((unsigned int) 0xffffffff)
#ifdef NS2
#define IPPROTO_DSR PT_DSR
#else
#define IPPROTO_DSR 168		/* Is this correct? */
#endif
#define IP_HDR_LEN 20
#define DSR_OPTS_MAX_SIZE 50	/* This is used to reduce the MTU of the DSR *
				 * device so that packets are not too big after
				 * adding the DSR header. A better solution
				 * should probably be found... */

enum confval {
#ifdef DEBUG
	PrintDebug,
#endif
	FlushLinkCache,
	PromiscOperation,
	BroadCastJitter,
	RouteCacheTimeout,
	SendBufferTimeout,
	SendBufferSize,
	RequestTableSize,
	RequestTableIds,
	MaxRequestRexmt,
	MaxRequestPeriod,
	RequestPeriod,
	NonpropRequestTimeout,
	RexmtBufferSize,
	MaintHoldoffTime,
	MaxMaintRexmt,
	UseNetworkLayerAck,
	TryPassiveAcks,
	PassiveAckTimeout,
	GratReplyHoldOff,
	MAX_SALVAGE_COUNT,
	CONFVAL_MAX,
};

enum confval_type {
	SECONDS,
	MILLISECONDS,
	MICROSECONDS,
	NANOSECONDS,
	QUANTA,
	BINARY,
	COMMAND,
	CONFVAL_TYPE_MAX,
};

#define MAINT_BUF_MAX_LEN 100
#define RREQ_TBL_MAX_LEN 64	/* Should be enough */
#define SEND_BUF_MAX_LEN 100
#define RREQ_TLB_MAX_ID 16

static struct {
	const char *name;
	const unsigned int val;
	enum confval_type type;
} confvals_def[CONFVAL_MAX] = {
#ifdef DEBUG
	{
	"PrintDebug", 0, BINARY},
#endif
	{
	"FlushLinkCache", 1, COMMAND}, {
	"PromiscOperation", 1, BINARY}, {
	"BroadCastJitter", 20, MILLISECONDS}, {
	"RouteCacheTimeout", 300, SECONDS}, {
	"SendBufferTimeout", 30, SECONDS}, {
	"SendBufferSize", SEND_BUF_MAX_LEN, QUANTA}, {
	"RequestTableSize", RREQ_TBL_MAX_LEN, QUANTA}, {
	"RequestTableIds", RREQ_TLB_MAX_ID, QUANTA}, {
	"MaxRequestRexmt", 16, QUANTA}, {
	"MaxRequestPeriod", 10, SECONDS}, {
	"RequestPeriod", 500, MILLISECONDS}, {
	"NonpropRequestTimeout", 30, MILLISECONDS}, {
	"RexmtBufferSize", MAINT_BUF_MAX_LEN}, {
	"MaintHoldoffTime", 250, MILLISECONDS}, {
	"MaxMaintRexmt", 2, QUANTA}, {
	"UseNetworkLayerAck", 1, BINARY}, {
	"TryPassiveAcks", 1, QUANTA}, {
	"PassiveAckTimeout", 100, MILLISECONDS}, {
	"GratReplyHoldOff", 1, SECONDS}, {
	"MAX_SALVAGE_COUNT", 15, QUANTA}
};

struct dsr_node {
	struct in_addr ifaddr;
	struct in_addr bcaddr;
	unsigned int confvals[CONFVAL_MAX];
#ifdef __KERNEL__
	char slave_ifname[IFNAMSIZ];
	struct net_device *slave_dev;
	struct in_device *slave_indev;
	struct net_device_stats stats;
	spinlock_t lock;
#endif
};

#ifdef __KERNEL__
#define DSR_SPIN_LOCK(l)    spin_lock(l)
#define DSR_SPIN_UNLOCK(l)  spin_unlock(l)
#define MALLOC(s, p)        kmalloc(s, p)
#define FREE(p)             kfree(p)
#define NSCLASS
#define XMIT(pkt)           dsr_dev_xmit(pkt)
#else
#define DSR_SPIN_LOCK(l)
#define DSR_SPIN_UNLOCK(l)
#endif				/* __KERNEL__ */

#ifdef __KERNEL__

#define ConfVal(cv) (get_confval(cv))
#define ConfValToUsecs(cv) (confval_to_usecs(cv))

extern struct dsr_node *dsr_node;

static inline unsigned int get_confval(enum confval cv)
{
	unsigned int val = 0;

	if (dsr_node) {
		DSR_SPIN_LOCK(&dsr_node->lock);
		val = dsr_node->confvals[cv];
		DSR_SPIN_UNLOCK(&dsr_node->lock);
	}
	return val;
}

static inline int set_confval(enum confval cv, unsigned int val)
{
	if (dsr_node) {
		DSR_SPIN_LOCK(&dsr_node->lock);
		dsr_node->confvals[cv] = val;
		DSR_SPIN_UNLOCK(&dsr_node->lock);
	} else
		return -1;

	return val;
}

static inline void dsr_node_init(struct dsr_node *dn, char *ifname)
{
	int i;
	dn->slave_indev = NULL;
	dn->slave_dev = NULL;
	memcpy(dn->slave_ifname, ifname, IFNAMSIZ);
	
	spin_lock_init(&dn->lock);

	for (i = 0; i < CONFVAL_MAX; i++) {
		dn->confvals[i] = confvals_def[i].val;
	}
}

static inline struct in_addr my_addr(void)
{
	static struct in_addr my_addr;
	if (dsr_node) {
		DSR_SPIN_LOCK(&dsr_node->lock);
		my_addr = dsr_node->ifaddr;
		DSR_SPIN_UNLOCK(&dsr_node->lock);
	}
	return my_addr;
}

static inline unsigned long time_add_msec(unsigned long msecs)
{
	struct timespec t;

	t.tv_sec = msecs / 1000;
	t.tv_nsec = (msecs * 1000000) % 1000000000;

	return timespec_to_jiffies(&t);
}

static inline int get_slave_dev_ifindex(void)
{
	int ifindex = -1;

	if (dsr_node) {
		DSR_SPIN_LOCK(&dsr_node->lock);
		if (dsr_node->slave_dev)
			ifindex = dsr_node->slave_dev->ifindex;
		DSR_SPIN_UNLOCK(&dsr_node->lock);
	}
	return ifindex;
}

static inline void dsr_node_lock(struct dsr_node *dnode)
{
	spin_lock(&dnode->lock);
}

static inline void dsr_node_unlock(struct dsr_node *dnode)
{
	spin_unlock(&dnode->lock);
}
int dsr_ip_recv(struct sk_buff *skb);
int do_mackill(char *mac);

#endif

#endif				/* NO_GLOBALS */

#ifndef NO_DECLS

static inline usecs_t confval_to_usecs(enum confval cv)
{
	usecs_t usecs = 0;
	unsigned int val;

	val = ConfVal(cv);

	switch (confvals_def[cv].type) {
	case SECONDS:
		usecs = val * 1000000;
		break;
	case MILLISECONDS:
		usecs = val * 1000;
		break;
	case MICROSECONDS:
		usecs = val;
		break;
	case NANOSECONDS:
		usecs = val / 1000;
		break;
	case BINARY:
	case QUANTA:
	case COMMAND:
	case CONFVAL_TYPE_MAX:
		break;
	}

	return usecs;
}

#endif				/* NO_DECLS */

#endif				/* _DSR_H */