summaryrefslogtreecommitdiff
path: root/include/internal/vdev_define.h
blob: abf131c28260189ad45ee22902673fdc22d30b78 (plain)
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
#pragma once

#include <common.h>
#include <netinet/in.h>
#include <rte_ether.h>
#include <vnode.h>

struct vdev_main;

enum vd_type
{
    /* 数据型设备 */
    VD_TYPE_DATA = 0,
    /* 资源池型 */
    VD_TYPE_POOL = 1,
    /* 最大值 */
    VD_TYPE_MAX
};

enum link_status
{
    LINK_DOWN = 0,
    LINK_UP
};

enum vdev_in_use
{
    VDEV_NOT_IN_USE = 0,
    VDEV_IN_USE
};

struct vdev_stat_info
{
    unsigned int nr_rxstream;
    unsigned int nr_txstream;

    /* RX: from service to app */
    uint64_t rx_on_line[MR_SID_MAX];
    uint64_t rx_deliver[MR_SID_MAX];
    uint64_t rx_missed[MR_SID_MAX];
    uint64_t rx_total_len[MR_SID_MAX];

    /* TX: from app to service */
    uint64_t tx_on_line[MR_SID_MAX];
    uint64_t tx_deliver[MR_SID_MAX];
    uint64_t tx_missed[MR_SID_MAX];
    uint64_t tx_total_len[MR_SID_MAX];

    /* FTX: fast tunnel from app to serivce */
    uint64_t ftx_on_line[MR_SID_MAX];
    uint64_t ftx_deliver[MR_SID_MAX];
    uint64_t ftx_missed[MR_SID_MAX];
    uint64_t ftx_total_len[MR_SID_MAX];

    /* LTX: ctrl tunnel from app to service */
    uint64_t ltx_on_line[MR_SID_MAX];
    uint64_t ltx_deliver[MR_SID_MAX];
    uint64_t ltx_missed[MR_SID_MAX];
    uint64_t ltx_total_len[MR_SID_MAX];

#if 0
    /* NOTIFY */
    uint64_t notify_state_waiting[MR_SID_MAX];
    uint64_t notify_state_running[MR_SID_MAX];
    uint64_t notify_state_ready[MR_SID_MAX];
#endif

    /* Batch Size */
    uint64_t batch_size_total[MR_SID_MAX];
    uint64_t batch_size_count[MR_SID_MAX];

    /* Queue Len */
    float rx_q_len_max[MR_SID_MAX];
    float rx_q_len_avg_max[MR_SID_MAX];
};

/* 虚拟设备信息 */
struct vdev
{
    /* 虚拟设备名称 */
    char symbol[MR_SYMBOL_MAX];
    /* 虚拟设备编号 */
    port_id_t port_id;
    /* 虚拟设备类型 */
    enum vd_type vd_type;
    /* 虚拟设备MAC地址 */
    struct rte_ether_addr ether_addr;
    /* MTU */
    unsigned int mtu;
    /* 虚拟设备IP地址 */
    struct in_addr in_addr;
    /* 虚拟设备子网掩码 */
    struct in_addr in_mask;
    /* 虚拟设备网关 */
    struct in_addr in_gateway;

    /* 是否启用 */
    unsigned int enable;
    /* 网卡状态 */
    uint8_t link_status;
    /* Device usage status */
    uint8_t in_use;

    /* representor config */
    struct
    {
        unsigned int enable;
        unsigned int redirect_local_arp;
        unsigned int redirect_local_rarp;
        unsigned int redirect_local_lldp;
        unsigned int redirect_local_ipv4;
        unsigned int redirect_local_ipv6;
    } representor_config;
};

/* 虚拟设备句柄,应用使用 */
struct vdev_instance
{
    /* 对应的虚设备信息 */
    struct vdev * vdev;

    /* 队列数 */
    unsigned int nr_rxstream;
    unsigned int nr_txstream;

    /* VNODE CONS/PROD */
    struct vnode_cons * vnode_rx_cons;
    struct vnode_prod * vnode_tx_prod;
    struct vnode_prod * vnode_ftx_prod;

    /* CONS NOTIFY DESCS */
    struct vnode_cons_notify * vnode_rx_cons_notify;

    /* 内存池:临时使用 */
    struct rte_mempool * direct_pool;
    struct rte_mempool * indirect_pool;

    /* 统计信息暂存,用于统计速度 */
    struct vdev_stat_info stat_info_last;
    TAILQ_ENTRY(vdev_instance) next;
};