-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathbase.h
More file actions
151 lines (126 loc) · 3.4 KB
/
base.h
File metadata and controls
151 lines (126 loc) · 3.4 KB
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#ifndef _BASE_H_
#define _BASE_H_
#include <queue.h>
#define BUFFER_SIZE 0x40000
#define MAX_DELAY 1000 /* usleep */
#define MAX_DELAY_TAP 1000
/* Timeout to Transfer */
#define MAX_TIMEOUT_TAP 30
#define MAX_TRANS_TIMEOUT 3
#ifdef CONFIG_HOST
/* Buffer full or Frame over */
#define MAX_FRAME 200
#else
/* Buffer full or Frame over */
#define MAX_FRAME 60
#endif
#define RINGBUF_CHAIN_SIZE 0x40000 // 256KB
#define RINGBUF_CHAIN_NUM 32
#define RINGBUF_SIZE (RINGBUF_CHAIN_SIZE * RINGBUF_CHAIN_NUM)
#define RINGBUF_MAGIC 0x91101688
#define H2C0_CH0 "/dev/xdma0_h2c_1"
#define C2H0_CH0 "/dev/xdma0_c2h_1"
#define WRITE_PHY_ADDR 0x3000000
#define READ_PHY_ADDR (WRITE_PHY_ADDR + RINGBUF_SIZE)
/* Loss package */
#define RETRY_MAX 10
#define ALIGN_4B(x) ((x+3)& ~3)
typedef void * xHdl;
typedef struct
{
int wFd;
int rFd;
uint32_t wPhyAddr;
uint32_t rPhyAddr;
} xdma_t;
/* virtual card node */
struct vc_node {
const char *name;
struct queue_node *queue;
/* Tun */
char tun_name[32];
int tun_fd;
char *ip;
/* Write/Read Buffer */
char *WBuf;
char *RBuf;
/* DMA */
xdma_t *Xdma;
/* RingBuffer: Write Buffer */
char *RingBuf;
long ring_index;
long ring_count;
long pos; /* point to current valid data area */
/* RingBuffer: Read Buffer */
char *RingBuf2;
long ring_index2;
long ring_count2;
long pos2; /* point to current valid data area */
#ifdef CONFIG_MSG_PARSE
int perf_fd;
int perf_fd2;
#endif
/* Thread exit */
unsigned int flags;
};
struct msg_data {
uint32_t magic;
uint32_t count;
#ifdef CONFIG_PERF
uint32_t id;
#endif
};
extern struct vc_node Defnode;
static inline struct vc_node *vc_root(void)
{
return &Defnode;
}
extern struct vc_node *vc_init(void);
extern void vc_exit(struct vc_node *vc);
/* signal */
extern void signal_init(void);
/* TUN/TAP */
extern int tun_create(char *dev, int flags, char *ip);
extern void tun_release(int fd);
/* DMA */
extern void dma_diagnose(struct vc_node *vc);
extern void *xdma_open(void);
extern void xdma_close(xHdl hdl);
extern uint8_t *align_alloc(uint32_t size);
extern int xdma_write(uint8_t *pDate, uint32_t dataLen, unsigned long offset,
xHdl hdl);
extern int xdma_read(uint8_t *pDate, uint32_t dataLen, unsigned long offset,
xHdl hdl);
extern int dma_buffer_fill(struct vc_node *vc, const char *buf, int count);
extern int dma_buffer_split(struct vc_node *vc, char *buf, int *count);
extern int dma_buffer_send(struct vc_node *vc, unsigned long *index,
unsigned long *count);
extern int dma_buffer_recv(struct vc_node *vc, unsigned long index,
unsigned long count);
extern void debug_dump_socket_frame(const char *buf, unsigned long count,
const char *msg);
extern long perf_time(void);
extern void perf_speed(long start, long end);
#ifdef CONFIG_MSG_PARSE
struct msg_context {
uint64_t id;
uint64_t time;
};
extern void msg_parse_context(const char *buf, char *msg);
extern void msg_store(struct vc_node *vc, struct msg_context *array,
int limit, int w, char *str);
#define MSG_CONTEXT_OFF 52
#define MSG_CONTEXT_LEN 16
#define MAX_INDEX 100
#define LOOP_INDEX (MAX_INDEX - 2)
#endif
static int inline dma_buffer_is_full(struct vc_node *vc, int count)
{
long safe_count = RINGBUF_CHAIN_SIZE - vc->pos -
sizeof(struct msg_data);
if (count > safe_count)
return 1;
else
return 0;
}
#endif