lantiq: add the current profile to the stats output
[openwrt/openwrt.git] / target / linux / lantiq / base-files / lib / functions / lantiq_dsl.sh
1 #!/bin/sh /etc/rc.common
2 # Copyright (C) 2012-2014 OpenWrt.org
3
4 if [ "$( which vdsl_cpe_control )" ]; then
5 XDSL_CTRL=vdsl_cpe_control
6 else
7 XDSL_CTRL=dsl_cpe_control
8 fi
9
10 #
11 # Basic functions to send CLI commands to the vdsl_cpe_control daemon
12 #
13 dsl_cmd() {
14 killall -0 ${XDSL_CTRL} && (
15 lock /var/lock/dsl_pipe
16 echo "$@" > /tmp/pipe/dsl_cpe0_cmd
17 cat /tmp/pipe/dsl_cpe0_ack
18 lock -u /var/lock/dsl_pipe
19 )
20 }
21 dsl_val() {
22 echo $(expr "$1" : '.*'$2'=\([-\.[:alnum:]]*\).*')
23 }
24 dsl_string() {
25 echo $(expr "$1" : '.*'$2'=(\([A-Z0-9,]*\))')
26 }
27
28 #
29 # Simple divide by 10 routine to cope with one decimal place
30 #
31 dbt() {
32 local a=$(expr $1 / 10)
33 local b=$(expr $1 % 10)
34 echo "${a}.${b}"
35 }
36 #
37 # Take a number and convert to k or meg
38 #
39 scale() {
40 local val=$1
41 local a
42 local b
43
44 if [ "$val" -gt 1000000 ]; then
45 a=$(expr $val / 1000)
46 b=$(expr $a % 1000)
47 a=$(expr $a / 1000)
48 printf "%d.%03d Mb" ${a} ${b}
49 elif [ "$val" -gt 1000 ]; then
50 a=$(expr $val / 1000)
51 printf "%d Kb" ${a}
52 else
53 echo "${val} b"
54 fi
55 }
56
57 scale_latency() {
58 local val=$1
59 local a
60 local b
61
62 a=$(expr $val / 100)
63 b=$(expr $val % 100)
64 printf "%d.%d ms" ${a} ${b}
65 }
66
67 #
68 # Read the data rates for both directions
69 #
70 data_rates() {
71 local csg
72 local dru
73 local drd
74 local sdru
75 local sdrd
76
77 csg=$(dsl_cmd g997csg 0 1)
78 drd=$(dsl_val "$csg" ActualDataRate)
79
80 csg=$(dsl_cmd g997csg 0 0)
81 dru=$(dsl_val "$csg" ActualDataRate)
82
83 [ -z "$drd" ] && drd=0
84 [ -z "$dru" ] && dru=0
85
86 sdrd=$(scale $drd)
87 sdru=$(scale $dru)
88
89 if [ "$action" = "lucistat" ]; then
90 echo "dsl.data_rate_down=$drd"
91 echo "dsl.data_rate_up=$dru"
92 echo "dsl.data_rate_down_s=\"$sdrd\""
93 echo "dsl.data_rate_up_s=\"$sdru\""
94 else
95 echo "Data Rate: Down: ${sdrd}/s / Up: ${sdru}/s"
96 fi
97 }
98
99 #
100 # Chipset
101 #
102 chipset() {
103 local vig
104 local cs
105 local csv
106
107 vig=$(dsl_cmd vig)
108 cs=$(dsl_val "$vig" DSL_ChipSetType)
109 csv=$(dsl_val "$vig" DSL_ChipSetHWVersion)
110 csfw=$(dsl_val "$vig" DSL_ChipSetFWVersion)
111 csapi=$(dsl_val "$vig" DSL_DriverVersionApi)
112
113 if [ "$action" = "lucistat" ]; then
114 echo "dsl.chipset=\"${cs} ${csv}\""
115 echo "dsl.firmware_version=\"${csfw}\""
116 echo "dsl.api_version=\"${csapi}\""
117 else
118 echo "Chipset: ${cs} ${csv}"
119 echo "Firmware Version: ${csfw}"
120 echo "API Version: ${csapi}"
121 fi
122 }
123
124 #
125 # Vendor information
126 #
127 vendor() {
128 local lig
129 local vid
130 local svid
131
132 lig=$(dsl_cmd g997lig 1)
133 vid=$(dsl_string "$lig" G994VendorID)
134 svid=$(dsl_string "$lig" SystemVendorID)
135
136 if [ "$action" = "lucistat" ]; then
137 echo "dsl.atuc_vendor_id=\"${vid}\""
138 echo "dsl.atuc_system_vendor_id=\"${svid}\""
139 else
140 echo "ATU-C Vendor ID: ${vid}"
141 echo "ATU-C System Vendor ID: ${svid}"
142 fi
143 }
144
145 #
146 # XTSE capabilities
147 #
148 xtse() {
149 local xtusesg
150 local xtse1
151 local xtse2
152 local xtse3
153 local xtse4
154 local xtse5
155 local xtse6
156 local xtse7
157 local xtse8
158
159 local xtse_s=""
160
161 local annex_s=""
162 local line_mode_s=""
163 local vector_s=""
164
165 local dsmsg=""
166 local cmd=""
167
168 xtusesg=$(dsl_cmd g997xtusesg)
169 xtse1=$(dsl_val "$xtusesg" XTSE1)
170 xtse2=$(dsl_val "$xtusesg" XTSE2)
171 xtse3=$(dsl_val "$xtusesg" XTSE3)
172 xtse4=$(dsl_val "$xtusesg" XTSE4)
173 xtse5=$(dsl_val "$xtusesg" XTSE5)
174 xtse6=$(dsl_val "$xtusesg" XTSE6)
175 xtse7=$(dsl_val "$xtusesg" XTSE7)
176 xtse8=$(dsl_val "$xtusesg" XTSE8)
177
178 # Evaluate Annex (according to G.997.1, 7.3.1.1.1)
179 if [ $((xtse1 & 13)) != 0 \
180 -o $((xtse2 & 1)) != 0 \
181 -o $((xtse3 & 12)) != 0 \
182 -o $((xtse4 & 3)) != 0 \
183 -o $((xtse6 & 3)) != 0 \
184 -o $((xtse8 & 1)) != 0 ]; then
185 annex_s=" A,"
186 fi
187
188 if [ $((xtse1 & 48)) != 0 \
189 -o $((xtse2 & 2)) != 0 \
190 -o $((xtse3 & 48)) != 0 \
191 -o $((xtse6 & 12)) != 0 \
192 -o $((xtse8 & 2)) != 0 ]; then
193 annex_s="$annex_s B,"
194 fi
195
196 if [ $((xtse1 & 194)) != 0 \
197 -o $((xtse2 & 12)) != 0 \
198 -o $((xtse8 & 4)) != 0 ]; then
199 annex_s="$annex_s C,"
200 fi
201
202 if [ $((xtse4 & 48)) != 0 \
203 -o $((xtse5 & 3)) != 0 \
204 -o $((xtse6 & 192)) != 0 ]; then
205 annex_s="$annex_s I,"
206 fi
207
208 if [ $((xtse4 & 192)) != 0 \
209 -o $((xtse7 & 3)) != 0 ]; then
210 annex_s="$annex_s J,"
211 fi
212
213 if [ $((xtse5 & 60)) != 0 ]; then
214 annex_s="$annex_s L,"
215 fi
216
217 if [ $((xtse5 & 192)) != 0 \
218 -o $((xtse7 & 12)) != 0 ]; then
219 annex_s="$annex_s M,"
220 fi
221
222 annex_s=`echo ${annex_s:1}`
223 annex_s=`echo ${annex_s%?}`
224
225 # Evaluate Line Mode (according to G.997.1, 7.3.1.1.1)
226
227 # Regional standard: ANSI T1.413
228 if [ $((xtse1 & 1)) != 0 ]; then
229 line_mode_s=" T1.413,"
230 fi
231
232 # Regional standard: TS 101 388
233 if [ $((xtse1 & 1)) != 0 ]; then
234 line_mode_s="$line_mode_s TS 101 388,"
235 fi
236
237 if [ $((xtse1 & 252)) != 0 ]; then
238 line_mode_s="$line_mode_s G.992.1 (ADSL),"
239 fi
240
241 if [ $((xtse2 & 15)) != 0 ]; then
242 line_mode_s="$line_mode_s G.992.2 (ADSL lite),"
243 fi
244
245 if [ $((xtse3 & 60)) != 0 \
246 -o $((xtse4 & 240)) != 0 \
247 -o $((xtse5 & 252)) != 0 ]; then
248 line_mode_s="$line_mode_s G.992.3 (ADSL2),"
249 fi
250
251 if [ $((xtse4 & 3)) != 0 \
252 -o $((xtse5 & 3)) != 0 ]; then
253 line_mode_s="$line_mode_s G.992.4 (ADSL2 lite),"
254 fi
255
256 if [ $((xtse6 & 199)) != 0 \
257 -o $((xtse7 & 15)) != 0 ]; then
258 line_mode_s="$line_mode_s G.992.5 (ADSL2+),"
259 fi
260
261 if [ $((xtse8 & 7)) != 0 ]; then
262 dsmsg=$(dsl_cmd dsmsg)
263 vector_s=$(dsl_val "$dsmsg" eVectorStatus)
264
265 case "$vector_s" in
266 "0") line_mode_s="$line_mode_s G.993.2 (VDSL2)," ;;
267 "1") line_mode_s="$line_mode_s G.993.5 (VDSL2 with downstream vectoring)," ;;
268 "2") line_mode_s="$line_mode_s G.993.5 (VDSL2 with down- and upstream vectoring)," ;;
269 *) line_mode_s="$line_mode_s unknown," ;;
270 esac
271 fi
272
273 #!!! PROPRIETARY & INTERMEDIATE USE !!!
274 if [ $((xtse8 & 128)) != 0 ]; then
275 line_mode_s="$line_mode_s G.993.1 (VDSL),"
276 fi
277
278 line_mode_s=`echo ${line_mode_s:1}`
279 line_mode_s=`echo ${line_mode_s%?}`
280
281 xtse_s="${xtse1}, ${xtse2}, ${xtse3}, ${xtse4}, ${xtse5}, ${xtse6}, ${xtse7}, ${xtse8}"
282
283 if [ "$action" = "lucistat" ]; then
284 echo "dsl.xtse1=${xtse1:-nil}"
285 echo "dsl.xtse2=${xtse2:-nil}"
286 echo "dsl.xtse3=${xtse3:-nil}"
287 echo "dsl.xtse4=${xtse4:-nil}"
288 echo "dsl.xtse5=${xtse5:-nil}"
289 echo "dsl.xtse6=${xtse6:-nil}"
290 echo "dsl.xtse7=${xtse7:-nil}"
291 echo "dsl.xtse8=${xtse8:-nil}"
292 echo "dsl.xtse_s=\"$xtse_s\""
293 echo "dsl.annex_s=\"${annex_s}\""
294 echo "dsl.line_mode_s=\"${line_mode_s}\""
295 else
296 echo "XTSE Capabilities: ${xtse_s}"
297 echo "Annex: ${annex_s}"
298 echo "Line Mode: ${line_mode_s}"
299 fi
300 }
301
302 #
303 # Power Management Mode
304 #
305 power_mode() {
306 local pmsg=$(dsl_cmd g997pmsg)
307 local pm=$(dsl_val "$pmsg" nPowerManagementStatus);
308 local s;
309
310 case "$pm" in
311 "-1") s="Power management state is not available" ;;
312 "0") s="L0 - Synchronized" ;;
313 "1") s="L1 - Power Down Data transmission (G.992.2)" ;;
314 "2") s="L2 - Power Down Data transmission (G.992.3 and G.992.4)" ;;
315 "3") s="L3 - No power" ;;
316 *) s="unknown" ;;
317 esac
318
319 if [ "$action" = "lucistat" ]; then
320 echo "dsl.power_mode_num=${pm:-nil}"
321 echo "dsl.power_mode_s=\"$s\""
322 else
323 echo "Power Management Mode: $s"
324 fi
325 }
326
327 #
328 # Latency type (interleave delay)
329 #
330 latency_delay() {
331 local csg
332
333 local idu
334 local idu_s;
335 local sidu
336
337 local idd
338 local idd_s;
339 local sidd
340
341 csg=$(dsl_cmd g997csg 0 1)
342 idd=$(dsl_val "$csg" ActualInterleaveDelay)
343
344 csg=$(dsl_cmd g997csg 0 0)
345 idu=$(dsl_val "$csg" ActualInterleaveDelay)
346
347 [ -z "$idd" ] && idd=0
348 [ -z "$idu" ] && idu=0
349
350 if [ "$idd" > 100 ]; then
351 idd_s="Interleave"
352 else
353 idd_s="Fast"
354 fi
355
356 if [ "$idu" > 100 ]; then
357 idu_s="Interleave"
358 else
359 idu_s="Fast"
360 fi
361
362 sidu=$(scale_latency $idu)
363 sidd=$(scale_latency $idd)
364
365 if [ "$action" = "lucistat" ]; then
366 echo "dsl.latency_num_down=\"$sidu\""
367 echo "dsl.latency_num_up=\"$sidd\""
368 echo "dsl.latency_s_down=\"$idd_s\""
369 echo "dsl.latency_s_up=\"$idu_s\""
370 else
371 echo "Latency / Interleave Delay: Down: ${idd_s} (${sidd}) / Up: ${idu_s} (${sidu})"
372 fi
373 }
374
375 #
376 # Errors
377 #
378 errors() {
379 local lsctg
380 local dpctg
381 local ccsg
382 local esf
383 local esn
384 local sesf
385 local sesn
386 local lossf
387 local lossn
388 local uasf
389 local uasn
390
391 local crc_pf
392 local crc_pn
393 local crcp_pf
394 local crcp_pn
395 local hecf
396 local hecn
397
398 local fecn
399 local fecf
400
401 lsctg=$(dsl_cmd pmlsctg 1)
402 esf=$(dsl_val "$lsctg" nES)
403 sesf=$(dsl_val "$lsctg" nSES)
404 lossf=$(dsl_val "$lsctg" nLOSS)
405 uasf=$(dsl_val "$lsctg" nUAS)
406
407 lsctg=$(dsl_cmd pmlsctg 0)
408 esn=$(dsl_val "$lsctg" nES)
409 sesn=$(dsl_val "$lsctg" nSES)
410 lossn=$(dsl_val "$lsctg" nLOSS)
411 uasn=$(dsl_val "$lsctg" nUAS)
412
413 dpctg=$(dsl_cmd pmdpctg 0 1)
414 hecf=$(dsl_val "$dpctg" nHEC)
415 crc_pf=$(dsl_val "$dpctg" nCRC_P)
416 crcp_pf=$(dsl_val "$dpctg" nCRCP_P)
417
418 dpctg=$(dsl_cmd pmdpctg 0 0)
419 hecn=$(dsl_val "$dpctg" nHEC)
420 crc_pn=$(dsl_val "$dpctg" nCRC_P)
421 crcp_pn=$(dsl_val "$dpctg" nCRCP_P)
422
423 ccsg=$(dsl_cmd pmccsg 0 1 0)
424 fecf=$(dsl_val "$ccsg" nFEC)
425
426 ccsg=$(dsl_cmd pmccsg 0 0 0)
427 fecn=$(dsl_val "$ccsg" nFEC)
428
429 if [ "$action" = "lucistat" ]; then
430 echo "dsl.errors_fec_near=${fecn:-nil}"
431 echo "dsl.errors_fec_far=${fecf:-nil}"
432 echo "dsl.errors_es_near=${esn:-nil}"
433 echo "dsl.errors_es_far=${esf:-nil}"
434 echo "dsl.errors_ses_near=${sesn:-nil}"
435 echo "dsl.errors_ses_far=${sesf:-nil}"
436 echo "dsl.errors_loss_near=${lossn:-nil}"
437 echo "dsl.errors_loss_far=${lossf:-nil}"
438 echo "dsl.errors_uas_near=${uasn:-nil}"
439 echo "dsl.errors_uas_far=${uasf:-nil}"
440 echo "dsl.errors_hec_near=${hecn:-nil}"
441 echo "dsl.errors_hec_far=${hecf:-nil}"
442 echo "dsl.errors_crc_p_near=${crc_pn:-nil}"
443 echo "dsl.errors_crc_p_far=${crc_pf:-nil}"
444 echo "dsl.errors_crcp_p_near=${crcp_pn:-nil}"
445 echo "dsl.errors_crcp_p_far=${crcp_pf:-nil}"
446 else
447 echo "Forward Error Correction Seconds (FECS): Near: ${fecn} / Far: ${fecf}"
448 echo "Errored seconds (ES): Near: ${esn} / Far: ${esf}"
449 echo "Severely Errored Seconds (SES): Near: ${sesn} / Far: ${sesf}"
450 echo "Loss of Signal Seconds (LOSS): Near: ${lossn} / Far: ${lossf}"
451 echo "Unavailable Seconds (UAS): Near: ${uasn} / Far: ${uasf}"
452 echo "Header Error Code Errors (HEC): Near: ${hecn} / Far: ${hecf}"
453 echo "Non Pre-emtive CRC errors (CRC_P): Near: ${crc_pn} / Far: ${crc_pf}"
454 echo "Pre-emtive CRC errors (CRCP_P): Near: ${crcp_pn} / Far: ${crcp_pf}"
455 fi
456 }
457
458 #
459 # Work out how long the line has been up
460 #
461 line_uptime() {
462 local ccsg
463 local et
464 local etr
465 local d
466 local h
467 local m
468 local s
469 local rc=""
470
471 ccsg=$(dsl_cmd pmccsg 0 0 0)
472 et=$(dsl_val "$ccsg" nElapsedTime)
473
474 [ -z "$et" ] && et=0
475
476 d=$(expr $et / 86400)
477 etr=$(expr $et % 86400)
478 h=$(expr $etr / 3600)
479 etr=$(expr $etr % 3600)
480 m=$(expr $etr / 60)
481 s=$(expr $etr % 60)
482
483
484 [ "${d}${h}${m}${s}" -ne 0 ] && rc="${s}s"
485 [ "${d}${h}${m}" -ne 0 ] && rc="${m}m ${rc}"
486 [ "${d}${h}" -ne 0 ] && rc="${h}h ${rc}"
487 [ "${d}" -ne 0 ] && rc="${d}d ${rc}"
488
489 [ -z "$rc" ] && rc="down"
490
491
492 if [ "$action" = "lucistat" ]; then
493 echo "dsl.line_uptime=${et}"
494 echo "dsl.line_uptime_s=\"${rc}\""
495 else
496
497 echo "Line Uptime Seconds: ${et}"
498 echo "Line Uptime: ${rc}"
499 fi
500 }
501
502 #
503 # Get noise and attenuation figures
504 #
505 line_data() {
506 local lsg
507 local latnu
508 local latnd
509 local satnu
510 local satnd
511 local snru
512 local snrd
513 local attndru
514 local attndrd
515 local sattndru
516 local sattndrd
517 local actatpu
518 local actatpd
519
520 lsg=$(dsl_cmd g997lsg 1 1)
521 latnd=$(dsl_val "$lsg" LATN)
522 satnd=$(dsl_val "$lsg" SATN)
523 snrd=$(dsl_val "$lsg" SNR)
524 attndrd=$(dsl_val "$lsg" ATTNDR)
525 actatpd=$(dsl_val "$lsg" ACTATP)
526
527 lsg=$(dsl_cmd g997lsg 0 1)
528 latnu=$(dsl_val "$lsg" LATN)
529 satnu=$(dsl_val "$lsg" SATN)
530 snru=$(dsl_val "$lsg" SNR)
531 attndru=$(dsl_val "$lsg" ATTNDR)
532 actatpu=$(dsl_val "$lsg" ACTATP)
533
534 [ -z "$latnd" ] && latnd=0
535 [ -z "$latnu" ] && latnu=0
536 [ -z "$satnd" ] && satnd=0
537 [ -z "$satnu" ] && satnu=0
538 [ -z "$snrd" ] && snrd=0
539 [ -z "$snru" ] && snru=0
540 [ -z "$actatpd" ] && actatpd=0
541 [ -z "$actatpu" ] && actatpu=0
542
543 latnd=$(dbt $latnd)
544 latnu=$(dbt $latnu)
545 satnd=$(dbt $satnd)
546 satnu=$(dbt $satnu)
547 snrd=$(dbt $snrd)
548 snru=$(dbt $snru)
549 actatpd=$(dbt $actatpd)
550 actatpu=$(dbt $actatpu)
551
552 [ -z "$attndrd" ] && attndrd=0
553 [ -z "$attndru" ] && attndru=0
554
555 sattndrd=$(scale $attndrd)
556 sattndru=$(scale $attndru)
557
558 if [ "$action" = "lucistat" ]; then
559 echo "dsl.line_attenuation_down=$latnd"
560 echo "dsl.line_attenuation_up=$latnu"
561 echo "dsl.noise_margin_down=$snrd"
562 echo "dsl.noise_margin_up=$snru"
563 echo "dsl.signal_attenuation_down=$satnd"
564 echo "dsl.signal_attenuation_up=$satnu"
565 echo "dsl.actatp_down=$actatpd"
566 echo "dsl.actatp_up=$actatpu"
567 echo "dsl.max_data_rate_down=$attndrd"
568 echo "dsl.max_data_rate_up=$attndru"
569 echo "dsl.max_data_rate_down_s=\"$sattndrd\""
570 echo "dsl.max_data_rate_up_s=\"$sattndru\""
571 else
572 echo "Line Attenuation (LATN): Down: ${latnd}dB / Up: ${latnu}dB"
573 echo "Signal Attenuation (SATN): Down: ${satnd}dB / Up: ${satnu}dB"
574 echo "Noise Margin (SNR): Down: ${snrd}dB / Up: ${snru}dB"
575 echo "Aggregate Transmit Power(ACTATP): Down: ${actatpd}dB / Up: ${actatpu}dB"
576 echo "Max. Attainable Data Rate (ATTNDR): Down: ${sattndrd}/s / Up: ${sattndru}/s"
577 fi
578 }
579
580 #
581 # Is the line up? Or what state is it in?
582 #
583 line_state() {
584 local lsg=$(dsl_cmd lsg)
585 local ls=$(dsl_val "$lsg" nLineState);
586 local s;
587
588 case "$ls" in
589 "0x0") s="not initialized" ;;
590 "0x1") s="exception" ;;
591 "0x10") s="not updated" ;;
592 "0xff") s="idle request" ;;
593 "0x100") s="idle" ;;
594 "0x1ff") s="silent request" ;;
595 "0x200") s="silent" ;;
596 "0x300") s="handshake" ;;
597 "0x380") s="full_init" ;;
598 "0x400") s="discovery" ;;
599 "0x500") s="training" ;;
600 "0x600") s="analysis" ;;
601 "0x700") s="exchange" ;;
602 "0x800") s="showtime_no_sync" ;;
603 "0x801") s="showtime_tc_sync" ;;
604 "0x900") s="fastretrain" ;;
605 "0xa00") s="lowpower_l2" ;;
606 "0xb00") s="loopdiagnostic active" ;;
607 "0xb10") s="loopdiagnostic data exchange" ;;
608 "0xb20") s="loopdiagnostic data request" ;;
609 "0xc00") s="loopdiagnostic complete" ;;
610 "0x1000000") s="test" ;;
611 "0xd00") s="resync" ;;
612 "0x3c0") s="short init entry" ;;
613 "") s="not running daemon"; ls="0xfff" ;;
614 *) s="unknown" ;;
615 esac
616
617 if [ "$action" = "lucistat" ]; then
618 echo "dsl.line_state_num=$ls"
619 echo "dsl.line_state_detail=\"$s\""
620 if [ "$ls" = "0x801" ]; then
621 echo "dsl.line_state=\"UP\""
622 else
623 echo "dsl.line_state=\"DOWN\""
624 fi
625 else
626 if [ "$ls" = "0x801" ]; then
627 echo "Line State: UP [$ls: $s]"
628 else
629 echo "Line State: DOWN [$ls: $s]"
630 fi
631 fi
632 }
633
634 #
635 # Which profile is used?
636 #
637 profile() {
638 local bpstg=$(dsl_cmd bpstg)
639 local profile=$(dsl_val "$bpstg" nProfile);
640 local s;
641
642 case "$profile" in
643 "0") s="8a" ;;
644 "1") s="8b" ;;
645 "2") s="8c" ;;
646 "3") s="8d" ;;
647 "4") s="12a" ;;
648 "5") s="12b" ;;
649 "6") s="17a" ;;
650 "7") s="30a" ;;
651 "8") s="17b" ;;
652 "") s="";;
653 *) s="unknown" ;;
654 esac
655
656 if [ "$action" = "lucistat" ]; then
657 echo "dsl.profile=${profile:-nil}"
658 else
659 echo "Profile: $s"
660 fi
661 }
662
663 status() {
664 vendor
665 chipset
666 xtse
667 profile
668 line_state
669 errors
670 power_mode
671 latency_delay
672 data_rates
673 line_data
674 line_uptime
675 }
676
677 lucistat() {
678 echo "local dsl={}"
679 status
680 echo "return dsl"
681 }