⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 if_vnet.h

📁 skyeye-1.0.0.rar surce code
💻 H
字号:
/*
 *  Universal Virtual Net Switch device driver.
 *  Copyright (C) 1999-2003  Chen Yu <chenyu@hpclab.cs.tsinghua.edu.cn>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 *  GNU General Public License for more details.
 *
 *  $Id: if_vnet.h,v 1.1.1.1 2005/09/14 07:32:29 chenyu Exp $
 */

#ifndef __IF_VNET_H
#define __IF_VNET_H

/* Uncomment to enable debugging */
/* #define VNET_DEBUG 1 */

#ifdef __KERNEL__

#define VNET_DEBUG
#ifdef VNET_DEBUG
#define DBG  if(1)printk
#define DBG1 if(1)printk
#else
#define DBG( a... )
#define DBG1( a... )
#endif

#define VNET_MAJOR 11
#define VNET_MINOR 201

struct vnet_struct
{
  char *name;
  unsigned long flags;
  int attached;
  uid_t owner;

  wait_queue_head_t read_wait;
  struct sk_buff_head readq;

  struct net_device dev;
  struct net_device_stats stats;

  struct fasync_struct *fasync;

#ifdef VNET_DEBUG
  int debug;
#endif
};

#ifndef MIN
#define MIN(a,b) ( (a)<(b) ? (a):(b) )
#endif

#endif /* __KERNEL__ */

/* Read queue size */
#define VNET_READQ_SIZE	10

/* VNET device flags */
#define VNET_VNET_DEV 	0x0001
#define VNET_TAP_DEV	0x0002
#define VNET_TYPE_MASK   0x000f

#define VNET_FASYNC	0x0010
#define VNET_NOCHECKSUM	0x0020
#define VNET_NO_PI	0x0040
#define VNET_ONE_QUEUE	0x0080
#define VNET_PERSIST 	0x0100

/* Ioctl defines */
#define VNETSETNOCSUM   _IOW('T', 200, int)
#define VNETSETDEBUG    _IOW('T', 201, int)
#define VNETSETIFF      _IOW('T', 202, int)
#define VNETSETPERSIST  _IOW('T', 203, int)
#define VNETSETOWNER    _IOW('T', 204, int)
#define VNETSHOWINFO    _IOW('T', 205, int)
#define VNETUNSETIFF    _IOW('T', 206, int)

/* VNETSETIFF ifr flags */
#define IFF_VNET		0x0001
#define IFF_TAP		0x0002
#define IFF_NO_PI	0x1000
#define IFF_ONE_QUEUE	0x2000


#define VNET_PKT_STRIP	0x0001
#define VNET_NUM_HUBS  		8
#define NUM_NUTS_PER_HUB 	32
#define VNET_MAX_NUT_NAME_LEN 	16
#define VNET_MAX_QLEN		128

typedef u_char uint8;
typedef u_short uint16;
typedef u_long uint32;
typedef long int32;
typedef char Bool;


#define VNET_MAC_EQ(_a, _b)         !memcmp((_a), (_b), ETH_ALEN)
#define VNET_SKB_2_DESTMAC(_skb)    (((struct ethhdr *)(_skb)->data)->h_dest)
#define VNET_SKB_2_SRCMAC(_skb)     (((struct ethhdr *)(_skb)->data)->h_source)
#define VNET_UP_AND_RUNNING(_flags) (((_flags) & (IFF_RUNNING|IFF_UP)) == (IFF_RUNNING|IFF_UP))

#define TRUE  1
#define FALSE 0

typedef enum
{
  VNET_GUESTIF_NUT,
  VNET_HOSTIF_NUT,
  VNET_HUB_NUT
} vnet_nuttype;

typedef enum
{
  VNET_HUB,
  VNET_SWITCH
} vnet_hubtype;

struct vnet_pi
{
  unsigned short flags;
  unsigned short proto;
};

#ifdef __KERNEL__

/*
 *  The net is the basic mechanism for connecting to objects
 *  that send packet between them.
 */

struct vnet_nut
{
  struct vnet_nut *peer;
  vnet_nuttype type;		//maybe guestif or hostif or hub
  int numbolts;
  char name[VNET_MAX_NUT_NAME_LEN];
  int refCount;
  Bool connected;		// could be a generic state variable if needed
  void *private;		// private field for containing object
  int index;			// private field for containing object
  struct proc_dir_entry *procEntry;	// private field for containing object
  wait_queue_head_t waitQueue;	// used to wait for other threads to release the jack

  void (*free) (struct vnet_nut * this);
  void (*rcv) (struct vnet_nut * this, struct sk_buff * skb);
    Bool (*cycleDetect) (struct vnet_nut * this, int generation);
  void (*boltsChanged) (struct vnet_nut * this);
  int (*isBridged) (struct vnet_nut * this);
};

struct vnet_bolt
{
  struct vnet_nut nut;		// must be first
  unsigned id;
  uint32 flags;
  struct vnet_bolt *next;
  uint8 paddr[ETH_ALEN];
  uint8 ladrf[8];

  int (*fileOpRead) (struct vnet_bolt * this, struct file * filp, char *buf,
		     size_t count);
  int (*fileOpWrite) (struct vnet_bolt * this, struct file * filp,
		      const char *buf, size_t count);
  int (*fileOpIoctl) (struct vnet_bolt * this, struct file * filp,
		      unsigned int iocmd, unsigned long ioarg);
  int (*fileOpSelect) (struct vnet_bolt * this, struct file * filp,
		       poll_table * wait);

};


struct vnet_hub
{
  int num;
  vnet_hubtype type;		//hub or switch                   
  struct vnet_nut nut[NUM_NUTS_PER_HUB];
  int stats[NUM_NUTS_PER_HUB];
  int totalbolts;
  int mygeneration;
};

struct vnet_guestif_stats
{
  unsigned read;
  unsigned written;
  unsigned queued;
  unsigned droppedDown;
  unsigned droppedMismatch;
  unsigned droppedOverflow;
};

struct vnet_guestif
{
  struct vnet_bolt bolt;
  struct sk_buff_head packetQueue;
  uint32 *pollPtr;
  struct page *pollPage;
  uint32 pollMask;
  uint32 clusterCount;
  wait_queue_head_t waitQueue;
  struct vnet_guestif_stats stats;
};

struct vnet_hostif
{
  struct vnet_bolt bolt;
  unsigned long flags;
  int attached;
  uid_t owner;
  wait_queue_head_t read_wait;
  struct sk_buff_head readq;
  struct net_device dev;
  //char                    devName[8];
  struct net_device_stats stats;
  struct fasync_struct *fasync;
};
#endif /*__KERNEL__*/

#endif /* __IF_VNET_H */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -