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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
|
#ifndef RTL865X_OUTPUTQUEUE_H
#define RTL865X_OUTPUTQUEUE_H
#include <linux/if.h>
#if !defined(CONFIG_RTL_LAYERED_ASIC_DRIVER)
#define RTL865XC_MNQUEUE_OUTPUTQUEUE 1
#define RTL865XC_QOS_OUTPUTQUEUE 1
typedef struct rtl865xC_outputQueuePara_s {
uint32 ifg; /* default: Bandwidth Control Include/exclude Preamble & IFG */
uint32 gap; /* default: Per Queue Physical Length Gap = 20 */
uint32 drop; /* default: Descriptor Run Out Threshold = 500 */
uint32 systemSBFCOFF; /*System shared buffer flow control turn off threshold*/
uint32 systemSBFCON; /*System shared buffer flow control turn on threshold*/
uint32 systemFCOFF; /* system flow control turn off threshold */
uint32 systemFCON; /* system flow control turn on threshold */
uint32 portFCOFF; /* port base flow control turn off threshold */
uint32 portFCON; /* port base flow control turn on threshold */
uint32 queueDescFCOFF; /* Queue-Descriptor=Based Flow Control turn off Threshold */
uint32 queueDescFCON; /* Queue-Descriptor=Based Flow Control turn on Threshold */
uint32 queuePktFCOFF; /* Queue-Packet=Based Flow Control turn off Threshold */
uint32 queuePktFCON; /* Queue-Packet=Based Flow Control turn on Threshold */
} rtl865xC_outputQueuePara_t;
#endif
#define MAX_QOS_RULE_NUM 10
#define MAX_MARK_NUM_PER_DEV 5 // Note: not include the default mark(0) and should be <= (hw queue number - 1(for default))
#define IPPROTO_ANY 256
#define IPPROTO_BOTH 257
#define QOS_DEF_QUEUE 0x4
#define QOS_VALID_MASK 0x2
#define QOS_TYPE_MASK 0x1
#define QOS_TYPE_STR 0x0 /*0x0|QOS_VALID_MASK*/
#define QOS_TYPE_WFQ 0x1 /*0x1|QOS_VALID_MASK*/
#define EGRESS_BANDWIDTH_GRANULARITY 0x10000 /* 64*1024 */
#define EGRESS_BANDWIDTH_GRANULARITY_BITMASK 0xffff
#define EGRESS_BANDWIDTH_GRANULARITY_BITLEN 16
#define INGRESS_BANDWIDTH_GRANULARITY_BITLEN 14
#define EGRESS_WFQ_MAX_RATIO 0x80
#if 0
#define QOS_DEBUGP printk
#else
#define QOS_DEBUGP(format, args...)
#endif
#if 0
#define QOS_RULE_DEBUGP printk
#else
#define QOS_RULE_DEBUGP(format, args...)
#endif
/* priority decision array index */
enum PriDecIdx
{
PORT_BASE = 0,
D1P_BASE,
DSCP_BASE,
ACL_BASE,
NAT_BASE,
PRI_TYPE_NUM,
};
typedef unsigned int bwu;
typedef struct {
/* classify */
unsigned int protocol;
ipaddr_t local_ip_start;
ipaddr_t local_ip_end;
ipaddr_t remote_ip_start;
ipaddr_t remote_ip_end;
unsigned short lo_port_start;
unsigned short lo_port_end;
unsigned short re_port_start;
unsigned short re_port_end;
/* tc */
uint32 mark;
unsigned char prio;
unsigned char rate;
} rtl865x_qos_entry_t, *rtl865x_qos_entry_p;
typedef struct {
uint8 dscpRemark;
uint8 vlanPriRemark;
uint16 flags;
char ifname[IFNAMSIZ];
uint32 queueId; /* identify outputQueue */
uint32 handle;
bwu ceil;
bwu burst;
bwu bandwidth; /* average bandwidth, unit kbps */
} rtl865x_qos_t, *rtl865x_qos_p;
typedef rtl865x_qos_entry_t QOS_T;
typedef rtl865x_qos_entry_p QOS_Tp;
typedef struct _rtl865x_qos_rule_t{
char inIfname[IFNAMSIZ];
char outIfname[IFNAMSIZ];
rtl865x_AclRule_t *rule;
uint32 mark;
uint32 handle;
struct _rtl865x_qos_rule_t *next;
} rtl865x_qos_rule_t, *rtl865x_qos_rule_p;
typedef struct {
uint32 mark; /* mark==0 means entry not used */
uint32 priority;
} rtl_qos_mark_info_t, *rtl_qos_mark_info_p;
int32 rtl865x_qosSetBandwidth(uint8 *netIfName, uint32 bps);
int32 rtl865x_qosFlushBandwidth(uint8 *netIfName);
int32 rtl865x_qosGetPriorityByHandle(uint8 *priority, uint32 handle);
int32 rtl865x_qosProcessQueue(uint8 *netIfName, rtl865x_qos_t *qosInfo);
int32 rtl865x_setRule2HandleMapping(uint32 ifIdx, uint32 idx, uint32 handle);
int32 rtl865x_qosAddMarkRule(rtl865x_qos_rule_t *rule);
int32 rtl865x_qosFlushMarkRule(void);
int32 rtl865x_qosCheckNaptPriority(rtl865x_AclRule_t *qosRule);
int32 rtl865x_closeQos(uint8 *netIfName);
int32 rtl865x_registerQosCompFunc(int8 (*p_cmpFunc)(rtl865x_qos_t *entry1, rtl865x_qos_t *entry2));
int __init rtl865x_initOutputQueue(uint8 **netIfName);
void __exit rtl865x_exitOutputQueue(void);
int32 rtl865x_qosArrangeRuleByNetif(void);
#if defined(CONFIG_RTL_PROC_DEBUG)
int32 rtl865x_show_allQosAcl(void);
#endif
extern int32 rtl865x_qosArrangeRuleByNetif(void);
int32 rtl_qosGetPriorityByMark(uint8 *netIfName, int32 mark);
int32 rtl_qosGetPriorityByVid(int32 vid, int32 mark);
int32 rtl_qosSetPriorityByMark(uint8 *netIfName, int32 mark, int32 handler, int32 enable);
extern u8 netIfNameArray[NETIF_NUMBER][IFNAMSIZ];
extern rtl865x_qos_rule_t *rtl865x_qosRuleHead;
#if defined(CONFIG_RTK_QOS_FOR_CABLE_MODEM)
void rtl_initQosForCableModem(void);
#endif
#if defined (CONFIG_RTL_HW_QOS_SUPPORT) && defined(CONFIG_RTL_QOS_PATCH)
#define DEF_QUEUE_NUM 1
#define MAX_QOS_PATCH_QUEUE_NUM 2
void rtl865x_reinitOutputQueuePatchForQoS(uint32 qosEnabled);
#endif
#if defined (CONFIG_RTL_HW_QOS_SUPPORT) // sync from voip customer for multiple ppp
int32 rtl865x_qosFlushMarkRuleByDev(uint8 *netIfName);
int32 rtl865x_qosRearrangeRule(void);
#endif
#endif
|