-
Notifications
You must be signed in to change notification settings - Fork 10
Expand file tree
/
Copy pathkernel-atm-vbr.patch
More file actions
154 lines (148 loc) · 5.88 KB
/
kernel-atm-vbr.patch
File metadata and controls
154 lines (148 loc) · 5.88 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
152
153
154
diff -urN linux-5.9/net.org/atm/common.c linux-5.9/net/atm/common.c
--- linux-5.9/net.org/atm/common.c 2020-10-11 23:15:50.000000000 +0200
+++ linux-5.9/net/atm/common.c 2020-11-03 13:27:25.545142305 +0100
@@ -756,6 +756,43 @@
vcc = ATM_SD(sock);
switch (optname) {
+ case SO_ATMQOS_COMPAT:
+ {
+ struct atm_qos_compat qos_compat;
+ struct atm_qos qos;
+
+ if (copy_from_sockptr(&qos_compat,optval,sizeof(qos_compat)))
+ return -EFAULT;
+
+ /* convert old atm_qos to new atm_qos */
+ qos.aal = qos_compat.aal;
+ qos.rxtp.traffic_class = qos_compat.rxtp.traffic_class;
+ qos.rxtp.max_pcr = qos_compat.rxtp.max_pcr;
+ qos.rxtp.pcr = qos_compat.rxtp.pcr;
+ qos.rxtp.min_pcr = qos_compat.rxtp.min_pcr;
+ qos.rxtp.max_cdv = qos_compat.rxtp.max_cdv;
+ qos.rxtp.max_sdu = qos_compat.rxtp.max_sdu;
+ qos.rxtp.scr = 0;
+ qos.rxtp.mbs = 0;
+ qos.txtp.traffic_class = qos_compat.txtp.traffic_class;
+ qos.txtp.max_pcr = qos_compat.txtp.max_pcr;
+ qos.txtp.pcr = qos_compat.txtp.pcr;
+ qos.txtp.min_pcr = qos_compat.txtp.min_pcr;
+ qos.txtp.max_cdv = qos_compat.txtp.max_cdv;
+ qos.txtp.max_sdu = qos_compat.txtp.max_sdu;
+ qos.txtp.scr = 0;
+ qos.txtp.mbs = 0;
+
+ error = check_qos(&qos);
+ if (error) return error;
+ if (sock->state == SS_CONNECTED)
+ return atm_change_qos(vcc,&qos);
+ if (sock->state != SS_UNCONNECTED)
+ return -EBADFD;
+ vcc->qos = qos;
+ set_bit(ATM_VF_HASQOS,&vcc->flags);
+ return 0;
+ }
case SO_ATMQOS:
{
struct atm_qos qos;
@@ -799,6 +836,31 @@
vcc = ATM_SD(sock);
switch (optname) {
+ case SO_ATMQOS_COMPAT:
+ {
+ struct atm_qos_compat qos_compat;
+
+ if (!test_bit(ATM_VF_HASQOS,&vcc->flags))
+ return -EINVAL;
+
+ /* convert new atm_qos to old atm_qos */
+ qos_compat.aal = vcc->qos.aal;
+ qos_compat.rxtp.traffic_class = vcc->qos.rxtp.traffic_class;
+ qos_compat.rxtp.max_pcr = vcc->qos.rxtp.max_pcr;
+ qos_compat.rxtp.pcr = vcc->qos.rxtp.pcr;
+ qos_compat.rxtp.min_pcr = vcc->qos.rxtp.min_pcr;
+ qos_compat.rxtp.max_cdv = vcc->qos.rxtp.max_cdv;
+ qos_compat.rxtp.max_sdu = vcc->qos.rxtp.max_sdu;
+ qos_compat.txtp.traffic_class = vcc->qos.txtp.traffic_class;
+ qos_compat.txtp.max_pcr = vcc->qos.txtp.max_pcr;
+ qos_compat.txtp.pcr = vcc->qos.txtp.pcr;
+ qos_compat.txtp.min_pcr = vcc->qos.txtp.min_pcr;
+ qos_compat.txtp.max_cdv = vcc->qos.txtp.max_cdv;
+ qos_compat.txtp.max_sdu = vcc->qos.txtp.max_sdu;
+
+ return copy_to_user(optval,&qos_compat,sizeof(qos_compat)) ?
+ -EFAULT : 0;
+ }
case SO_ATMQOS:
if (!test_bit(ATM_VF_HASQOS, &vcc->flags))
return -EINVAL;
diff -urN linux-5.9/include.org/uapi/linux/atm.h linux-5.9/include/uapi/linux/atm.h
--- linux-5.9/include.org/uapi/linux/atm.h 2020-10-11 23:15:50.000000000 +0200
+++ linux-5.9/include/uapi/linux/atm.h 2020-11-03 13:27:25.545142305 +0100
@@ -71,7 +71,7 @@
/* connection identifier range; socket must be
bound or connected */
#define SO_ATMQOS __SO_ENCODE(SOL_ATM,2,struct atm_qos)
- /* Quality of Service setting */
+ /* Quality of Service setting (with vbr support) */
#define SO_ATMSAP __SO_ENCODE(SOL_ATM,3,struct atm_sap)
/* Service Access Point */
#define SO_ATMPVC __SO_ENCODE(SOL_ATM,4,struct sockaddr_atmpvc)
@@ -127,9 +127,11 @@
#define ATM_NONE 0 /* no traffic */
#define ATM_UBR 1
#define ATM_CBR 2
-#define ATM_VBR 3
+#define ATM_VBR_NRT 3
+#define ATM_VBR ATM_VBR_NRT /* for backward compatibility */
#define ATM_ABR 4
#define ATM_ANYCLASS 5 /* compatible with everything */
+#define ATM_VBR_RT 6
#define ATM_MAX_PCR -1 /* maximum available PCR */
@@ -140,6 +142,11 @@
int min_pcr; /* minimum PCR in cells per second */
int max_cdv; /* maximum CDV in microseconds */
int max_sdu; /* maximum SDU in bytes */
+
+ /* extra params for VBR */
+ int scr; /* sustained rate in cells per second */
+ int mbs; /* maximum burst size (MBS) in cells */
+
/* extra params for ABR */
unsigned int icr; /* Initial Cell Rate (24-bit) */
unsigned int tbe; /* Transient Buffer Exposure (24-bit) */
@@ -239,4 +246,37 @@
typedef unsigned short atm_backend_t;
+struct atm_trafprm_compat {
+ unsigned char traffic_class; /* traffic class (ATM_UBR, ...) */
+ int max_pcr; /* maximum PCR in cells per second */
+ int pcr; /* desired PCR in cells per second */
+ int min_pcr; /* minimum PCR in cells per second */
+ int max_cdv; /* maximum CDV in microseconds */
+ int max_sdu; /* maximum SDU in bytes */
+ /* extra params for ABR */
+ unsigned int icr; /* Initial Cell Rate (24-bit) */
+ unsigned int tbe; /* Transient Buffer Exposure (24-bit) */
+ unsigned int frtt : 24; /* Fixed Round Trip Time (24-bit) */
+ unsigned int rif : 4; /* Rate Increment Factor (4-bit) */
+ unsigned int rdf : 4; /* Rate Decrease Factor (4-bit) */
+ unsigned int nrm_pres :1; /* nrm present bit */
+ unsigned int trm_pres :1; /* rm present bit */
+ unsigned int adtf_pres :1; /* adtf present bit */
+ unsigned int cdf_pres :1; /* cdf present bit*/
+ unsigned int nrm :3; /* Max # of Cells for each forward RM cell (3-bit) */
+ unsigned int trm :3; /* Time between forward RM cells (3-bit) */
+ unsigned int adtf :10; /* ACR Decrease Time Factor (10-bit) */
+ unsigned int cdf :3; /* Cutoff Decrease Factor (3-bit) */
+ unsigned int spare :9; /* spare bits */
+};
+
+struct atm_qos_compat {
+ struct atm_trafprm_compat txtp; /* parameters in TX direction */
+ struct atm_trafprm_compat rxtp __ATM_API_ALIGN;
+ /* parameters in RX direction */
+ unsigned char aal __ATM_API_ALIGN;
+};
+
+#define SO_ATMQOS_COMPAT __SO_ENCODE(SOL_ATM,2,struct atm_qos_compat)
+ /* Quality of Service setting (no vbr support) */
#endif /* _UAPI_LINUX_ATM_H */