-
Notifications
You must be signed in to change notification settings - Fork 134
/
Copy pathnetif.h
134 lines (114 loc) · 3.35 KB
/
netif.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#ifndef __NETIF_H
#define __NETIF_H
#define NETDEV_ALEN 6
#define NETDEV_NLEN 16 /* IFNAMSIZ */
#include "compile.h"
#include "list.h"
//#include "sock.h"
struct pkbuf;
struct netdev;
struct netstats {
unsigned int rx_packets;
unsigned int tx_packets;
unsigned int rx_errors;
unsigned int tx_errors;
unsigned int rx_bytes;
unsigned int tx_bytes;
};
struct netdev_ops {
int (*xmit)(struct netdev *, struct pkbuf *);
int (*init)(struct netdev *);
void (*exit)(struct netdev *);
};
/* network interface device */
struct netdev {
/* tap device information */
int net_mtu;
unsigned int net_ipaddr; /* dev binding ip address */
unsigned int net_mask; /* netmask */
unsigned char net_hwaddr[NETDEV_ALEN]; /* hardware address */
unsigned char net_name[NETDEV_NLEN]; /* device name */
struct netdev_ops *net_ops; /* Nic Operation */
struct netstats net_stats; /* protocol independent statistic */
struct list_head net_list; /* net device list */
};
#define LOCALNET(dev) ((dev)->net_ipaddr & (dev)->net_mask)
/* tap device */
struct tapdev {
struct netdev dev;
int fd;
};
/* packet buf */
struct pkbuf {
struct list_head pk_list; /* for ip fragment or arp waiting list */
unsigned short pk_pro; /* ethernet packet type ID */
unsigned short pk_type; /* packet hardware address type */
int pk_len;
int pk_refcnt;
struct netdev *pk_indev;
struct rtentry *pk_rtdst;
struct sock *pk_sk;
unsigned char pk_data[0];
} __attribute__((packed));
/* packet hardware address type */
#define PKT_NONE 0
#define PKT_LOCALHOST 1
#define PKT_OTHERHOST 2
#define PKT_MULTICAST 3
#define PKT_BROADCAST 4
#define HOST_LITTLE_ENDIAN /* default: little endian machine */
#ifdef HOST_LITTLE_ENDIAN
static _inline unsigned short _htons(unsigned short host)
{
return (host >> 8) | ((host << 8) & 0xff00);
}
#define _ntohs(net) _htons(net)
static _inline unsigned int _htonl(unsigned int host)
{
return ((host & 0x000000ff) << 24) |
((host & 0x0000ff00) << 8) |
((host & 0x00ff0000) >> 8) |
((host & 0xff000000) >> 24);
}
#define _ntohl(net) _htonl(net)
#endif /* HOST_LITTLE_ENDIAN */
extern struct tapdev *tap;
extern struct netdev *veth;
extern struct netdev *loop;
extern void netdev_init(void);
extern struct netdev *netdev_alloc(char *dev, struct netdev_ops *);
extern void netdev_free(struct netdev *nd);
extern void netdev_interrupt(void);
extern void netdev_exit(void);
extern void net_in(struct netdev *dev, struct pkbuf *pkb);
extern void net_timer(void);
extern struct pkbuf *alloc_pkb(int size);
extern struct pkbuf *alloc_netdev_pkb(struct netdev *nd);
extern void pkbdbg(struct pkbuf *pkb);
extern void pkb_trim(struct pkbuf *pkb, int len);
//#define DEBUG_PKB
#ifdef DEBUG_PKB
extern void _free_pkb(struct pkbuf *pkb);
extern void _netdev_tx(struct netdev *nd, struct pkbuf *pkb, int len,
unsigned short proto, unsigned char *dst);
#define netdev_tx(nd, pkb, len, proto, dst)\
do {\
dbg("");\
_netdev_tx(nd, pkb, len, proto, dst);\
} while (0)
#define free_pkb(pkb)\
do {\
dbg("");\
_free_pkb(pkb);\
} while (0)
#else
extern void free_pkb(struct pkbuf *pkb);
extern void netdev_tx(struct netdev *nd, struct pkbuf *pkb, int len,
unsigned short proto, unsigned char *dst);
#endif
extern int free_pkbs;
extern int alloc_pkbs;
extern void get_pkb(struct pkbuf *pkb);
extern struct pkbuf *copy_pkb(struct pkbuf *pkb);
extern int local_address(unsigned int);
#endif /* netif.h */