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