xref: /aosp_15_r20/external/openthread/tools/harness-thci/OpenThread_WpanCtl.py (revision cfb92d1480a9e65faed56933e9c12405f45898b4)
1*cfb92d14SAndroid Build Coastguard Worker#!/usr/bin/env python
2*cfb92d14SAndroid Build Coastguard Worker#
3*cfb92d14SAndroid Build Coastguard Worker# Copyright (c) 2018, The OpenThread Authors.
4*cfb92d14SAndroid Build Coastguard Worker# All rights reserved.
5*cfb92d14SAndroid Build Coastguard Worker#
6*cfb92d14SAndroid Build Coastguard Worker# Redistribution and use in source and binary forms, with or without
7*cfb92d14SAndroid Build Coastguard Worker# modification, are permitted provided that the following conditions are met:
8*cfb92d14SAndroid Build Coastguard Worker# 1. Redistributions of source code must retain the above copyright
9*cfb92d14SAndroid Build Coastguard Worker#    notice, this list of conditions and the following disclaimer.
10*cfb92d14SAndroid Build Coastguard Worker# 2. Redistributions in binary form must reproduce the above copyright
11*cfb92d14SAndroid Build Coastguard Worker#    notice, this list of conditions and the following disclaimer in the
12*cfb92d14SAndroid Build Coastguard Worker#    documentation and/or other materials provided with the distribution.
13*cfb92d14SAndroid Build Coastguard Worker# 3. Neither the name of the copyright holder nor the
14*cfb92d14SAndroid Build Coastguard Worker#    names of its contributors may be used to endorse or promote products
15*cfb92d14SAndroid Build Coastguard Worker#    derived from this software without specific prior written permission.
16*cfb92d14SAndroid Build Coastguard Worker#
17*cfb92d14SAndroid Build Coastguard Worker# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18*cfb92d14SAndroid Build Coastguard Worker# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19*cfb92d14SAndroid Build Coastguard Worker# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20*cfb92d14SAndroid Build Coastguard Worker# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
21*cfb92d14SAndroid Build Coastguard Worker# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22*cfb92d14SAndroid Build Coastguard Worker# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23*cfb92d14SAndroid Build Coastguard Worker# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24*cfb92d14SAndroid Build Coastguard Worker# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25*cfb92d14SAndroid Build Coastguard Worker# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26*cfb92d14SAndroid Build Coastguard Worker# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27*cfb92d14SAndroid Build Coastguard Worker# POSSIBILITY OF SUCH DAMAGE.
28*cfb92d14SAndroid Build Coastguard Worker"""
29*cfb92d14SAndroid Build Coastguard Worker>> Thread Host Controller Interface
30*cfb92d14SAndroid Build Coastguard Worker>> Device : OpenThread_WpanCtl THCI
31*cfb92d14SAndroid Build Coastguard Worker>> Class : OpenThread_WpanCtl
32*cfb92d14SAndroid Build Coastguard Worker"""
33*cfb92d14SAndroid Build Coastguard Worker
34*cfb92d14SAndroid Build Coastguard Workerimport re
35*cfb92d14SAndroid Build Coastguard Workerimport time
36*cfb92d14SAndroid Build Coastguard Workerimport socket
37*cfb92d14SAndroid Build Coastguard Workerimport logging
38*cfb92d14SAndroid Build Coastguard Workerfrom Queue import Queue
39*cfb92d14SAndroid Build Coastguard Worker
40*cfb92d14SAndroid Build Coastguard Workerimport serial
41*cfb92d14SAndroid Build Coastguard Workerfrom IThci import IThci
42*cfb92d14SAndroid Build Coastguard Workerfrom GRLLibs.UtilityModules.Test import Thread_Device_Role, Device_Data_Requirement, MacType
43*cfb92d14SAndroid Build Coastguard Workerfrom GRLLibs.UtilityModules.enums import PlatformDiagnosticPacket_Direction, PlatformDiagnosticPacket_Type
44*cfb92d14SAndroid Build Coastguard Workerfrom GRLLibs.UtilityModules.ModuleHelper import ModuleHelper
45*cfb92d14SAndroid Build Coastguard Workerfrom GRLLibs.ThreadPacket.PlatformPackets import PlatformDiagnosticPacket, PlatformPackets
46*cfb92d14SAndroid Build Coastguard Workerfrom GRLLibs.UtilityModules.Plugins.AES_CMAC import Thread_PBKDF2
47*cfb92d14SAndroid Build Coastguard Worker"""regex: used to split lines"""
48*cfb92d14SAndroid Build Coastguard WorkerLINESEPX = re.compile(r'\r\n|\n')
49*cfb92d14SAndroid Build Coastguard Worker
50*cfb92d14SAndroid Build Coastguard Worker
51*cfb92d14SAndroid Build Coastguard Workerclass OpenThread_WpanCtl(IThci):
52*cfb92d14SAndroid Build Coastguard Worker    LOWEST_POSSIBLE_PARTATION_ID = 0x1
53*cfb92d14SAndroid Build Coastguard Worker    LINK_QUALITY_CHANGE_TIME = 100
54*cfb92d14SAndroid Build Coastguard Worker
55*cfb92d14SAndroid Build Coastguard Worker    # Used for reference firmware version control for Test Harness.
56*cfb92d14SAndroid Build Coastguard Worker    # This variable will be updated to match the OpenThread reference firmware
57*cfb92d14SAndroid Build Coastguard Worker    # officially released.
58*cfb92d14SAndroid Build Coastguard Worker    firmwarePrefix = 'OPENTHREAD/'
59*cfb92d14SAndroid Build Coastguard Worker
60*cfb92d14SAndroid Build Coastguard Worker    def __init__(self, **kwargs):
61*cfb92d14SAndroid Build Coastguard Worker        """initialize the serial port and default network parameters
62*cfb92d14SAndroid Build Coastguard Worker        Args:
63*cfb92d14SAndroid Build Coastguard Worker            **kwargs: Arbitrary keyword arguments
64*cfb92d14SAndroid Build Coastguard Worker                      Includes 'EUI' and 'SerialPort'
65*cfb92d14SAndroid Build Coastguard Worker        """
66*cfb92d14SAndroid Build Coastguard Worker        try:
67*cfb92d14SAndroid Build Coastguard Worker            self.UIStatusMsg = ''
68*cfb92d14SAndroid Build Coastguard Worker            self.mac = kwargs.get('EUI')
69*cfb92d14SAndroid Build Coastguard Worker            self.handle = None
70*cfb92d14SAndroid Build Coastguard Worker            self.AutoDUTEnable = False
71*cfb92d14SAndroid Build Coastguard Worker            self._is_net = False  # whether device is through ser2net
72*cfb92d14SAndroid Build Coastguard Worker            self.logStatus = {'stop': 'stop', 'running': 'running', 'pauseReq': 'pauseReq', 'paused': 'paused'}
73*cfb92d14SAndroid Build Coastguard Worker            self.logThreadStatus = self.logStatus['stop']
74*cfb92d14SAndroid Build Coastguard Worker            # connection type 'ip' stands for SSH
75*cfb92d14SAndroid Build Coastguard Worker            self.connectType = (kwargs.get('Param5')).strip().lower() if kwargs.get('Param5') is not None else 'usb'
76*cfb92d14SAndroid Build Coastguard Worker            # comma separated CLI prompt, wpanctl cmd prefix, Wpan interface
77*cfb92d14SAndroid Build Coastguard Worker            (self.prompt, self.wpan_cmd_prefix,
78*cfb92d14SAndroid Build Coastguard Worker             self.wpan_interface) = (kwargs.get('Param8').strip().split(',')
79*cfb92d14SAndroid Build Coastguard Worker                                     if kwargs.get('Param8') else ['#', 'wpanctl', 'wpan0'])
80*cfb92d14SAndroid Build Coastguard Worker            self.wpan_cmd_prefix += ' '
81*cfb92d14SAndroid Build Coastguard Worker            # comma separated setting commands
82*cfb92d14SAndroid Build Coastguard Worker            self.precmd = (kwargs.get('Param9')).strip().split(',') if kwargs.get('Param9') else []
83*cfb92d14SAndroid Build Coastguard Worker            if self.connectType == 'ip':
84*cfb92d14SAndroid Build Coastguard Worker                self.dutIpv4 = kwargs.get('TelnetIP')
85*cfb92d14SAndroid Build Coastguard Worker                self.dutPort = kwargs.get('TelnetPort')
86*cfb92d14SAndroid Build Coastguard Worker                self.port = self.dutIpv4 + ':' + self.dutPort
87*cfb92d14SAndroid Build Coastguard Worker                # username for SSH
88*cfb92d14SAndroid Build Coastguard Worker                self.username = kwargs.get('Param6').strip() if kwargs.get('Param6') else None
89*cfb92d14SAndroid Build Coastguard Worker                # password for SSH
90*cfb92d14SAndroid Build Coastguard Worker                self.password = kwargs.get('Param7').strip() if kwargs.get('Param7') else None
91*cfb92d14SAndroid Build Coastguard Worker            else:
92*cfb92d14SAndroid Build Coastguard Worker                self.port = kwargs.get('SerialPort')
93*cfb92d14SAndroid Build Coastguard Worker            self.intialize()
94*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
95*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('initialize() Error: ' + str(e))
96*cfb92d14SAndroid Build Coastguard Worker
97*cfb92d14SAndroid Build Coastguard Worker    def __del__(self):
98*cfb92d14SAndroid Build Coastguard Worker        """close the serial port connection"""
99*cfb92d14SAndroid Build Coastguard Worker        try:
100*cfb92d14SAndroid Build Coastguard Worker            self.closeConnection()
101*cfb92d14SAndroid Build Coastguard Worker            self.deviceConnected = False
102*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
103*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('delete() Error: ' + str(e))
104*cfb92d14SAndroid Build Coastguard Worker
105*cfb92d14SAndroid Build Coastguard Worker    def _expect(self, expected, times=50):
106*cfb92d14SAndroid Build Coastguard Worker        """Find the `expected` line within `times` trials.
107*cfb92d14SAndroid Build Coastguard Worker
108*cfb92d14SAndroid Build Coastguard Worker        Args:
109*cfb92d14SAndroid Build Coastguard Worker            expected    str: the expected string
110*cfb92d14SAndroid Build Coastguard Worker            times       int: number of trials
111*cfb92d14SAndroid Build Coastguard Worker        """
112*cfb92d14SAndroid Build Coastguard Worker        print('[%s] Expecting [%s]' % (self.port, expected))
113*cfb92d14SAndroid Build Coastguard Worker
114*cfb92d14SAndroid Build Coastguard Worker        retry_times = 10
115*cfb92d14SAndroid Build Coastguard Worker        while times > 0 and retry_times > 0:
116*cfb92d14SAndroid Build Coastguard Worker            line = self._readline()
117*cfb92d14SAndroid Build Coastguard Worker            print('[%s] Got line [%s]' % (self.port, line))
118*cfb92d14SAndroid Build Coastguard Worker
119*cfb92d14SAndroid Build Coastguard Worker            if line == expected:
120*cfb92d14SAndroid Build Coastguard Worker                print('[%s] Expected [%s]' % (self.port, expected))
121*cfb92d14SAndroid Build Coastguard Worker                return
122*cfb92d14SAndroid Build Coastguard Worker
123*cfb92d14SAndroid Build Coastguard Worker            if not line:
124*cfb92d14SAndroid Build Coastguard Worker                retry_times -= 1
125*cfb92d14SAndroid Build Coastguard Worker                time.sleep(0.1)
126*cfb92d14SAndroid Build Coastguard Worker
127*cfb92d14SAndroid Build Coastguard Worker            times -= 1
128*cfb92d14SAndroid Build Coastguard Worker
129*cfb92d14SAndroid Build Coastguard Worker        raise Exception('failed to find expected string[%s]' % expected)
130*cfb92d14SAndroid Build Coastguard Worker
131*cfb92d14SAndroid Build Coastguard Worker    def _read(self, size=512):
132*cfb92d14SAndroid Build Coastguard Worker        logging.info('%s: reading', self.port)
133*cfb92d14SAndroid Build Coastguard Worker        if self._is_net:
134*cfb92d14SAndroid Build Coastguard Worker            return self.handle.recv(size)
135*cfb92d14SAndroid Build Coastguard Worker        else:
136*cfb92d14SAndroid Build Coastguard Worker            return self.handle.read(size)
137*cfb92d14SAndroid Build Coastguard Worker
138*cfb92d14SAndroid Build Coastguard Worker    def _write(self, data):
139*cfb92d14SAndroid Build Coastguard Worker        logging.info('%s: writing', self.port)
140*cfb92d14SAndroid Build Coastguard Worker        if self._is_net:
141*cfb92d14SAndroid Build Coastguard Worker            self.handle.sendall(data)
142*cfb92d14SAndroid Build Coastguard Worker        else:
143*cfb92d14SAndroid Build Coastguard Worker            self.handle.write(data)
144*cfb92d14SAndroid Build Coastguard Worker
145*cfb92d14SAndroid Build Coastguard Worker    def _readline(self):
146*cfb92d14SAndroid Build Coastguard Worker        """Read exactly one line from the device
147*cfb92d14SAndroid Build Coastguard Worker
148*cfb92d14SAndroid Build Coastguard Worker        Returns:
149*cfb92d14SAndroid Build Coastguard Worker            None on no data
150*cfb92d14SAndroid Build Coastguard Worker        """
151*cfb92d14SAndroid Build Coastguard Worker        logging.info('%s: reading line', self.port)
152*cfb92d14SAndroid Build Coastguard Worker        if len(self._lines) > 1:
153*cfb92d14SAndroid Build Coastguard Worker            return self._lines.pop(0)
154*cfb92d14SAndroid Build Coastguard Worker
155*cfb92d14SAndroid Build Coastguard Worker        tail = ''
156*cfb92d14SAndroid Build Coastguard Worker        if len(self._lines):
157*cfb92d14SAndroid Build Coastguard Worker            tail = self._lines.pop()
158*cfb92d14SAndroid Build Coastguard Worker
159*cfb92d14SAndroid Build Coastguard Worker        try:
160*cfb92d14SAndroid Build Coastguard Worker            tail += self._read()
161*cfb92d14SAndroid Build Coastguard Worker        except socket.error:
162*cfb92d14SAndroid Build Coastguard Worker            logging.exception('%s: No new data', self.port)
163*cfb92d14SAndroid Build Coastguard Worker            time.sleep(0.1)
164*cfb92d14SAndroid Build Coastguard Worker
165*cfb92d14SAndroid Build Coastguard Worker        self._lines += LINESEPX.split(tail)
166*cfb92d14SAndroid Build Coastguard Worker        if len(self._lines) > 1:
167*cfb92d14SAndroid Build Coastguard Worker            return self._lines.pop(0)
168*cfb92d14SAndroid Build Coastguard Worker
169*cfb92d14SAndroid Build Coastguard Worker    def _sendline(self, line):
170*cfb92d14SAndroid Build Coastguard Worker        """Send exactly one line to the device
171*cfb92d14SAndroid Build Coastguard Worker
172*cfb92d14SAndroid Build Coastguard Worker        Args:
173*cfb92d14SAndroid Build Coastguard Worker            line str: data send to device
174*cfb92d14SAndroid Build Coastguard Worker        """
175*cfb92d14SAndroid Build Coastguard Worker        logging.info('%s: sending line', self.port)
176*cfb92d14SAndroid Build Coastguard Worker        # clear buffer
177*cfb92d14SAndroid Build Coastguard Worker        self._lines = []
178*cfb92d14SAndroid Build Coastguard Worker        try:
179*cfb92d14SAndroid Build Coastguard Worker            self._read()
180*cfb92d14SAndroid Build Coastguard Worker        except socket.error:
181*cfb92d14SAndroid Build Coastguard Worker            logging.debug('%s: Nothing cleared', self.port)
182*cfb92d14SAndroid Build Coastguard Worker
183*cfb92d14SAndroid Build Coastguard Worker        print('sending [%s]' % line)
184*cfb92d14SAndroid Build Coastguard Worker        self._write(line + '\r\n')
185*cfb92d14SAndroid Build Coastguard Worker        self._lines = []
186*cfb92d14SAndroid Build Coastguard Worker        # wait for write to complete
187*cfb92d14SAndroid Build Coastguard Worker        time.sleep(0.1)
188*cfb92d14SAndroid Build Coastguard Worker
189*cfb92d14SAndroid Build Coastguard Worker    def __sendCommand(self, cmd):
190*cfb92d14SAndroid Build Coastguard Worker        """send specific command to reference unit over serial port
191*cfb92d14SAndroid Build Coastguard Worker
192*cfb92d14SAndroid Build Coastguard Worker        Args:
193*cfb92d14SAndroid Build Coastguard Worker            cmd: OpenThread_WpanCtl command string
194*cfb92d14SAndroid Build Coastguard Worker
195*cfb92d14SAndroid Build Coastguard Worker        Returns:
196*cfb92d14SAndroid Build Coastguard Worker            Fail: Failed to send the command to reference unit and parse it
197*cfb92d14SAndroid Build Coastguard Worker            Value: successfully retrieve the desired value from reference unit
198*cfb92d14SAndroid Build Coastguard Worker            Error: some errors occur, indicates by the followed specific error number
199*cfb92d14SAndroid Build Coastguard Worker        """
200*cfb92d14SAndroid Build Coastguard Worker        logging.info('%s: sendCommand[%s]', self.port, cmd)
201*cfb92d14SAndroid Build Coastguard Worker        if self.logThreadStatus == self.logStatus['running']:
202*cfb92d14SAndroid Build Coastguard Worker            self.logThreadStatus = self.logStatus['pauseReq']
203*cfb92d14SAndroid Build Coastguard Worker            while self.logThreadStatus not in (self.logStatus['paused'], self.logStatus['stop']):
204*cfb92d14SAndroid Build Coastguard Worker                pass
205*cfb92d14SAndroid Build Coastguard Worker
206*cfb92d14SAndroid Build Coastguard Worker        ssh_stdin = None
207*cfb92d14SAndroid Build Coastguard Worker        ssh_stdout = None
208*cfb92d14SAndroid Build Coastguard Worker        ssh_stderr = None
209*cfb92d14SAndroid Build Coastguard Worker        try:
210*cfb92d14SAndroid Build Coastguard Worker            # command retransmit times
211*cfb92d14SAndroid Build Coastguard Worker            retry_times = 3
212*cfb92d14SAndroid Build Coastguard Worker            while retry_times > 0:
213*cfb92d14SAndroid Build Coastguard Worker                retry_times -= 1
214*cfb92d14SAndroid Build Coastguard Worker                try:
215*cfb92d14SAndroid Build Coastguard Worker                    if self._is_net:
216*cfb92d14SAndroid Build Coastguard Worker                        ssh_stdin, ssh_stdout, ssh_stderr = self.handle.exec_command(cmd)
217*cfb92d14SAndroid Build Coastguard Worker                    else:
218*cfb92d14SAndroid Build Coastguard Worker                        self._sendline(cmd)
219*cfb92d14SAndroid Build Coastguard Worker                        self._expect(cmd)
220*cfb92d14SAndroid Build Coastguard Worker                except Exception as e:
221*cfb92d14SAndroid Build Coastguard Worker                    logging.exception('%s: failed to send command[%s]: %s', self.port, cmd, str(e))
222*cfb92d14SAndroid Build Coastguard Worker                    if retry_times == 0:
223*cfb92d14SAndroid Build Coastguard Worker                        raise
224*cfb92d14SAndroid Build Coastguard Worker                else:
225*cfb92d14SAndroid Build Coastguard Worker                    break
226*cfb92d14SAndroid Build Coastguard Worker
227*cfb92d14SAndroid Build Coastguard Worker            line = None
228*cfb92d14SAndroid Build Coastguard Worker            response = []
229*cfb92d14SAndroid Build Coastguard Worker            retry_times = 20
230*cfb92d14SAndroid Build Coastguard Worker            stdout_lines = []
231*cfb92d14SAndroid Build Coastguard Worker            stderr_lines = []
232*cfb92d14SAndroid Build Coastguard Worker            if self._is_net:
233*cfb92d14SAndroid Build Coastguard Worker                stdout_lines = ssh_stdout.readlines()
234*cfb92d14SAndroid Build Coastguard Worker                stderr_lines = ssh_stderr.readlines()
235*cfb92d14SAndroid Build Coastguard Worker                if stderr_lines:
236*cfb92d14SAndroid Build Coastguard Worker                    for stderr_line in stderr_lines:
237*cfb92d14SAndroid Build Coastguard Worker                        if re.search(r'Not\s+Found|failed\s+with\s+error', stderr_line.strip(), re.M | re.I):
238*cfb92d14SAndroid Build Coastguard Worker                            print('Command failed: %s' % stderr_line)
239*cfb92d14SAndroid Build Coastguard Worker                            return 'Fail'
240*cfb92d14SAndroid Build Coastguard Worker                        print('Got line: %s' % stderr_line)
241*cfb92d14SAndroid Build Coastguard Worker                        logging.info('%s: the read line is[%s]', self.port, stderr_line)
242*cfb92d14SAndroid Build Coastguard Worker                        response.append(str(stderr_line.strip()))
243*cfb92d14SAndroid Build Coastguard Worker                elif stdout_lines:
244*cfb92d14SAndroid Build Coastguard Worker                    for stdout_line in stdout_lines:
245*cfb92d14SAndroid Build Coastguard Worker                        logging.info('%s: the read line is[%s]', self.port, stdout_line)
246*cfb92d14SAndroid Build Coastguard Worker                        if re.search(r'Not\s+Found|failed\s+with\s+error', stdout_line.strip(), re.M | re.I):
247*cfb92d14SAndroid Build Coastguard Worker                            print('Command failed')
248*cfb92d14SAndroid Build Coastguard Worker                            return 'Fail'
249*cfb92d14SAndroid Build Coastguard Worker                        print('Got line: ' + stdout_line)
250*cfb92d14SAndroid Build Coastguard Worker                        logging.info('%s: send command[%s] done!', self.port, cmd)
251*cfb92d14SAndroid Build Coastguard Worker                        response.append(str(stdout_line.strip()))
252*cfb92d14SAndroid Build Coastguard Worker                response.append(self.prompt)
253*cfb92d14SAndroid Build Coastguard Worker                return response
254*cfb92d14SAndroid Build Coastguard Worker            else:
255*cfb92d14SAndroid Build Coastguard Worker                while retry_times > 0:
256*cfb92d14SAndroid Build Coastguard Worker                    line = self._readline()
257*cfb92d14SAndroid Build Coastguard Worker                    print('read line: %s' % line)
258*cfb92d14SAndroid Build Coastguard Worker                    logging.info('%s: the read line is[%s]', self.port, line)
259*cfb92d14SAndroid Build Coastguard Worker                    if line:
260*cfb92d14SAndroid Build Coastguard Worker                        response.append(line)
261*cfb92d14SAndroid Build Coastguard Worker                        if re.match(self.prompt, line):
262*cfb92d14SAndroid Build Coastguard Worker                            break
263*cfb92d14SAndroid Build Coastguard Worker                        elif re.search(r'Not\s+Found|failed\s+with\s+error', line, re.M | re.I):
264*cfb92d14SAndroid Build Coastguard Worker                            print('Command failed')
265*cfb92d14SAndroid Build Coastguard Worker                            return 'Fail'
266*cfb92d14SAndroid Build Coastguard Worker
267*cfb92d14SAndroid Build Coastguard Worker                    retry_times -= 1
268*cfb92d14SAndroid Build Coastguard Worker                    time.sleep(0.1)
269*cfb92d14SAndroid Build Coastguard Worker
270*cfb92d14SAndroid Build Coastguard Worker                if retry_times == 0:
271*cfb92d14SAndroid Build Coastguard Worker                    raise Exception('%s: failed to find end of response' % self.port)
272*cfb92d14SAndroid Build Coastguard Worker                logging.info('%s: send command[%s] done!', self.port, cmd)
273*cfb92d14SAndroid Build Coastguard Worker                return response
274*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
275*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('sendCommand() Error: ' + str(e))
276*cfb92d14SAndroid Build Coastguard Worker            raise
277*cfb92d14SAndroid Build Coastguard Worker
278*cfb92d14SAndroid Build Coastguard Worker    def __stripValue(self, value):
279*cfb92d14SAndroid Build Coastguard Worker        """strip the special characters in the value
280*cfb92d14SAndroid Build Coastguard Worker
281*cfb92d14SAndroid Build Coastguard Worker                Args:
282*cfb92d14SAndroid Build Coastguard Worker                    value: value string
283*cfb92d14SAndroid Build Coastguard Worker
284*cfb92d14SAndroid Build Coastguard Worker                Returns:
285*cfb92d14SAndroid Build Coastguard Worker                    value string without special characters
286*cfb92d14SAndroid Build Coastguard Worker        """
287*cfb92d14SAndroid Build Coastguard Worker        if isinstance(value, str):
288*cfb92d14SAndroid Build Coastguard Worker            if (value[0] == '"' and value[-1] == '"') or (value[0] == '[' and value[-1] == ']'):
289*cfb92d14SAndroid Build Coastguard Worker                return value[1:-1]
290*cfb92d14SAndroid Build Coastguard Worker        return value
291*cfb92d14SAndroid Build Coastguard Worker
292*cfb92d14SAndroid Build Coastguard Worker    def __padIp6Addr(self, ip6Addr):
293*cfb92d14SAndroid Build Coastguard Worker        segments = ip6Addr.split(':')
294*cfb92d14SAndroid Build Coastguard Worker        empty = None
295*cfb92d14SAndroid Build Coastguard Worker        for i, element in enumerate(segments):
296*cfb92d14SAndroid Build Coastguard Worker            if empty is None and len(element) == 0:
297*cfb92d14SAndroid Build Coastguard Worker                empty = i
298*cfb92d14SAndroid Build Coastguard Worker            elif len(element) < 4:
299*cfb92d14SAndroid Build Coastguard Worker                segments[i] = '0' * (4 - len(element)) + element
300*cfb92d14SAndroid Build Coastguard Worker
301*cfb92d14SAndroid Build Coastguard Worker        if empty is not None:
302*cfb92d14SAndroid Build Coastguard Worker            segments = segments[:empty] + ['0000'] * (8 - len(segments) + 1) + segments[empty + 1:]
303*cfb92d14SAndroid Build Coastguard Worker
304*cfb92d14SAndroid Build Coastguard Worker        return ':'.join(segments)
305*cfb92d14SAndroid Build Coastguard Worker
306*cfb92d14SAndroid Build Coastguard Worker    def __setDeviceMode(self, mode):
307*cfb92d14SAndroid Build Coastguard Worker        """set thread device mode:
308*cfb92d14SAndroid Build Coastguard Worker
309*cfb92d14SAndroid Build Coastguard Worker        Args:
310*cfb92d14SAndroid Build Coastguard Worker           mode: thread device mode. 11=rdn, 9=rn
311*cfb92d14SAndroid Build Coastguard Worker           r: rx-on-when-idle
312*cfb92d14SAndroid Build Coastguard Worker           s: secure IEEE 802.15.4 data request
313*cfb92d14SAndroid Build Coastguard Worker           d: full thread device
314*cfb92d14SAndroid Build Coastguard Worker           n: full network data
315*cfb92d14SAndroid Build Coastguard Worker
316*cfb92d14SAndroid Build Coastguard Worker        Returns:
317*cfb92d14SAndroid Build Coastguard Worker           True: successful to set the device mode
318*cfb92d14SAndroid Build Coastguard Worker           False: fail to set the device mode
319*cfb92d14SAndroid Build Coastguard Worker        """
320*cfb92d14SAndroid Build Coastguard Worker        print('call __setDeviceMode')
321*cfb92d14SAndroid Build Coastguard Worker
322*cfb92d14SAndroid Build Coastguard Worker        try:
323*cfb92d14SAndroid Build Coastguard Worker            cmd = self.wpan_cmd_prefix + 'setprop Thread:DeviceMode %d' % mode
324*cfb92d14SAndroid Build Coastguard Worker            return self.__sendCommand(cmd)[0] != 'Fail'
325*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
326*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('setDeviceMode() Error: ' + str(e))
327*cfb92d14SAndroid Build Coastguard Worker
328*cfb92d14SAndroid Build Coastguard Worker    def __setRouterUpgradeThreshold(self, iThreshold):
329*cfb92d14SAndroid Build Coastguard Worker        """set router upgrade threshold
330*cfb92d14SAndroid Build Coastguard Worker
331*cfb92d14SAndroid Build Coastguard Worker        Args:
332*cfb92d14SAndroid Build Coastguard Worker            iThreshold: the number of active routers on the Thread network
333*cfb92d14SAndroid Build Coastguard Worker                        partition below which a REED may decide to become a Router.
334*cfb92d14SAndroid Build Coastguard Worker
335*cfb92d14SAndroid Build Coastguard Worker        Returns:
336*cfb92d14SAndroid Build Coastguard Worker            True: successful to set the ROUTER_UPGRADE_THRESHOLD
337*cfb92d14SAndroid Build Coastguard Worker            False: fail to set ROUTER_UPGRADE_THRESHOLD
338*cfb92d14SAndroid Build Coastguard Worker        """
339*cfb92d14SAndroid Build Coastguard Worker        print('call __setRouterUpgradeThreshold')
340*cfb92d14SAndroid Build Coastguard Worker        try:
341*cfb92d14SAndroid Build Coastguard Worker            cmd = self.wpan_cmd_prefix + 'setprop Thread:RouterUpgradeThreshold %s' % str(iThreshold)
342*cfb92d14SAndroid Build Coastguard Worker            return self.__sendCommand(cmd)[0] != 'Fail'
343*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
344*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('setRouterUpgradeThreshold() Error: ' + str(e))
345*cfb92d14SAndroid Build Coastguard Worker
346*cfb92d14SAndroid Build Coastguard Worker    def __setRouterDowngradeThreshold(self, iThreshold):
347*cfb92d14SAndroid Build Coastguard Worker        """set router downgrade threshold
348*cfb92d14SAndroid Build Coastguard Worker
349*cfb92d14SAndroid Build Coastguard Worker        Args:
350*cfb92d14SAndroid Build Coastguard Worker            iThreshold: the number of active routers on the Thread network
351*cfb92d14SAndroid Build Coastguard Worker                        partition above which an active router may decide to
352*cfb92d14SAndroid Build Coastguard Worker                        become a child.
353*cfb92d14SAndroid Build Coastguard Worker
354*cfb92d14SAndroid Build Coastguard Worker        Returns:
355*cfb92d14SAndroid Build Coastguard Worker            True: successful to set the ROUTER_DOWNGRADE_THRESHOLD
356*cfb92d14SAndroid Build Coastguard Worker            False: fail to set ROUTER_DOWNGRADE_THRESHOLD
357*cfb92d14SAndroid Build Coastguard Worker        """
358*cfb92d14SAndroid Build Coastguard Worker        print('call __setRouterDowngradeThreshold')
359*cfb92d14SAndroid Build Coastguard Worker        try:
360*cfb92d14SAndroid Build Coastguard Worker            cmd = self.wpan_cmd_prefix + 'setprop Thread:RouterDowngradeThreshold %s' % str(iThreshold)
361*cfb92d14SAndroid Build Coastguard Worker            return self.__sendCommand(cmd)[0] != 'Fail'
362*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
363*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('setRouterDowngradeThreshold() Error: ' + str(e))
364*cfb92d14SAndroid Build Coastguard Worker
365*cfb92d14SAndroid Build Coastguard Worker    def __setRouterSelectionJitter(self, iRouterJitter):
366*cfb92d14SAndroid Build Coastguard Worker        """set ROUTER_SELECTION_JITTER parameter for REED to upgrade to Router
367*cfb92d14SAndroid Build Coastguard Worker
368*cfb92d14SAndroid Build Coastguard Worker        Args:
369*cfb92d14SAndroid Build Coastguard Worker            iRouterJitter: a random period prior to request Router ID for REED
370*cfb92d14SAndroid Build Coastguard Worker
371*cfb92d14SAndroid Build Coastguard Worker        Returns:
372*cfb92d14SAndroid Build Coastguard Worker            True: successful to set the ROUTER_SELECTION_JITTER
373*cfb92d14SAndroid Build Coastguard Worker            False: fail to set ROUTER_SELECTION_JITTER
374*cfb92d14SAndroid Build Coastguard Worker        """
375*cfb92d14SAndroid Build Coastguard Worker        print('call _setRouterSelectionJitter')
376*cfb92d14SAndroid Build Coastguard Worker        try:
377*cfb92d14SAndroid Build Coastguard Worker            cmd = self.wpan_cmd_prefix + 'setprop Thread:RouterSelectionJitter %s' % str(iRouterJitter)
378*cfb92d14SAndroid Build Coastguard Worker            return self.__sendCommand(cmd) != 'Fail'
379*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
380*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('setRouterSelectionJitter() Error: ' + str(e))
381*cfb92d14SAndroid Build Coastguard Worker
382*cfb92d14SAndroid Build Coastguard Worker    def __setAddressfilterMode(self, mode):
383*cfb92d14SAndroid Build Coastguard Worker        """set address filter mode
384*cfb92d14SAndroid Build Coastguard Worker
385*cfb92d14SAndroid Build Coastguard Worker        Returns:
386*cfb92d14SAndroid Build Coastguard Worker            True: successful to set address filter mode.
387*cfb92d14SAndroid Build Coastguard Worker            False: fail to set address filter mode.
388*cfb92d14SAndroid Build Coastguard Worker        """
389*cfb92d14SAndroid Build Coastguard Worker        print('call setAddressFilterMode() %s' % mode)
390*cfb92d14SAndroid Build Coastguard Worker        try:
391*cfb92d14SAndroid Build Coastguard Worker            if mode in ('allowlist', 'denylist'):
392*cfb92d14SAndroid Build Coastguard Worker                cmd = self.wpan_cmd_prefix + 'setprop MAC:' + mode.capitalize() + ':Enabled 1'
393*cfb92d14SAndroid Build Coastguard Worker            elif mode == 'disable':
394*cfb92d14SAndroid Build Coastguard Worker                if self._addressfilterMode != 'disable':
395*cfb92d14SAndroid Build Coastguard Worker                    assert self._addressfilterMode in ('allowlist', 'denylist'), self._addressfilterMode
396*cfb92d14SAndroid Build Coastguard Worker                    cmd = self.wpan_cmd_prefix + 'setprop MAC:' + self._addressfilterMode.capitalize() + ':Enabled 0'
397*cfb92d14SAndroid Build Coastguard Worker                else:
398*cfb92d14SAndroid Build Coastguard Worker                    return True
399*cfb92d14SAndroid Build Coastguard Worker            else:
400*cfb92d14SAndroid Build Coastguard Worker                assert False, 'unknown address filter mode: %s' % mode
401*cfb92d14SAndroid Build Coastguard Worker
402*cfb92d14SAndroid Build Coastguard Worker            if self.__sendCommand(cmd)[0] != 'Fail':
403*cfb92d14SAndroid Build Coastguard Worker                self._addressfilterMode = mode
404*cfb92d14SAndroid Build Coastguard Worker                return True
405*cfb92d14SAndroid Build Coastguard Worker            return False
406*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
407*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('__setAddressFilterMode() Error: ' + str(e))
408*cfb92d14SAndroid Build Coastguard Worker
409*cfb92d14SAndroid Build Coastguard Worker    def __startOpenThreadWpan(self):
410*cfb92d14SAndroid Build Coastguard Worker        """start OpenThreadWpan
411*cfb92d14SAndroid Build Coastguard Worker
412*cfb92d14SAndroid Build Coastguard Worker        Returns:
413*cfb92d14SAndroid Build Coastguard Worker            True: successful to start OpenThreadWpan up
414*cfb92d14SAndroid Build Coastguard Worker            False: fail to start OpenThreadWpan
415*cfb92d14SAndroid Build Coastguard Worker        """
416*cfb92d14SAndroid Build Coastguard Worker        print('call startOpenThreadWpan')
417*cfb92d14SAndroid Build Coastguard Worker        try:
418*cfb92d14SAndroid Build Coastguard Worker
419*cfb92d14SAndroid Build Coastguard Worker            # restore allowlist/denylist address filter mode if rejoin after
420*cfb92d14SAndroid Build Coastguard Worker            # reset
421*cfb92d14SAndroid Build Coastguard Worker            if self.isPowerDown:
422*cfb92d14SAndroid Build Coastguard Worker                if self._addressfilterMode == 'allowlist':
423*cfb92d14SAndroid Build Coastguard Worker                    if self.__setAddressfilterMode('allowlist'):
424*cfb92d14SAndroid Build Coastguard Worker                        for addr in self._addressfilterSet:
425*cfb92d14SAndroid Build Coastguard Worker                            self.addAllowMAC(addr)
426*cfb92d14SAndroid Build Coastguard Worker                elif self._addressfilterMode == 'denylist':
427*cfb92d14SAndroid Build Coastguard Worker                    if self.__setAddressfilterMode('denylist'):
428*cfb92d14SAndroid Build Coastguard Worker                        for addr in self._addressfilterSet:
429*cfb92d14SAndroid Build Coastguard Worker                            self.addBlockedMAC(addr)
430*cfb92d14SAndroid Build Coastguard Worker            time.sleep(1)
431*cfb92d14SAndroid Build Coastguard Worker            if ModuleHelper.LeaderDutChannelFound:
432*cfb92d14SAndroid Build Coastguard Worker                self.channel = ModuleHelper.Default_Channel
433*cfb92d14SAndroid Build Coastguard Worker            nodeType = 'router'
434*cfb92d14SAndroid Build Coastguard Worker            startType = 'join'
435*cfb92d14SAndroid Build Coastguard Worker            if self.deviceRole == Thread_Device_Role.Leader:
436*cfb92d14SAndroid Build Coastguard Worker                nodeType = 'router'
437*cfb92d14SAndroid Build Coastguard Worker                startType = 'form'
438*cfb92d14SAndroid Build Coastguard Worker            elif self.deviceRole == Thread_Device_Role.Router:
439*cfb92d14SAndroid Build Coastguard Worker                nodeType = 'router'
440*cfb92d14SAndroid Build Coastguard Worker            elif self.deviceRole == Thread_Device_Role.SED:
441*cfb92d14SAndroid Build Coastguard Worker                nodeType = 'sed'
442*cfb92d14SAndroid Build Coastguard Worker            elif self.deviceRole == Thread_Device_Role.EndDevice:
443*cfb92d14SAndroid Build Coastguard Worker                nodeType = 'end'
444*cfb92d14SAndroid Build Coastguard Worker            elif self.deviceRole == Thread_Device_Role.REED:
445*cfb92d14SAndroid Build Coastguard Worker                nodeType = 'router'
446*cfb92d14SAndroid Build Coastguard Worker            elif self.deviceRole == Thread_Device_Role.EndDevice_FED:
447*cfb92d14SAndroid Build Coastguard Worker                nodeType = 'router'
448*cfb92d14SAndroid Build Coastguard Worker            elif self.deviceRole == Thread_Device_Role.EndDevice_MED:
449*cfb92d14SAndroid Build Coastguard Worker                nodeType = 'end'
450*cfb92d14SAndroid Build Coastguard Worker            else:
451*cfb92d14SAndroid Build Coastguard Worker                pass
452*cfb92d14SAndroid Build Coastguard Worker
453*cfb92d14SAndroid Build Coastguard Worker            if self.deviceRole in [Thread_Device_Role.Leader, Thread_Device_Role.Router, Thread_Device_Role.REED]:
454*cfb92d14SAndroid Build Coastguard Worker                self.__setRouterSelectionJitter(1)
455*cfb92d14SAndroid Build Coastguard Worker
456*cfb92d14SAndroid Build Coastguard Worker            if startType == 'form':
457*cfb92d14SAndroid Build Coastguard Worker                startCmd = self.wpan_cmd_prefix + '%s "%s" -c %s -T %s ' % (
458*cfb92d14SAndroid Build Coastguard Worker                    startType,
459*cfb92d14SAndroid Build Coastguard Worker                    self.networkName,
460*cfb92d14SAndroid Build Coastguard Worker                    str(self.channel),
461*cfb92d14SAndroid Build Coastguard Worker                    nodeType,
462*cfb92d14SAndroid Build Coastguard Worker                )
463*cfb92d14SAndroid Build Coastguard Worker            else:
464*cfb92d14SAndroid Build Coastguard Worker                startCmd = self.wpan_cmd_prefix + '%s "%s" -p %s -c %s -T %s ' % (
465*cfb92d14SAndroid Build Coastguard Worker                    startType,
466*cfb92d14SAndroid Build Coastguard Worker                    self.networkName,
467*cfb92d14SAndroid Build Coastguard Worker                    str(hex(self.panId)),
468*cfb92d14SAndroid Build Coastguard Worker                    str(self.channel),
469*cfb92d14SAndroid Build Coastguard Worker                    nodeType,
470*cfb92d14SAndroid Build Coastguard Worker                )
471*cfb92d14SAndroid Build Coastguard Worker            if self.__sendCommand(startCmd)[0] != 'Fail':
472*cfb92d14SAndroid Build Coastguard Worker                if self.__isOpenThreadWpanRunning():
473*cfb92d14SAndroid Build Coastguard Worker                    self.isPowerDown = False
474*cfb92d14SAndroid Build Coastguard Worker                    if self.hasActiveDatasetToCommit:
475*cfb92d14SAndroid Build Coastguard Worker                        if self.__sendCommand(self.wpan_cmd_prefix + 'setprop Dataset:Command SetActive')[0] == 'Fail':
476*cfb92d14SAndroid Build Coastguard Worker                            raise Exception('failed to commit active dataset')
477*cfb92d14SAndroid Build Coastguard Worker                        else:
478*cfb92d14SAndroid Build Coastguard Worker                            self.hasActiveDatasetToCommit = False
479*cfb92d14SAndroid Build Coastguard Worker
480*cfb92d14SAndroid Build Coastguard Worker                    return True
481*cfb92d14SAndroid Build Coastguard Worker            else:
482*cfb92d14SAndroid Build Coastguard Worker                return False
483*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
484*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('startOpenThreadWpan() Error: ' + str(e))
485*cfb92d14SAndroid Build Coastguard Worker
486*cfb92d14SAndroid Build Coastguard Worker    def __stopOpenThreadWpan(self):
487*cfb92d14SAndroid Build Coastguard Worker        """stop OpenThreadWpan
488*cfb92d14SAndroid Build Coastguard Worker
489*cfb92d14SAndroid Build Coastguard Worker        Returns:
490*cfb92d14SAndroid Build Coastguard Worker            True: successfully stop OpenThreadWpan
491*cfb92d14SAndroid Build Coastguard Worker            False: failed to stop OpenThreadWpan
492*cfb92d14SAndroid Build Coastguard Worker        """
493*cfb92d14SAndroid Build Coastguard Worker        print('call stopOpenThreadWpan')
494*cfb92d14SAndroid Build Coastguard Worker        try:
495*cfb92d14SAndroid Build Coastguard Worker            if (self.__sendCommand(self.wpan_cmd_prefix + 'leave')[0] != 'Fail' and
496*cfb92d14SAndroid Build Coastguard Worker                    self.__sendCommand(self.wpan_cmd_prefix + 'dataset erase')[0] != 'Fail'):
497*cfb92d14SAndroid Build Coastguard Worker                return True
498*cfb92d14SAndroid Build Coastguard Worker            else:
499*cfb92d14SAndroid Build Coastguard Worker                return False
500*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
501*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('stopOpenThreadWpan() Error: ' + str(e))
502*cfb92d14SAndroid Build Coastguard Worker
503*cfb92d14SAndroid Build Coastguard Worker    def __isOpenThreadWpanRunning(self):
504*cfb92d14SAndroid Build Coastguard Worker        """check whether or not OpenThreadWpan is running
505*cfb92d14SAndroid Build Coastguard Worker
506*cfb92d14SAndroid Build Coastguard Worker        Returns:
507*cfb92d14SAndroid Build Coastguard Worker            True: OpenThreadWpan is running
508*cfb92d14SAndroid Build Coastguard Worker            False: OpenThreadWpan is not running
509*cfb92d14SAndroid Build Coastguard Worker        """
510*cfb92d14SAndroid Build Coastguard Worker        print('call __isOpenThreadWpanRunning')
511*cfb92d14SAndroid Build Coastguard Worker        if self.__stripValue(self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v NCP:State')[0]) == 'associated':
512*cfb92d14SAndroid Build Coastguard Worker            print('*****OpenThreadWpan is running')
513*cfb92d14SAndroid Build Coastguard Worker            return True
514*cfb92d14SAndroid Build Coastguard Worker        else:
515*cfb92d14SAndroid Build Coastguard Worker            print('*****Wrong OpenThreadWpan state')
516*cfb92d14SAndroid Build Coastguard Worker            return False
517*cfb92d14SAndroid Build Coastguard Worker
518*cfb92d14SAndroid Build Coastguard Worker    # rloc16 might be hex string or integer, need to return actual allocated
519*cfb92d14SAndroid Build Coastguard Worker    # router id
520*cfb92d14SAndroid Build Coastguard Worker    def __convertRlocToRouterId(self, xRloc16):
521*cfb92d14SAndroid Build Coastguard Worker        """mapping Rloc16 to router id
522*cfb92d14SAndroid Build Coastguard Worker
523*cfb92d14SAndroid Build Coastguard Worker        Args:
524*cfb92d14SAndroid Build Coastguard Worker            xRloc16: hex rloc16 short address
525*cfb92d14SAndroid Build Coastguard Worker
526*cfb92d14SAndroid Build Coastguard Worker        Returns:
527*cfb92d14SAndroid Build Coastguard Worker            actual router id allocated by leader
528*cfb92d14SAndroid Build Coastguard Worker        """
529*cfb92d14SAndroid Build Coastguard Worker        routerList = []
530*cfb92d14SAndroid Build Coastguard Worker        routerList = self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v Thread:RouterTable')
531*cfb92d14SAndroid Build Coastguard Worker        print(routerList)
532*cfb92d14SAndroid Build Coastguard Worker        print(xRloc16)
533*cfb92d14SAndroid Build Coastguard Worker
534*cfb92d14SAndroid Build Coastguard Worker        for line in routerList:
535*cfb92d14SAndroid Build Coastguard Worker            if re.match(r'\[|\]', line):
536*cfb92d14SAndroid Build Coastguard Worker                continue
537*cfb92d14SAndroid Build Coastguard Worker            if re.match(self.prompt, line, re.M | re.I):
538*cfb92d14SAndroid Build Coastguard Worker                break
539*cfb92d14SAndroid Build Coastguard Worker            router = []
540*cfb92d14SAndroid Build Coastguard Worker            router = self.__stripValue(line).split(',')
541*cfb92d14SAndroid Build Coastguard Worker
542*cfb92d14SAndroid Build Coastguard Worker            for item in router:
543*cfb92d14SAndroid Build Coastguard Worker                if 'RouterId' in item:
544*cfb92d14SAndroid Build Coastguard Worker                    routerid = item.split(':')[1]
545*cfb92d14SAndroid Build Coastguard Worker                elif 'RLOC16' in line:
546*cfb92d14SAndroid Build Coastguard Worker                    rloc16 = line.split(':')[1]
547*cfb92d14SAndroid Build Coastguard Worker                else:
548*cfb92d14SAndroid Build Coastguard Worker                    pass
549*cfb92d14SAndroid Build Coastguard Worker
550*cfb92d14SAndroid Build Coastguard Worker            # process input rloc16
551*cfb92d14SAndroid Build Coastguard Worker            if isinstance(xRloc16, str):
552*cfb92d14SAndroid Build Coastguard Worker                rloc16 = '0x' + rloc16
553*cfb92d14SAndroid Build Coastguard Worker                if rloc16 == xRloc16:
554*cfb92d14SAndroid Build Coastguard Worker                    return routerid
555*cfb92d14SAndroid Build Coastguard Worker            elif isinstance(xRloc16, int):
556*cfb92d14SAndroid Build Coastguard Worker                if int(rloc16, 16) == xRloc16:
557*cfb92d14SAndroid Build Coastguard Worker                    return routerid
558*cfb92d14SAndroid Build Coastguard Worker            else:
559*cfb92d14SAndroid Build Coastguard Worker                pass
560*cfb92d14SAndroid Build Coastguard Worker
561*cfb92d14SAndroid Build Coastguard Worker        return None
562*cfb92d14SAndroid Build Coastguard Worker
563*cfb92d14SAndroid Build Coastguard Worker    def __convertIp6PrefixStringToIp6Address(self, strIp6Prefix):
564*cfb92d14SAndroid Build Coastguard Worker        """convert IPv6 prefix string to IPv6 dotted-quad format
565*cfb92d14SAndroid Build Coastguard Worker           for example:
566*cfb92d14SAndroid Build Coastguard Worker           2001000000000000 -> 2001:0000:0000:0000::
567*cfb92d14SAndroid Build Coastguard Worker
568*cfb92d14SAndroid Build Coastguard Worker        Args:
569*cfb92d14SAndroid Build Coastguard Worker            strIp6Prefix: IPv6 address string
570*cfb92d14SAndroid Build Coastguard Worker
571*cfb92d14SAndroid Build Coastguard Worker        Returns:
572*cfb92d14SAndroid Build Coastguard Worker            IPv6 address dotted-quad format
573*cfb92d14SAndroid Build Coastguard Worker        """
574*cfb92d14SAndroid Build Coastguard Worker        prefix1 = strIp6Prefix.rstrip('L')
575*cfb92d14SAndroid Build Coastguard Worker        prefix2 = self.__lstrip0x(prefix1)
576*cfb92d14SAndroid Build Coastguard Worker        hexPrefix = str(prefix2).ljust(16, '0')
577*cfb92d14SAndroid Build Coastguard Worker        hexIter = iter(hexPrefix)
578*cfb92d14SAndroid Build Coastguard Worker        finalMac = ':'.join(a + b + c + d for a, b, c, d in zip(hexIter, hexIter, hexIter, hexIter))
579*cfb92d14SAndroid Build Coastguard Worker        prefix = str(finalMac)
580*cfb92d14SAndroid Build Coastguard Worker        strIp6Prefix = prefix[:19]
581*cfb92d14SAndroid Build Coastguard Worker        return strIp6Prefix + '::'
582*cfb92d14SAndroid Build Coastguard Worker
583*cfb92d14SAndroid Build Coastguard Worker    def __convertLongToHex(self, iValue, fillZeros=None):
584*cfb92d14SAndroid Build Coastguard Worker        """convert a long hex integer to string
585*cfb92d14SAndroid Build Coastguard Worker           remove '0x' and 'L' return string
586*cfb92d14SAndroid Build Coastguard Worker
587*cfb92d14SAndroid Build Coastguard Worker        Args:
588*cfb92d14SAndroid Build Coastguard Worker            iValue: long integer in hex format
589*cfb92d14SAndroid Build Coastguard Worker            fillZeros: pad string with zeros on the left to specified width
590*cfb92d14SAndroid Build Coastguard Worker
591*cfb92d14SAndroid Build Coastguard Worker        Returns:
592*cfb92d14SAndroid Build Coastguard Worker            string of this long integer without '0x' and 'L'
593*cfb92d14SAndroid Build Coastguard Worker        """
594*cfb92d14SAndroid Build Coastguard Worker        fmt = '%x'
595*cfb92d14SAndroid Build Coastguard Worker        if fillZeros is not None:
596*cfb92d14SAndroid Build Coastguard Worker            fmt = '%%0%dx' % fillZeros
597*cfb92d14SAndroid Build Coastguard Worker
598*cfb92d14SAndroid Build Coastguard Worker        return fmt % iValue
599*cfb92d14SAndroid Build Coastguard Worker
600*cfb92d14SAndroid Build Coastguard Worker    def __convertChannelMask(self, channelsArray):
601*cfb92d14SAndroid Build Coastguard Worker        """convert channelsArray to bitmask format
602*cfb92d14SAndroid Build Coastguard Worker
603*cfb92d14SAndroid Build Coastguard Worker        Args:
604*cfb92d14SAndroid Build Coastguard Worker            channelsArray: channel array (i.e. [21, 22])
605*cfb92d14SAndroid Build Coastguard Worker
606*cfb92d14SAndroid Build Coastguard Worker        Returns:
607*cfb92d14SAndroid Build Coastguard Worker            bitmask format corresponding to a given channel array
608*cfb92d14SAndroid Build Coastguard Worker        """
609*cfb92d14SAndroid Build Coastguard Worker        maskSet = 0
610*cfb92d14SAndroid Build Coastguard Worker
611*cfb92d14SAndroid Build Coastguard Worker        for eachChannel in channelsArray:
612*cfb92d14SAndroid Build Coastguard Worker            mask = 1 << eachChannel
613*cfb92d14SAndroid Build Coastguard Worker            maskSet = maskSet | mask
614*cfb92d14SAndroid Build Coastguard Worker
615*cfb92d14SAndroid Build Coastguard Worker        return maskSet
616*cfb92d14SAndroid Build Coastguard Worker
617*cfb92d14SAndroid Build Coastguard Worker    def __ChannelMaskListToStr(self, channelList):
618*cfb92d14SAndroid Build Coastguard Worker        """convert a channel list to a string
619*cfb92d14SAndroid Build Coastguard Worker
620*cfb92d14SAndroid Build Coastguard Worker        Args:
621*cfb92d14SAndroid Build Coastguard Worker            channelList: channel list (i.e. [21, 22, 23])
622*cfb92d14SAndroid Build Coastguard Worker
623*cfb92d14SAndroid Build Coastguard Worker        Returns:
624*cfb92d14SAndroid Build Coastguard Worker            a comma separated channel string (i.e. '21, 22, 23')
625*cfb92d14SAndroid Build Coastguard Worker        """
626*cfb92d14SAndroid Build Coastguard Worker        chan_mask_range = ''
627*cfb92d14SAndroid Build Coastguard Worker        if isinstance(channelList, list):
628*cfb92d14SAndroid Build Coastguard Worker            if len(channelList):
629*cfb92d14SAndroid Build Coastguard Worker                chan_mask_range = ','.join(str(chan) for chan in channelList)
630*cfb92d14SAndroid Build Coastguard Worker            else:
631*cfb92d14SAndroid Build Coastguard Worker                print('empty list')
632*cfb92d14SAndroid Build Coastguard Worker        else:
633*cfb92d14SAndroid Build Coastguard Worker            print('not a valid channel list: %s' % channelList)
634*cfb92d14SAndroid Build Coastguard Worker
635*cfb92d14SAndroid Build Coastguard Worker        return chan_mask_range
636*cfb92d14SAndroid Build Coastguard Worker
637*cfb92d14SAndroid Build Coastguard Worker    def __setChannelMask(self, channelMask):
638*cfb92d14SAndroid Build Coastguard Worker        print('call _setChannelMask')
639*cfb92d14SAndroid Build Coastguard Worker        try:
640*cfb92d14SAndroid Build Coastguard Worker            cmd = self.wpan_cmd_prefix + 'setprop NCP:ChannelMask %s' % channelMask
641*cfb92d14SAndroid Build Coastguard Worker            datasetCmd = self.wpan_cmd_prefix + 'setprop Dataset:ChannelMaskPage0 %s' % channelMask
642*cfb92d14SAndroid Build Coastguard Worker            self.hasActiveDatasetToCommit = True
643*cfb92d14SAndroid Build Coastguard Worker            return self.__sendCommand(cmd)[0] != 'Fail' and self.__sendCommand(datasetCmd)[0] != 'Fail'
644*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
645*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('setChannelMask() Error: ' + str(e))
646*cfb92d14SAndroid Build Coastguard Worker
647*cfb92d14SAndroid Build Coastguard Worker    def __setSecurityPolicy(self, securityPolicySecs, securityPolicyFlags):
648*cfb92d14SAndroid Build Coastguard Worker        print('call _setSecurityPolicy')
649*cfb92d14SAndroid Build Coastguard Worker        try:
650*cfb92d14SAndroid Build Coastguard Worker            cmd1 = self.wpan_cmd_prefix + 'setprop Dataset:SecPolicy:KeyRotation %s' % str(securityPolicySecs)
651*cfb92d14SAndroid Build Coastguard Worker            if securityPolicyFlags == 'onrc':
652*cfb92d14SAndroid Build Coastguard Worker                cmd2 = self.wpan_cmd_prefix + 'setprop Dataset:SecPolicy:Flags 0xf7'
653*cfb92d14SAndroid Build Coastguard Worker            else:
654*cfb92d14SAndroid Build Coastguard Worker                print('unknown policy flag :' + securityPolicyFlags)
655*cfb92d14SAndroid Build Coastguard Worker                return False
656*cfb92d14SAndroid Build Coastguard Worker            self.hasActiveDatasetToCommit = True
657*cfb92d14SAndroid Build Coastguard Worker            return self.__sendCommand(cmd1) != 'Fail' and self.__sendCommand(cmd2) != 'Fail'
658*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
659*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('setSecurityPolicy() Error: ' + str(e))
660*cfb92d14SAndroid Build Coastguard Worker
661*cfb92d14SAndroid Build Coastguard Worker    def __setKeySwitchGuardTime(self, iKeySwitchGuardTime):
662*cfb92d14SAndroid Build Coastguard Worker        """ set the Key switch guard time
663*cfb92d14SAndroid Build Coastguard Worker
664*cfb92d14SAndroid Build Coastguard Worker        Args:
665*cfb92d14SAndroid Build Coastguard Worker            iKeySwitchGuardTime: key switch guard time
666*cfb92d14SAndroid Build Coastguard Worker
667*cfb92d14SAndroid Build Coastguard Worker        Returns:
668*cfb92d14SAndroid Build Coastguard Worker            True: successful to set key switch guard time
669*cfb92d14SAndroid Build Coastguard Worker            False: fail to set key switch guard time
670*cfb92d14SAndroid Build Coastguard Worker        """
671*cfb92d14SAndroid Build Coastguard Worker        print('%s call setKeySwitchGuardTime' % self.port)
672*cfb92d14SAndroid Build Coastguard Worker        print(iKeySwitchGuardTime)
673*cfb92d14SAndroid Build Coastguard Worker        try:
674*cfb92d14SAndroid Build Coastguard Worker            cmd = self.wpan_cmd_prefix + 'setprop Network:KeySwitchGuardTime %s' % str(iKeySwitchGuardTime)
675*cfb92d14SAndroid Build Coastguard Worker            if self.__sendCommand(cmd)[0] != 'Fail':
676*cfb92d14SAndroid Build Coastguard Worker                time.sleep(1)
677*cfb92d14SAndroid Build Coastguard Worker                return True
678*cfb92d14SAndroid Build Coastguard Worker            else:
679*cfb92d14SAndroid Build Coastguard Worker                return False
680*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
681*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('setKeySwitchGuardTime() Error; ' + str(e))
682*cfb92d14SAndroid Build Coastguard Worker
683*cfb92d14SAndroid Build Coastguard Worker    def __getCommissionerSessionId(self):
684*cfb92d14SAndroid Build Coastguard Worker        """ get the commissioner session id allocated from Leader """
685*cfb92d14SAndroid Build Coastguard Worker        print('%s call getCommissionerSessionId' % self.port)
686*cfb92d14SAndroid Build Coastguard Worker        return self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v Commissioner:SessionId')[0]
687*cfb92d14SAndroid Build Coastguard Worker
688*cfb92d14SAndroid Build Coastguard Worker    def __getJoinerState(self):
689*cfb92d14SAndroid Build Coastguard Worker        """ get joiner state """
690*cfb92d14SAndroid Build Coastguard Worker        maxDuration = 150  # seconds
691*cfb92d14SAndroid Build Coastguard Worker        t_end = time.time() + maxDuration
692*cfb92d14SAndroid Build Coastguard Worker        while time.time() < t_end:
693*cfb92d14SAndroid Build Coastguard Worker            joinerState = self.__stripValue(self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v NCP:State')[0])
694*cfb92d14SAndroid Build Coastguard Worker            if joinerState == 'offline:commissioned':
695*cfb92d14SAndroid Build Coastguard Worker                return True
696*cfb92d14SAndroid Build Coastguard Worker            elif joinerState == 'associating:credentials-needed':
697*cfb92d14SAndroid Build Coastguard Worker                return False
698*cfb92d14SAndroid Build Coastguard Worker            else:
699*cfb92d14SAndroid Build Coastguard Worker                time.sleep(5)
700*cfb92d14SAndroid Build Coastguard Worker                continue
701*cfb92d14SAndroid Build Coastguard Worker        return False
702*cfb92d14SAndroid Build Coastguard Worker
703*cfb92d14SAndroid Build Coastguard Worker    def _connect(self):
704*cfb92d14SAndroid Build Coastguard Worker        if self.connectType == 'usb':
705*cfb92d14SAndroid Build Coastguard Worker            print('My port is %s' % self.port)
706*cfb92d14SAndroid Build Coastguard Worker            try:
707*cfb92d14SAndroid Build Coastguard Worker                self.handle = serial.Serial(self.port, 115200, timeout=0.2)
708*cfb92d14SAndroid Build Coastguard Worker            except Exception as e:
709*cfb92d14SAndroid Build Coastguard Worker                ModuleHelper.WriteIntoDebugLogger('open serial error ' + str(e))
710*cfb92d14SAndroid Build Coastguard Worker
711*cfb92d14SAndroid Build Coastguard Worker            try:
712*cfb92d14SAndroid Build Coastguard Worker                attempts = 0
713*cfb92d14SAndroid Build Coastguard Worker                user_prompted = False
714*cfb92d14SAndroid Build Coastguard Worker                pwd_prompted = False
715*cfb92d14SAndroid Build Coastguard Worker                while attempts < 10 or pwd_prompted:
716*cfb92d14SAndroid Build Coastguard Worker                    time.sleep(0.5)
717*cfb92d14SAndroid Build Coastguard Worker                    attempts = attempts + 1
718*cfb92d14SAndroid Build Coastguard Worker                    print('attempts...%d' % attempts)
719*cfb92d14SAndroid Build Coastguard Worker
720*cfb92d14SAndroid Build Coastguard Worker                    input_data = self.handle.read(self.handle.inWaiting())
721*cfb92d14SAndroid Build Coastguard Worker
722*cfb92d14SAndroid Build Coastguard Worker                    if not input_data:
723*cfb92d14SAndroid Build Coastguard Worker                        if not user_prompted:
724*cfb92d14SAndroid Build Coastguard Worker                            self.handle.write('\n')
725*cfb92d14SAndroid Build Coastguard Worker                        time.sleep(0.5)
726*cfb92d14SAndroid Build Coastguard Worker                        continue
727*cfb92d14SAndroid Build Coastguard Worker
728*cfb92d14SAndroid Build Coastguard Worker                    if 'login' in input_data:
729*cfb92d14SAndroid Build Coastguard Worker                        self.handle.write(self.username + '\n')
730*cfb92d14SAndroid Build Coastguard Worker                        time.sleep(0.3)
731*cfb92d14SAndroid Build Coastguard Worker                        print('user prompted')
732*cfb92d14SAndroid Build Coastguard Worker                        user_prompted = True
733*cfb92d14SAndroid Build Coastguard Worker
734*cfb92d14SAndroid Build Coastguard Worker                    elif 'Password' in input_data:
735*cfb92d14SAndroid Build Coastguard Worker                        print('password prompted')
736*cfb92d14SAndroid Build Coastguard Worker                        time.sleep(0.3)
737*cfb92d14SAndroid Build Coastguard Worker                        self.handle.write(self.password + '\n')
738*cfb92d14SAndroid Build Coastguard Worker                        pwd_prompted = True
739*cfb92d14SAndroid Build Coastguard Worker
740*cfb92d14SAndroid Build Coastguard Worker                    elif self.prompt in input_data:
741*cfb92d14SAndroid Build Coastguard Worker                        print('login success (serial)')
742*cfb92d14SAndroid Build Coastguard Worker                        time.sleep(0.3)
743*cfb92d14SAndroid Build Coastguard Worker                        self.deviceConnected = True
744*cfb92d14SAndroid Build Coastguard Worker                        for precmd in self.precmd:
745*cfb92d14SAndroid Build Coastguard Worker                            self.handle.write(precmd + '\n')
746*cfb92d14SAndroid Build Coastguard Worker                            time.sleep(0.3)
747*cfb92d14SAndroid Build Coastguard Worker                        time.sleep(1)
748*cfb92d14SAndroid Build Coastguard Worker                        break
749*cfb92d14SAndroid Build Coastguard Worker                if not self.deviceConnected:
750*cfb92d14SAndroid Build Coastguard Worker                    raise Exception('login fail')
751*cfb92d14SAndroid Build Coastguard Worker                else:
752*cfb92d14SAndroid Build Coastguard Worker                    self._is_net = False
753*cfb92d14SAndroid Build Coastguard Worker            except Exception as e:
754*cfb92d14SAndroid Build Coastguard Worker                ModuleHelper.WriteIntoDebugLogger('connect to serial Error: ' + str(e))
755*cfb92d14SAndroid Build Coastguard Worker
756*cfb92d14SAndroid Build Coastguard Worker        elif self.connectType == 'ip':
757*cfb92d14SAndroid Build Coastguard Worker            print('My IP: %s Port: %s' % (self.dutIpv4, self.dutPort))
758*cfb92d14SAndroid Build Coastguard Worker            try:
759*cfb92d14SAndroid Build Coastguard Worker                import paramiko
760*cfb92d14SAndroid Build Coastguard Worker
761*cfb92d14SAndroid Build Coastguard Worker                if not self.password:
762*cfb92d14SAndroid Build Coastguard Worker                    transport = paramiko.Transport((self.dutIpv4, int(self.dutPort)))
763*cfb92d14SAndroid Build Coastguard Worker                    transport.start_client()
764*cfb92d14SAndroid Build Coastguard Worker                    transport.auth_none(self.username)
765*cfb92d14SAndroid Build Coastguard Worker                    self.handle = paramiko.SSHClient()
766*cfb92d14SAndroid Build Coastguard Worker                    self.handle.set_missing_host_key_policy(paramiko.AutoAddPolicy())
767*cfb92d14SAndroid Build Coastguard Worker                    self.handle._transport = transport
768*cfb92d14SAndroid Build Coastguard Worker                else:
769*cfb92d14SAndroid Build Coastguard Worker                    self.handle = paramiko.SSHClient()
770*cfb92d14SAndroid Build Coastguard Worker                    self.handle.set_missing_host_key_policy(paramiko.AutoAddPolicy())
771*cfb92d14SAndroid Build Coastguard Worker                    self.handle.connect(self.dutIpv4,
772*cfb92d14SAndroid Build Coastguard Worker                                        port=int(self.dutPort),
773*cfb92d14SAndroid Build Coastguard Worker                                        username=self.username,
774*cfb92d14SAndroid Build Coastguard Worker                                        password=self.password)
775*cfb92d14SAndroid Build Coastguard Worker                print('login success (ssh)')
776*cfb92d14SAndroid Build Coastguard Worker                self.deviceConnected = True
777*cfb92d14SAndroid Build Coastguard Worker                for precmd in self.precmd:
778*cfb92d14SAndroid Build Coastguard Worker                    self.handle.exec_command(precmd + '\n')
779*cfb92d14SAndroid Build Coastguard Worker                    time.sleep(0.5)
780*cfb92d14SAndroid Build Coastguard Worker                self._is_net = True
781*cfb92d14SAndroid Build Coastguard Worker
782*cfb92d14SAndroid Build Coastguard Worker            except Exception as e:
783*cfb92d14SAndroid Build Coastguard Worker                ModuleHelper.WriteIntoDebugLogger('connect to ssh Error: ' + str(e))
784*cfb92d14SAndroid Build Coastguard Worker        else:
785*cfb92d14SAndroid Build Coastguard Worker            raise Exception('Unknown port schema')
786*cfb92d14SAndroid Build Coastguard Worker
787*cfb92d14SAndroid Build Coastguard Worker    def closeConnection(self):
788*cfb92d14SAndroid Build Coastguard Worker        """close current serial port connection"""
789*cfb92d14SAndroid Build Coastguard Worker        print('%s call closeConnection' % self.port)
790*cfb92d14SAndroid Build Coastguard Worker        try:
791*cfb92d14SAndroid Build Coastguard Worker            if self.handle:
792*cfb92d14SAndroid Build Coastguard Worker                self.handle.close()
793*cfb92d14SAndroid Build Coastguard Worker                self.handle = None
794*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
795*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('closeConnection() Error: ' + str(e))
796*cfb92d14SAndroid Build Coastguard Worker
797*cfb92d14SAndroid Build Coastguard Worker    def intialize(self):
798*cfb92d14SAndroid Build Coastguard Worker        """initialize the serial port with baudrate, timeout parameters"""
799*cfb92d14SAndroid Build Coastguard Worker        print('%s call intialize' % self.port)
800*cfb92d14SAndroid Build Coastguard Worker        try:
801*cfb92d14SAndroid Build Coastguard Worker            # init serial port
802*cfb92d14SAndroid Build Coastguard Worker            self.deviceConnected = False
803*cfb92d14SAndroid Build Coastguard Worker            self._connect()
804*cfb92d14SAndroid Build Coastguard Worker
805*cfb92d14SAndroid Build Coastguard Worker            if self.deviceConnected:
806*cfb92d14SAndroid Build Coastguard Worker                self.UIStatusMsg = self.getVersionNumber()
807*cfb92d14SAndroid Build Coastguard Worker                if self.firmwarePrefix not in self.UIStatusMsg:
808*cfb92d14SAndroid Build Coastguard Worker                    self.deviceConnected = False
809*cfb92d14SAndroid Build Coastguard Worker                    self.UIStatusMsg = ('Firmware Not Matching Expecting ' + self.firmwarePrefix + ' Now is ' +
810*cfb92d14SAndroid Build Coastguard Worker                                        self.UIStatusMsg)
811*cfb92d14SAndroid Build Coastguard Worker                    raise Exception('Err: OpenThread device Firmware not matching..')
812*cfb92d14SAndroid Build Coastguard Worker                self.__sendCommand(self.wpan_cmd_prefix + 'leave')
813*cfb92d14SAndroid Build Coastguard Worker                self.__sendCommand(self.wpan_cmd_prefix + 'dataset erase')
814*cfb92d14SAndroid Build Coastguard Worker            else:
815*cfb92d14SAndroid Build Coastguard Worker                raise Exception('Err: Device not connected ..')
816*cfb92d14SAndroid Build Coastguard Worker
817*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
818*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('intialize() Error: ' + str(e))
819*cfb92d14SAndroid Build Coastguard Worker
820*cfb92d14SAndroid Build Coastguard Worker    def setNetworkName(self, networkName='GRL'):
821*cfb92d14SAndroid Build Coastguard Worker        """set Thread Network name
822*cfb92d14SAndroid Build Coastguard Worker
823*cfb92d14SAndroid Build Coastguard Worker        Args:
824*cfb92d14SAndroid Build Coastguard Worker            networkName: the networkname string to be set
825*cfb92d14SAndroid Build Coastguard Worker
826*cfb92d14SAndroid Build Coastguard Worker        Returns:
827*cfb92d14SAndroid Build Coastguard Worker            True: successful to set the Thread Networkname
828*cfb92d14SAndroid Build Coastguard Worker            False: fail to set the Thread Networkname
829*cfb92d14SAndroid Build Coastguard Worker        """
830*cfb92d14SAndroid Build Coastguard Worker        print('%s call setNetworkName' % self.port)
831*cfb92d14SAndroid Build Coastguard Worker        assert '"' not in networkName
832*cfb92d14SAndroid Build Coastguard Worker
833*cfb92d14SAndroid Build Coastguard Worker        try:
834*cfb92d14SAndroid Build Coastguard Worker            cmd = self.wpan_cmd_prefix + 'setprop -s Network:Name "%s"' % networkName
835*cfb92d14SAndroid Build Coastguard Worker            datasetCmd = self.wpan_cmd_prefix + 'setprop Dataset:NetworkName "%s"' % networkName
836*cfb92d14SAndroid Build Coastguard Worker            self.hasActiveDatasetToCommit = True
837*cfb92d14SAndroid Build Coastguard Worker            return self.__sendCommand(cmd)[0] != 'Fail' and self.__sendCommand(datasetCmd)[0] != 'Fail'
838*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
839*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('setNetworkName() Error: ' + str(e))
840*cfb92d14SAndroid Build Coastguard Worker
841*cfb92d14SAndroid Build Coastguard Worker    def setChannel(self, channel=15):
842*cfb92d14SAndroid Build Coastguard Worker        """set channel of Thread device operates on.
843*cfb92d14SAndroid Build Coastguard Worker
844*cfb92d14SAndroid Build Coastguard Worker        Args:
845*cfb92d14SAndroid Build Coastguard Worker            channel:
846*cfb92d14SAndroid Build Coastguard Worker                    (0  - 10: Reserved)
847*cfb92d14SAndroid Build Coastguard Worker                    (11 - 26: 2.4GHz channels)
848*cfb92d14SAndroid Build Coastguard Worker                    (27 - 65535: Reserved)
849*cfb92d14SAndroid Build Coastguard Worker
850*cfb92d14SAndroid Build Coastguard Worker        Returns:
851*cfb92d14SAndroid Build Coastguard Worker            True: successful to set the channel
852*cfb92d14SAndroid Build Coastguard Worker            False: fail to set the channel
853*cfb92d14SAndroid Build Coastguard Worker        """
854*cfb92d14SAndroid Build Coastguard Worker        print('%s call setChannel' % self.port)
855*cfb92d14SAndroid Build Coastguard Worker
856*cfb92d14SAndroid Build Coastguard Worker        try:
857*cfb92d14SAndroid Build Coastguard Worker            cmd = self.wpan_cmd_prefix + 'setprop NCP:Channel %s' % channel
858*cfb92d14SAndroid Build Coastguard Worker            datasetCmd = self.wpan_cmd_prefix + 'setprop Dataset:Channel %s' % channel
859*cfb92d14SAndroid Build Coastguard Worker            self.hasActiveDatasetToCommit = True
860*cfb92d14SAndroid Build Coastguard Worker            return self.__sendCommand(cmd)[0] != 'Fail' and self.__sendCommand(datasetCmd)[0] != 'Fail'
861*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
862*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('setChannel() Error: ' + str(e))
863*cfb92d14SAndroid Build Coastguard Worker
864*cfb92d14SAndroid Build Coastguard Worker    def getChannel(self):
865*cfb92d14SAndroid Build Coastguard Worker        """get current channel"""
866*cfb92d14SAndroid Build Coastguard Worker        print('%s call getChannel' % self.port)
867*cfb92d14SAndroid Build Coastguard Worker        return self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v NCP:Channel')[0]
868*cfb92d14SAndroid Build Coastguard Worker
869*cfb92d14SAndroid Build Coastguard Worker    def setMAC(self, xEUI):
870*cfb92d14SAndroid Build Coastguard Worker        """set the extended address of Thread device
871*cfb92d14SAndroid Build Coastguard Worker
872*cfb92d14SAndroid Build Coastguard Worker        Args:
873*cfb92d14SAndroid Build Coastguard Worker            xEUI: extended address in hex format
874*cfb92d14SAndroid Build Coastguard Worker
875*cfb92d14SAndroid Build Coastguard Worker        Returns:
876*cfb92d14SAndroid Build Coastguard Worker            True: successful to set the extended address
877*cfb92d14SAndroid Build Coastguard Worker            False: fail to set the extended address
878*cfb92d14SAndroid Build Coastguard Worker        """
879*cfb92d14SAndroid Build Coastguard Worker        print('%s call setMAC' % self.port)
880*cfb92d14SAndroid Build Coastguard Worker
881*cfb92d14SAndroid Build Coastguard Worker        address64 = ''
882*cfb92d14SAndroid Build Coastguard Worker        try:
883*cfb92d14SAndroid Build Coastguard Worker            if not isinstance(xEUI, str):
884*cfb92d14SAndroid Build Coastguard Worker                address64 = self.__convertLongToHex(xEUI, 16)
885*cfb92d14SAndroid Build Coastguard Worker            else:
886*cfb92d14SAndroid Build Coastguard Worker                address64 = xEUI
887*cfb92d14SAndroid Build Coastguard Worker
888*cfb92d14SAndroid Build Coastguard Worker            cmd = self.wpan_cmd_prefix + 'setprop NCP:MACAddress %s' % address64
889*cfb92d14SAndroid Build Coastguard Worker
890*cfb92d14SAndroid Build Coastguard Worker            if self.__sendCommand(cmd)[0] != 'Fail':
891*cfb92d14SAndroid Build Coastguard Worker                self.mac = address64
892*cfb92d14SAndroid Build Coastguard Worker                return True
893*cfb92d14SAndroid Build Coastguard Worker            else:
894*cfb92d14SAndroid Build Coastguard Worker                return False
895*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
896*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('setMAC() Error: ' + str(e))
897*cfb92d14SAndroid Build Coastguard Worker
898*cfb92d14SAndroid Build Coastguard Worker    def getMAC(self, bType=MacType.RandomMac):
899*cfb92d14SAndroid Build Coastguard Worker        """get one specific type of MAC address
900*cfb92d14SAndroid Build Coastguard Worker           currently OpenThreadWpan only supports Random MAC address
901*cfb92d14SAndroid Build Coastguard Worker
902*cfb92d14SAndroid Build Coastguard Worker        Args:
903*cfb92d14SAndroid Build Coastguard Worker            bType: indicate which kind of MAC address is required
904*cfb92d14SAndroid Build Coastguard Worker
905*cfb92d14SAndroid Build Coastguard Worker        Returns:
906*cfb92d14SAndroid Build Coastguard Worker            specific type of MAC address
907*cfb92d14SAndroid Build Coastguard Worker        """
908*cfb92d14SAndroid Build Coastguard Worker        print('%s call getMAC' % self.port)
909*cfb92d14SAndroid Build Coastguard Worker
910*cfb92d14SAndroid Build Coastguard Worker        # if power down happens, return extended address assigned previously
911*cfb92d14SAndroid Build Coastguard Worker        if self.isPowerDown:
912*cfb92d14SAndroid Build Coastguard Worker            macAddr64 = self.mac
913*cfb92d14SAndroid Build Coastguard Worker        else:
914*cfb92d14SAndroid Build Coastguard Worker            if bType == MacType.FactoryMac:
915*cfb92d14SAndroid Build Coastguard Worker                macAddr64 = self.__stripValue(
916*cfb92d14SAndroid Build Coastguard Worker                    self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v NCP:HardwareAddress')[0])
917*cfb92d14SAndroid Build Coastguard Worker            elif bType == MacType.HashMac:
918*cfb92d14SAndroid Build Coastguard Worker                macAddr64 = self.__stripValue(
919*cfb92d14SAndroid Build Coastguard Worker                    self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v NCP:MACAddress')[0])
920*cfb92d14SAndroid Build Coastguard Worker            else:
921*cfb92d14SAndroid Build Coastguard Worker                macAddr64 = self.__stripValue(
922*cfb92d14SAndroid Build Coastguard Worker                    self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v NCP:ExtendedAddress')[0])
923*cfb92d14SAndroid Build Coastguard Worker
924*cfb92d14SAndroid Build Coastguard Worker        return int(macAddr64, 16)
925*cfb92d14SAndroid Build Coastguard Worker
926*cfb92d14SAndroid Build Coastguard Worker    def getLL64(self):
927*cfb92d14SAndroid Build Coastguard Worker        """get link local unicast IPv6 address"""
928*cfb92d14SAndroid Build Coastguard Worker        print('%s call getLL64' % self.port)
929*cfb92d14SAndroid Build Coastguard Worker        return self.__stripValue(self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v IPv6:LinkLocalAddress')[0])
930*cfb92d14SAndroid Build Coastguard Worker
931*cfb92d14SAndroid Build Coastguard Worker    def getMLEID(self):
932*cfb92d14SAndroid Build Coastguard Worker        """get mesh local endpoint identifier address"""
933*cfb92d14SAndroid Build Coastguard Worker        print('%s call getMLEID' % self.port)
934*cfb92d14SAndroid Build Coastguard Worker        return self.__stripValue(self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v IPv6:MeshLocalAddress')[0])
935*cfb92d14SAndroid Build Coastguard Worker
936*cfb92d14SAndroid Build Coastguard Worker    def getRloc16(self):
937*cfb92d14SAndroid Build Coastguard Worker        """get rloc16 short address"""
938*cfb92d14SAndroid Build Coastguard Worker        print('%s call getRloc16' % self.port)
939*cfb92d14SAndroid Build Coastguard Worker        rloc16 = self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v Thread:RLOC16')[0]
940*cfb92d14SAndroid Build Coastguard Worker        return int(rloc16, 16)
941*cfb92d14SAndroid Build Coastguard Worker
942*cfb92d14SAndroid Build Coastguard Worker    def getRloc(self):
943*cfb92d14SAndroid Build Coastguard Worker        """get router locator unicast IPv6 address"""
944*cfb92d14SAndroid Build Coastguard Worker        print('%s call getRloc' % self.port)
945*cfb92d14SAndroid Build Coastguard Worker        prefix = self.__stripValue(self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v IPv6:MeshLocalPrefix')[0])
946*cfb92d14SAndroid Build Coastguard Worker        mlprefix = prefix.split('/')[0]
947*cfb92d14SAndroid Build Coastguard Worker        rloc16 = self.__lstrip0x(self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v Thread:RLOC16')[0])
948*cfb92d14SAndroid Build Coastguard Worker
949*cfb92d14SAndroid Build Coastguard Worker        print('prefix: %s' % prefix)
950*cfb92d14SAndroid Build Coastguard Worker        print('mlprefix: %s ' % mlprefix)
951*cfb92d14SAndroid Build Coastguard Worker        print('rloc16: %s' % rloc16)
952*cfb92d14SAndroid Build Coastguard Worker
953*cfb92d14SAndroid Build Coastguard Worker        rloc = self.__padIp6Addr(mlprefix + '00ff:fe00:' + rloc16)
954*cfb92d14SAndroid Build Coastguard Worker        print('rloc: %s' % rloc)
955*cfb92d14SAndroid Build Coastguard Worker        return rloc
956*cfb92d14SAndroid Build Coastguard Worker
957*cfb92d14SAndroid Build Coastguard Worker    def getGlobal(self):
958*cfb92d14SAndroid Build Coastguard Worker        """get global unicast IPv6 address set
959*cfb92d14SAndroid Build Coastguard Worker           if configuring multiple entries
960*cfb92d14SAndroid Build Coastguard Worker        """
961*cfb92d14SAndroid Build Coastguard Worker        print('%s call getGlobal' % self.port)
962*cfb92d14SAndroid Build Coastguard Worker        globalAddrs = []
963*cfb92d14SAndroid Build Coastguard Worker
964*cfb92d14SAndroid Build Coastguard Worker        mleid = self.__stripValue(self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v IPv6:MeshLocalAddress')[0])
965*cfb92d14SAndroid Build Coastguard Worker
966*cfb92d14SAndroid Build Coastguard Worker        mleid = ModuleHelper.GetFullIpv6Address(mleid).lower()
967*cfb92d14SAndroid Build Coastguard Worker
968*cfb92d14SAndroid Build Coastguard Worker        addrs = self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v IPv6:AllAddresses')
969*cfb92d14SAndroid Build Coastguard Worker
970*cfb92d14SAndroid Build Coastguard Worker        # find rloc address firstly as a reference for current mesh local prefix as for some TCs,
971*cfb92d14SAndroid Build Coastguard Worker        # mesh local prefix may be updated through pending dataset management.
972*cfb92d14SAndroid Build Coastguard Worker        for ip6AddrItem in addrs:
973*cfb92d14SAndroid Build Coastguard Worker            if re.match(r'\[|\]', ip6AddrItem):
974*cfb92d14SAndroid Build Coastguard Worker                continue
975*cfb92d14SAndroid Build Coastguard Worker            if re.match(self.prompt, ip6AddrItem, re.M | re.I):
976*cfb92d14SAndroid Build Coastguard Worker                break
977*cfb92d14SAndroid Build Coastguard Worker            ip6AddrItem = ip6AddrItem.strip()
978*cfb92d14SAndroid Build Coastguard Worker            ip6Addr = self.__stripValue(ip6AddrItem).split(' ')[0]
979*cfb92d14SAndroid Build Coastguard Worker
980*cfb92d14SAndroid Build Coastguard Worker            fullIp = ModuleHelper.GetFullIpv6Address(ip6Addr).lower()
981*cfb92d14SAndroid Build Coastguard Worker
982*cfb92d14SAndroid Build Coastguard Worker            print('fullip %s' % fullIp)
983*cfb92d14SAndroid Build Coastguard Worker
984*cfb92d14SAndroid Build Coastguard Worker            if fullIp.startswith('fe80'):
985*cfb92d14SAndroid Build Coastguard Worker                continue
986*cfb92d14SAndroid Build Coastguard Worker
987*cfb92d14SAndroid Build Coastguard Worker            if fullIp.startswith(mleid[0:19]):
988*cfb92d14SAndroid Build Coastguard Worker                continue
989*cfb92d14SAndroid Build Coastguard Worker
990*cfb92d14SAndroid Build Coastguard Worker            print('global')
991*cfb92d14SAndroid Build Coastguard Worker            globalAddrs.append(fullIp)
992*cfb92d14SAndroid Build Coastguard Worker
993*cfb92d14SAndroid Build Coastguard Worker        return globalAddrs
994*cfb92d14SAndroid Build Coastguard Worker
995*cfb92d14SAndroid Build Coastguard Worker    def setNetworkKey(self, key):
996*cfb92d14SAndroid Build Coastguard Worker        """set Thread network key
997*cfb92d14SAndroid Build Coastguard Worker
998*cfb92d14SAndroid Build Coastguard Worker        Args:
999*cfb92d14SAndroid Build Coastguard Worker            key: Thread network key used in secure the MLE/802.15.4 packet
1000*cfb92d14SAndroid Build Coastguard Worker
1001*cfb92d14SAndroid Build Coastguard Worker        Returns:
1002*cfb92d14SAndroid Build Coastguard Worker            True: successful to set the Thread network key
1003*cfb92d14SAndroid Build Coastguard Worker            False: fail to set the Thread network key
1004*cfb92d14SAndroid Build Coastguard Worker        """
1005*cfb92d14SAndroid Build Coastguard Worker        networkKey = ''
1006*cfb92d14SAndroid Build Coastguard Worker        print('%s call setNetworkKey' % self.port)
1007*cfb92d14SAndroid Build Coastguard Worker
1008*cfb92d14SAndroid Build Coastguard Worker        try:
1009*cfb92d14SAndroid Build Coastguard Worker            if not isinstance(key, str):
1010*cfb92d14SAndroid Build Coastguard Worker                networkKey = self.__convertLongToHex(key, 32)
1011*cfb92d14SAndroid Build Coastguard Worker                cmd = self.wpan_cmd_prefix + 'setprop Network:Key %s' % networkKey
1012*cfb92d14SAndroid Build Coastguard Worker                datasetCmd = self.wpan_cmd_prefix + 'setprop Dataset:NetworkKey %s' % networkKey
1013*cfb92d14SAndroid Build Coastguard Worker            else:
1014*cfb92d14SAndroid Build Coastguard Worker                networkKey = key
1015*cfb92d14SAndroid Build Coastguard Worker                cmd = self.wpan_cmd_prefix + 'setprop Network:Key %s' % networkKey
1016*cfb92d14SAndroid Build Coastguard Worker                datasetCmd = self.wpan_cmd_prefix + 'setprop Dataset:NetworkKey %s' % networkKey
1017*cfb92d14SAndroid Build Coastguard Worker
1018*cfb92d14SAndroid Build Coastguard Worker            self.networkKey = networkKey
1019*cfb92d14SAndroid Build Coastguard Worker            self.hasActiveDatasetToCommit = True
1020*cfb92d14SAndroid Build Coastguard Worker            return self.__sendCommand(cmd)[0] != 'Fail' and self.__sendCommand(datasetCmd)[0] != 'Fail'
1021*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
1022*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('setNetworkkey() Error: ' + str(e))
1023*cfb92d14SAndroid Build Coastguard Worker
1024*cfb92d14SAndroid Build Coastguard Worker    def addBlockedMAC(self, xEUI):
1025*cfb92d14SAndroid Build Coastguard Worker        """add a given extended address to the denylist entry
1026*cfb92d14SAndroid Build Coastguard Worker
1027*cfb92d14SAndroid Build Coastguard Worker        Args:
1028*cfb92d14SAndroid Build Coastguard Worker            xEUI: extended address in hex format
1029*cfb92d14SAndroid Build Coastguard Worker
1030*cfb92d14SAndroid Build Coastguard Worker        Returns:
1031*cfb92d14SAndroid Build Coastguard Worker            True: successful to add a given extended address to the denylist entry
1032*cfb92d14SAndroid Build Coastguard Worker            False: fail to add a given extended address to the denylist entry
1033*cfb92d14SAndroid Build Coastguard Worker        """
1034*cfb92d14SAndroid Build Coastguard Worker        print('%s call addBlockedMAC' % self.port)
1035*cfb92d14SAndroid Build Coastguard Worker        print(xEUI)
1036*cfb92d14SAndroid Build Coastguard Worker        if isinstance(xEUI, str):
1037*cfb92d14SAndroid Build Coastguard Worker            macAddr = xEUI
1038*cfb92d14SAndroid Build Coastguard Worker        else:
1039*cfb92d14SAndroid Build Coastguard Worker            macAddr = self.__convertLongToHex(xEUI)
1040*cfb92d14SAndroid Build Coastguard Worker
1041*cfb92d14SAndroid Build Coastguard Worker        try:
1042*cfb92d14SAndroid Build Coastguard Worker            # if blocked device is itself
1043*cfb92d14SAndroid Build Coastguard Worker            if macAddr == self.mac:
1044*cfb92d14SAndroid Build Coastguard Worker                print('block device itself')
1045*cfb92d14SAndroid Build Coastguard Worker                return True
1046*cfb92d14SAndroid Build Coastguard Worker
1047*cfb92d14SAndroid Build Coastguard Worker            if self._addressfilterMode != 'denylist':
1048*cfb92d14SAndroid Build Coastguard Worker                self.__setAddressfilterMode('denylist')
1049*cfb92d14SAndroid Build Coastguard Worker
1050*cfb92d14SAndroid Build Coastguard Worker            cmd = self.wpan_cmd_prefix + 'insert MAC:Denylist:Entries %s' % macAddr
1051*cfb92d14SAndroid Build Coastguard Worker            ret = self.__sendCommand(cmd)[0] != 'Fail'
1052*cfb92d14SAndroid Build Coastguard Worker
1053*cfb92d14SAndroid Build Coastguard Worker            self._addressfilterSet.add(macAddr)
1054*cfb92d14SAndroid Build Coastguard Worker            print('current denylist entries:')
1055*cfb92d14SAndroid Build Coastguard Worker            for addr in self._addressfilterSet:
1056*cfb92d14SAndroid Build Coastguard Worker                print(addr)
1057*cfb92d14SAndroid Build Coastguard Worker
1058*cfb92d14SAndroid Build Coastguard Worker            return ret
1059*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
1060*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('addBlockedMAC() Error: ' + str(e))
1061*cfb92d14SAndroid Build Coastguard Worker
1062*cfb92d14SAndroid Build Coastguard Worker    def addAllowMAC(self, xEUI):
1063*cfb92d14SAndroid Build Coastguard Worker        """add a given extended address to the allowlist addressfilter
1064*cfb92d14SAndroid Build Coastguard Worker
1065*cfb92d14SAndroid Build Coastguard Worker        Args:
1066*cfb92d14SAndroid Build Coastguard Worker            xEUI: a given extended address in hex format
1067*cfb92d14SAndroid Build Coastguard Worker
1068*cfb92d14SAndroid Build Coastguard Worker        Returns:
1069*cfb92d14SAndroid Build Coastguard Worker            True: successful to add a given extended address to the allowlist entry
1070*cfb92d14SAndroid Build Coastguard Worker            False: fail to add a given extended address to the allowlist entry
1071*cfb92d14SAndroid Build Coastguard Worker        """
1072*cfb92d14SAndroid Build Coastguard Worker        print('%s call addAllowMAC' % self.port)
1073*cfb92d14SAndroid Build Coastguard Worker        print(xEUI)
1074*cfb92d14SAndroid Build Coastguard Worker        if isinstance(xEUI, str):
1075*cfb92d14SAndroid Build Coastguard Worker            macAddr = xEUI
1076*cfb92d14SAndroid Build Coastguard Worker        else:
1077*cfb92d14SAndroid Build Coastguard Worker            macAddr = self.__convertLongToHex(xEUI)
1078*cfb92d14SAndroid Build Coastguard Worker
1079*cfb92d14SAndroid Build Coastguard Worker        try:
1080*cfb92d14SAndroid Build Coastguard Worker            if self._addressfilterMode != 'allowlist':
1081*cfb92d14SAndroid Build Coastguard Worker                self.__setAddressfilterMode('allowlist')
1082*cfb92d14SAndroid Build Coastguard Worker
1083*cfb92d14SAndroid Build Coastguard Worker            cmd = self.wpan_cmd_prefix + 'insert MAC:Allowlist:Entries %s' % macAddr
1084*cfb92d14SAndroid Build Coastguard Worker            ret = self.__sendCommand(cmd)[0] != 'Fail'
1085*cfb92d14SAndroid Build Coastguard Worker
1086*cfb92d14SAndroid Build Coastguard Worker            self._addressfilterSet.add(macAddr)
1087*cfb92d14SAndroid Build Coastguard Worker            print('current allowlist entries:')
1088*cfb92d14SAndroid Build Coastguard Worker            for addr in self._addressfilterSet:
1089*cfb92d14SAndroid Build Coastguard Worker                print(addr)
1090*cfb92d14SAndroid Build Coastguard Worker            return ret
1091*cfb92d14SAndroid Build Coastguard Worker
1092*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
1093*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('addAllowMAC() Error: ' + str(e))
1094*cfb92d14SAndroid Build Coastguard Worker
1095*cfb92d14SAndroid Build Coastguard Worker    def clearBlockList(self):
1096*cfb92d14SAndroid Build Coastguard Worker        """clear all entries in denylist table
1097*cfb92d14SAndroid Build Coastguard Worker
1098*cfb92d14SAndroid Build Coastguard Worker        Returns:
1099*cfb92d14SAndroid Build Coastguard Worker            True: successful to clear the denylist
1100*cfb92d14SAndroid Build Coastguard Worker            False: fail to clear the denylist
1101*cfb92d14SAndroid Build Coastguard Worker        """
1102*cfb92d14SAndroid Build Coastguard Worker        print('%s call clearBlockList' % self.port)
1103*cfb92d14SAndroid Build Coastguard Worker
1104*cfb92d14SAndroid Build Coastguard Worker        # remove all entries in denylist
1105*cfb92d14SAndroid Build Coastguard Worker        try:
1106*cfb92d14SAndroid Build Coastguard Worker            print('clearing denylist entries:')
1107*cfb92d14SAndroid Build Coastguard Worker            for addr in self._addressfilterSet:
1108*cfb92d14SAndroid Build Coastguard Worker                print(addr)
1109*cfb92d14SAndroid Build Coastguard Worker
1110*cfb92d14SAndroid Build Coastguard Worker            # disable denylist
1111*cfb92d14SAndroid Build Coastguard Worker            if self.__setAddressfilterMode('disable'):
1112*cfb92d14SAndroid Build Coastguard Worker                # clear ops
1113*cfb92d14SAndroid Build Coastguard Worker                for addr in self._addressfilterSet:
1114*cfb92d14SAndroid Build Coastguard Worker                    cmd = self.wpan_cmd_prefix + 'remove MAC:Denylist:Entries ' + addr
1115*cfb92d14SAndroid Build Coastguard Worker                    self.__sendCommand(cmd)
1116*cfb92d14SAndroid Build Coastguard Worker
1117*cfb92d14SAndroid Build Coastguard Worker                self._addressfilterSet.clear()
1118*cfb92d14SAndroid Build Coastguard Worker                return True
1119*cfb92d14SAndroid Build Coastguard Worker
1120*cfb92d14SAndroid Build Coastguard Worker            return False
1121*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
1122*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('clearBlockList() Error: ' + str(e))
1123*cfb92d14SAndroid Build Coastguard Worker
1124*cfb92d14SAndroid Build Coastguard Worker    def clearAllowList(self):
1125*cfb92d14SAndroid Build Coastguard Worker        """clear all entries in allowlist table
1126*cfb92d14SAndroid Build Coastguard Worker
1127*cfb92d14SAndroid Build Coastguard Worker        Returns:
1128*cfb92d14SAndroid Build Coastguard Worker            True: successful to clear the allowlist
1129*cfb92d14SAndroid Build Coastguard Worker            False: fail to clear the allowlist
1130*cfb92d14SAndroid Build Coastguard Worker        """
1131*cfb92d14SAndroid Build Coastguard Worker        print('%s call clearAllowList' % self.port)
1132*cfb92d14SAndroid Build Coastguard Worker
1133*cfb92d14SAndroid Build Coastguard Worker        # remove all entries in allowlist
1134*cfb92d14SAndroid Build Coastguard Worker        try:
1135*cfb92d14SAndroid Build Coastguard Worker            print('clearing allowlist entries:')
1136*cfb92d14SAndroid Build Coastguard Worker            for addr in self._addressfilterSet:
1137*cfb92d14SAndroid Build Coastguard Worker                print(addr)
1138*cfb92d14SAndroid Build Coastguard Worker
1139*cfb92d14SAndroid Build Coastguard Worker            # disable allowlist
1140*cfb92d14SAndroid Build Coastguard Worker            if self.__setAddressfilterMode('disable'):
1141*cfb92d14SAndroid Build Coastguard Worker                # clear ops
1142*cfb92d14SAndroid Build Coastguard Worker                for addr in self._addressfilterSet:
1143*cfb92d14SAndroid Build Coastguard Worker                    cmd = self.wpan_cmd_prefix + 'remove MAC:Allowlist:Entries ' + addr
1144*cfb92d14SAndroid Build Coastguard Worker                    self.__sendCommand(cmd)
1145*cfb92d14SAndroid Build Coastguard Worker
1146*cfb92d14SAndroid Build Coastguard Worker                self._addressfilterSet.clear()
1147*cfb92d14SAndroid Build Coastguard Worker                return True
1148*cfb92d14SAndroid Build Coastguard Worker
1149*cfb92d14SAndroid Build Coastguard Worker            return False
1150*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
1151*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('clearAllowList() Error: ' + str(e))
1152*cfb92d14SAndroid Build Coastguard Worker
1153*cfb92d14SAndroid Build Coastguard Worker    def getDeviceRole(self):
1154*cfb92d14SAndroid Build Coastguard Worker        """get current device role in Thread Network"""
1155*cfb92d14SAndroid Build Coastguard Worker        print('%s call getDeviceRole' % self.port)
1156*cfb92d14SAndroid Build Coastguard Worker        return self.__stripValue(self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v Network:NodeType')[0])
1157*cfb92d14SAndroid Build Coastguard Worker
1158*cfb92d14SAndroid Build Coastguard Worker    def joinNetwork(self, eRoleId):
1159*cfb92d14SAndroid Build Coastguard Worker        """make device ready to join the Thread Network with a given role
1160*cfb92d14SAndroid Build Coastguard Worker
1161*cfb92d14SAndroid Build Coastguard Worker        Args:
1162*cfb92d14SAndroid Build Coastguard Worker            eRoleId: a given device role id
1163*cfb92d14SAndroid Build Coastguard Worker
1164*cfb92d14SAndroid Build Coastguard Worker        Returns:
1165*cfb92d14SAndroid Build Coastguard Worker            True: ready to set Thread Network parameter for joining desired Network
1166*cfb92d14SAndroid Build Coastguard Worker        """
1167*cfb92d14SAndroid Build Coastguard Worker        print('%s call joinNetwork' % self.port)
1168*cfb92d14SAndroid Build Coastguard Worker        print(eRoleId)
1169*cfb92d14SAndroid Build Coastguard Worker
1170*cfb92d14SAndroid Build Coastguard Worker        self.deviceRole = eRoleId
1171*cfb92d14SAndroid Build Coastguard Worker        mode = 15
1172*cfb92d14SAndroid Build Coastguard Worker        try:
1173*cfb92d14SAndroid Build Coastguard Worker            if ModuleHelper.LeaderDutChannelFound:
1174*cfb92d14SAndroid Build Coastguard Worker                self.channel = ModuleHelper.Default_Channel
1175*cfb92d14SAndroid Build Coastguard Worker
1176*cfb92d14SAndroid Build Coastguard Worker            # FIXME: when Harness call setNetworkDataRequirement()?
1177*cfb92d14SAndroid Build Coastguard Worker            # only sleep end device requires stable networkdata now
1178*cfb92d14SAndroid Build Coastguard Worker            if eRoleId == Thread_Device_Role.Leader:
1179*cfb92d14SAndroid Build Coastguard Worker                print('join as leader')
1180*cfb92d14SAndroid Build Coastguard Worker                # rdn
1181*cfb92d14SAndroid Build Coastguard Worker                mode = 15
1182*cfb92d14SAndroid Build Coastguard Worker                if self.AutoDUTEnable is False:
1183*cfb92d14SAndroid Build Coastguard Worker                    # set ROUTER_DOWNGRADE_THRESHOLD
1184*cfb92d14SAndroid Build Coastguard Worker                    self.__setRouterDowngradeThreshold(33)
1185*cfb92d14SAndroid Build Coastguard Worker            elif eRoleId == Thread_Device_Role.Router:
1186*cfb92d14SAndroid Build Coastguard Worker                print('join as router')
1187*cfb92d14SAndroid Build Coastguard Worker                # rdn
1188*cfb92d14SAndroid Build Coastguard Worker                mode = 15
1189*cfb92d14SAndroid Build Coastguard Worker                if self.AutoDUTEnable is False:
1190*cfb92d14SAndroid Build Coastguard Worker                    # set ROUTER_DOWNGRADE_THRESHOLD
1191*cfb92d14SAndroid Build Coastguard Worker                    self.__setRouterDowngradeThreshold(33)
1192*cfb92d14SAndroid Build Coastguard Worker            elif eRoleId == Thread_Device_Role.SED:
1193*cfb92d14SAndroid Build Coastguard Worker                print('join as sleepy end device')
1194*cfb92d14SAndroid Build Coastguard Worker                # s
1195*cfb92d14SAndroid Build Coastguard Worker                mode = 4
1196*cfb92d14SAndroid Build Coastguard Worker                self.__setPollPeriod(self.__sedPollPeriod)
1197*cfb92d14SAndroid Build Coastguard Worker            elif eRoleId == Thread_Device_Role.EndDevice:
1198*cfb92d14SAndroid Build Coastguard Worker                print('join as end device')
1199*cfb92d14SAndroid Build Coastguard Worker                # rn
1200*cfb92d14SAndroid Build Coastguard Worker                mode = 13
1201*cfb92d14SAndroid Build Coastguard Worker            elif eRoleId == Thread_Device_Role.REED:
1202*cfb92d14SAndroid Build Coastguard Worker                print('join as REED')
1203*cfb92d14SAndroid Build Coastguard Worker                # rdn
1204*cfb92d14SAndroid Build Coastguard Worker                mode = 15
1205*cfb92d14SAndroid Build Coastguard Worker                # set ROUTER_UPGRADE_THRESHOLD
1206*cfb92d14SAndroid Build Coastguard Worker                self.__setRouterUpgradeThreshold(0)
1207*cfb92d14SAndroid Build Coastguard Worker            elif eRoleId == Thread_Device_Role.EndDevice_FED:
1208*cfb92d14SAndroid Build Coastguard Worker                # always remain an ED, never request to be a router
1209*cfb92d14SAndroid Build Coastguard Worker                print('join as FED')
1210*cfb92d14SAndroid Build Coastguard Worker                # rdn
1211*cfb92d14SAndroid Build Coastguard Worker                mode = 15
1212*cfb92d14SAndroid Build Coastguard Worker                # set ROUTER_UPGRADE_THRESHOLD
1213*cfb92d14SAndroid Build Coastguard Worker                self.__setRouterUpgradeThreshold(0)
1214*cfb92d14SAndroid Build Coastguard Worker            elif eRoleId == Thread_Device_Role.EndDevice_MED:
1215*cfb92d14SAndroid Build Coastguard Worker                print('join as MED')
1216*cfb92d14SAndroid Build Coastguard Worker                # rn
1217*cfb92d14SAndroid Build Coastguard Worker                mode = 13
1218*cfb92d14SAndroid Build Coastguard Worker            else:
1219*cfb92d14SAndroid Build Coastguard Worker                pass
1220*cfb92d14SAndroid Build Coastguard Worker
1221*cfb92d14SAndroid Build Coastguard Worker            # set Thread device mode with a given role
1222*cfb92d14SAndroid Build Coastguard Worker            self.__setDeviceMode(mode)
1223*cfb92d14SAndroid Build Coastguard Worker            time.sleep(0.1)
1224*cfb92d14SAndroid Build Coastguard Worker            # start OpenThreadWpan
1225*cfb92d14SAndroid Build Coastguard Worker            self.__startOpenThreadWpan()
1226*cfb92d14SAndroid Build Coastguard Worker            time.sleep(3)
1227*cfb92d14SAndroid Build Coastguard Worker            return True
1228*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
1229*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('joinNetwork() Error: ' + str(e))
1230*cfb92d14SAndroid Build Coastguard Worker
1231*cfb92d14SAndroid Build Coastguard Worker    def getNetworkFragmentID(self):
1232*cfb92d14SAndroid Build Coastguard Worker        """get current partition id of Thread Network Partition from LeaderData
1233*cfb92d14SAndroid Build Coastguard Worker
1234*cfb92d14SAndroid Build Coastguard Worker        Returns:
1235*cfb92d14SAndroid Build Coastguard Worker            The Thread network Partition Id
1236*cfb92d14SAndroid Build Coastguard Worker        """
1237*cfb92d14SAndroid Build Coastguard Worker        print('%s call getNetworkFragmentID' % self.port)
1238*cfb92d14SAndroid Build Coastguard Worker        if not self.____isOpenThreadWpanRunning():
1239*cfb92d14SAndroid Build Coastguard Worker            print('OpenThreadWpan is not running')
1240*cfb92d14SAndroid Build Coastguard Worker            return None
1241*cfb92d14SAndroid Build Coastguard Worker
1242*cfb92d14SAndroid Build Coastguard Worker        return self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v Network:PartitionId')[0]
1243*cfb92d14SAndroid Build Coastguard Worker
1244*cfb92d14SAndroid Build Coastguard Worker    def getParentAddress(self):
1245*cfb92d14SAndroid Build Coastguard Worker        """get Thread device's parent extended address and rloc16 short address
1246*cfb92d14SAndroid Build Coastguard Worker
1247*cfb92d14SAndroid Build Coastguard Worker        Returns:
1248*cfb92d14SAndroid Build Coastguard Worker            The extended address of parent in hex format
1249*cfb92d14SAndroid Build Coastguard Worker        """
1250*cfb92d14SAndroid Build Coastguard Worker        print('%s call getParentAddress' % self.port)
1251*cfb92d14SAndroid Build Coastguard Worker        parentInfo = []
1252*cfb92d14SAndroid Build Coastguard Worker        parentInfo = self.__stripValue(self.__sendCommand(self.wpan_cmd_prefix +
1253*cfb92d14SAndroid Build Coastguard Worker                                                          'getprop -v Thread:Parent')).split(' ')
1254*cfb92d14SAndroid Build Coastguard Worker
1255*cfb92d14SAndroid Build Coastguard Worker        return parentInfo[0]
1256*cfb92d14SAndroid Build Coastguard Worker
1257*cfb92d14SAndroid Build Coastguard Worker    def powerDown(self):
1258*cfb92d14SAndroid Build Coastguard Worker        """power down the OpenThreadWpan"""
1259*cfb92d14SAndroid Build Coastguard Worker        print('%s call powerDown' % self.port)
1260*cfb92d14SAndroid Build Coastguard Worker        if self.__sendCommand(self.wpan_cmd_prefix + 'setprop Daemon:AutoAssociateAfterReset false')[0] != 'Fail':
1261*cfb92d14SAndroid Build Coastguard Worker            time.sleep(0.5)
1262*cfb92d14SAndroid Build Coastguard Worker            if self.__sendCommand(self.wpan_cmd_prefix + 'reset')[0] != 'Fail':
1263*cfb92d14SAndroid Build Coastguard Worker                self.isPowerDown = True
1264*cfb92d14SAndroid Build Coastguard Worker                return True
1265*cfb92d14SAndroid Build Coastguard Worker            else:
1266*cfb92d14SAndroid Build Coastguard Worker                return False
1267*cfb92d14SAndroid Build Coastguard Worker        else:
1268*cfb92d14SAndroid Build Coastguard Worker            return False
1269*cfb92d14SAndroid Build Coastguard Worker
1270*cfb92d14SAndroid Build Coastguard Worker    def powerUp(self):
1271*cfb92d14SAndroid Build Coastguard Worker        """power up the Thread device"""
1272*cfb92d14SAndroid Build Coastguard Worker        print('%s call powerUp' % self.port)
1273*cfb92d14SAndroid Build Coastguard Worker        if not self.handle:
1274*cfb92d14SAndroid Build Coastguard Worker            self._connect()
1275*cfb92d14SAndroid Build Coastguard Worker
1276*cfb92d14SAndroid Build Coastguard Worker        self.isPowerDown = False
1277*cfb92d14SAndroid Build Coastguard Worker        if self.__sendCommand(self.wpan_cmd_prefix + 'attach')[0] != 'Fail':
1278*cfb92d14SAndroid Build Coastguard Worker            time.sleep(3)
1279*cfb92d14SAndroid Build Coastguard Worker        else:
1280*cfb92d14SAndroid Build Coastguard Worker            return False
1281*cfb92d14SAndroid Build Coastguard Worker
1282*cfb92d14SAndroid Build Coastguard Worker        if self.__sendCommand(self.wpan_cmd_prefix + 'setprop Daemon:AutoAssociateAfterReset true')[0] == 'Fail':
1283*cfb92d14SAndroid Build Coastguard Worker            return False
1284*cfb92d14SAndroid Build Coastguard Worker
1285*cfb92d14SAndroid Build Coastguard Worker        if self.__stripValue(self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v NCP:State')[0]) != 'associated':
1286*cfb92d14SAndroid Build Coastguard Worker            print('powerUp failed')
1287*cfb92d14SAndroid Build Coastguard Worker            return False
1288*cfb92d14SAndroid Build Coastguard Worker        else:
1289*cfb92d14SAndroid Build Coastguard Worker            return True
1290*cfb92d14SAndroid Build Coastguard Worker
1291*cfb92d14SAndroid Build Coastguard Worker    def reboot(self):
1292*cfb92d14SAndroid Build Coastguard Worker        """reset and rejoin to Thread Network without any timeout
1293*cfb92d14SAndroid Build Coastguard Worker
1294*cfb92d14SAndroid Build Coastguard Worker        Returns:
1295*cfb92d14SAndroid Build Coastguard Worker            True: successful to reset and rejoin the Thread Network
1296*cfb92d14SAndroid Build Coastguard Worker            False: fail to reset and rejoin the Thread Network
1297*cfb92d14SAndroid Build Coastguard Worker        """
1298*cfb92d14SAndroid Build Coastguard Worker        print('%s call reboot' % self.port)
1299*cfb92d14SAndroid Build Coastguard Worker        try:
1300*cfb92d14SAndroid Build Coastguard Worker            self._sendline(self.wpan_cmd_prefix + 'reset')
1301*cfb92d14SAndroid Build Coastguard Worker            self.isPowerDown = True
1302*cfb92d14SAndroid Build Coastguard Worker
1303*cfb92d14SAndroid Build Coastguard Worker            if self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v NCP:State')[0] != 'associated':
1304*cfb92d14SAndroid Build Coastguard Worker                print('[FAIL] reboot')
1305*cfb92d14SAndroid Build Coastguard Worker                return False
1306*cfb92d14SAndroid Build Coastguard Worker            else:
1307*cfb92d14SAndroid Build Coastguard Worker                return True
1308*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
1309*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('reboot() Error: ' + str(e))
1310*cfb92d14SAndroid Build Coastguard Worker
1311*cfb92d14SAndroid Build Coastguard Worker    def ping(self, destination, length=20):
1312*cfb92d14SAndroid Build Coastguard Worker        """ send ICMPv6 echo request with a given length to a unicast destination
1313*cfb92d14SAndroid Build Coastguard Worker            address
1314*cfb92d14SAndroid Build Coastguard Worker
1315*cfb92d14SAndroid Build Coastguard Worker        Args:
1316*cfb92d14SAndroid Build Coastguard Worker            destination: the unicast destination address of ICMPv6 echo request
1317*cfb92d14SAndroid Build Coastguard Worker            length: the size of ICMPv6 echo request payload
1318*cfb92d14SAndroid Build Coastguard Worker        """
1319*cfb92d14SAndroid Build Coastguard Worker        print('%s call ping' % self.port)
1320*cfb92d14SAndroid Build Coastguard Worker        print('destination: %s' % destination)
1321*cfb92d14SAndroid Build Coastguard Worker        try:
1322*cfb92d14SAndroid Build Coastguard Worker            cmd = 'ping %s -c 1 -s %s -I %s' % (destination, str(length), self.wpan_interface)
1323*cfb92d14SAndroid Build Coastguard Worker            if self._is_net:
1324*cfb92d14SAndroid Build Coastguard Worker                self.handle.exec_command(cmd)
1325*cfb92d14SAndroid Build Coastguard Worker            else:
1326*cfb92d14SAndroid Build Coastguard Worker                self._sendline(cmd)
1327*cfb92d14SAndroid Build Coastguard Worker                self._expect(cmd)
1328*cfb92d14SAndroid Build Coastguard Worker            # wait echo reply
1329*cfb92d14SAndroid Build Coastguard Worker            time.sleep(1)
1330*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
1331*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('ping() Error: ' + str(e))
1332*cfb92d14SAndroid Build Coastguard Worker
1333*cfb92d14SAndroid Build Coastguard Worker    def multicast_Ping(self, destination, length=20):
1334*cfb92d14SAndroid Build Coastguard Worker        """send ICMPv6 echo request with a given length to a multicast destination
1335*cfb92d14SAndroid Build Coastguard Worker           address
1336*cfb92d14SAndroid Build Coastguard Worker
1337*cfb92d14SAndroid Build Coastguard Worker        Args:
1338*cfb92d14SAndroid Build Coastguard Worker            destination: the multicast destination address of ICMPv6 echo request
1339*cfb92d14SAndroid Build Coastguard Worker            length: the size of ICMPv6 echo request payload
1340*cfb92d14SAndroid Build Coastguard Worker        """
1341*cfb92d14SAndroid Build Coastguard Worker        print('%s call multicast_Ping' % self.port)
1342*cfb92d14SAndroid Build Coastguard Worker        print('destination: %s' % destination)
1343*cfb92d14SAndroid Build Coastguard Worker        try:
1344*cfb92d14SAndroid Build Coastguard Worker            cmd = 'ping %s -c 1 -s %s -I %s' % (destination, str(length), self.wpan_interface)
1345*cfb92d14SAndroid Build Coastguard Worker            if self._is_net:
1346*cfb92d14SAndroid Build Coastguard Worker                self.handle.exec_command(cmd)
1347*cfb92d14SAndroid Build Coastguard Worker            else:
1348*cfb92d14SAndroid Build Coastguard Worker                self._sendline(cmd)
1349*cfb92d14SAndroid Build Coastguard Worker                self._expect(cmd)
1350*cfb92d14SAndroid Build Coastguard Worker            # wait echo reply
1351*cfb92d14SAndroid Build Coastguard Worker            time.sleep(1)
1352*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
1353*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('multicast_ping() Error: ' + str(e))
1354*cfb92d14SAndroid Build Coastguard Worker
1355*cfb92d14SAndroid Build Coastguard Worker    def getVersionNumber(self):
1356*cfb92d14SAndroid Build Coastguard Worker        """get OpenThreadWpan stack firmware version number"""
1357*cfb92d14SAndroid Build Coastguard Worker        print('%s call getVersionNumber' % self.port)
1358*cfb92d14SAndroid Build Coastguard Worker        versionStr = self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v NCP:Version')[0]
1359*cfb92d14SAndroid Build Coastguard Worker
1360*cfb92d14SAndroid Build Coastguard Worker        return self.__stripValue(versionStr)
1361*cfb92d14SAndroid Build Coastguard Worker
1362*cfb92d14SAndroid Build Coastguard Worker    def setPANID(self, xPAN):
1363*cfb92d14SAndroid Build Coastguard Worker        """set Thread Network PAN ID
1364*cfb92d14SAndroid Build Coastguard Worker
1365*cfb92d14SAndroid Build Coastguard Worker        Args:
1366*cfb92d14SAndroid Build Coastguard Worker            xPAN: a given PAN ID in hex format
1367*cfb92d14SAndroid Build Coastguard Worker
1368*cfb92d14SAndroid Build Coastguard Worker        Returns:
1369*cfb92d14SAndroid Build Coastguard Worker            True: successful to set the Thread Network PAN ID
1370*cfb92d14SAndroid Build Coastguard Worker            False: fail to set the Thread Network PAN ID
1371*cfb92d14SAndroid Build Coastguard Worker        """
1372*cfb92d14SAndroid Build Coastguard Worker        print('%s call setPANID' % self.port)
1373*cfb92d14SAndroid Build Coastguard Worker        print(xPAN)
1374*cfb92d14SAndroid Build Coastguard Worker        panid = ''
1375*cfb92d14SAndroid Build Coastguard Worker        try:
1376*cfb92d14SAndroid Build Coastguard Worker            if not isinstance(xPAN, str):
1377*cfb92d14SAndroid Build Coastguard Worker                panid = str(hex(xPAN))
1378*cfb92d14SAndroid Build Coastguard Worker                print(panid)
1379*cfb92d14SAndroid Build Coastguard Worker
1380*cfb92d14SAndroid Build Coastguard Worker            cmd = self.wpan_cmd_prefix + 'setprop -s Network:PANID %s' % panid
1381*cfb92d14SAndroid Build Coastguard Worker            datasetCmd = self.wpan_cmd_prefix + 'setprop Dataset:PanId %s' % panid
1382*cfb92d14SAndroid Build Coastguard Worker            self.hasActiveDatasetToCommit = True
1383*cfb92d14SAndroid Build Coastguard Worker            return self.__sendCommand(cmd)[0] != 'Fail' and self.__sendCommand(datasetCmd)[0] != 'Fail'
1384*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
1385*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('setPANID() Error: ' + str(e))
1386*cfb92d14SAndroid Build Coastguard Worker
1387*cfb92d14SAndroid Build Coastguard Worker    def reset(self):
1388*cfb92d14SAndroid Build Coastguard Worker        """factory reset"""
1389*cfb92d14SAndroid Build Coastguard Worker        print('%s call reset' % self.port)
1390*cfb92d14SAndroid Build Coastguard Worker        try:
1391*cfb92d14SAndroid Build Coastguard Worker            if self._is_net:
1392*cfb92d14SAndroid Build Coastguard Worker                self.__sendCommand(self.wpan_cmd_prefix + 'leave')
1393*cfb92d14SAndroid Build Coastguard Worker            else:
1394*cfb92d14SAndroid Build Coastguard Worker                self._sendline(self.wpan_cmd_prefix + 'leave')
1395*cfb92d14SAndroid Build Coastguard Worker
1396*cfb92d14SAndroid Build Coastguard Worker            self.__sendCommand(self.wpan_cmd_prefix + 'dataset erase')
1397*cfb92d14SAndroid Build Coastguard Worker            time.sleep(2)
1398*cfb92d14SAndroid Build Coastguard Worker            if not self._is_net:
1399*cfb92d14SAndroid Build Coastguard Worker                self._read()
1400*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
1401*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('reset() Error: ' + str(e))
1402*cfb92d14SAndroid Build Coastguard Worker
1403*cfb92d14SAndroid Build Coastguard Worker    def removeRouter(self, xRouterId):
1404*cfb92d14SAndroid Build Coastguard Worker        """kick router with a given router id from the Thread Network
1405*cfb92d14SAndroid Build Coastguard Worker
1406*cfb92d14SAndroid Build Coastguard Worker        Args:
1407*cfb92d14SAndroid Build Coastguard Worker            xRouterId: a given router id in hex format
1408*cfb92d14SAndroid Build Coastguard Worker
1409*cfb92d14SAndroid Build Coastguard Worker        Returns:
1410*cfb92d14SAndroid Build Coastguard Worker            True: successful to remove the router from the Thread Network
1411*cfb92d14SAndroid Build Coastguard Worker            False: fail to remove the router from the Thread Network
1412*cfb92d14SAndroid Build Coastguard Worker        """
1413*cfb92d14SAndroid Build Coastguard Worker        print('%s call removeRouter' % self.port)
1414*cfb92d14SAndroid Build Coastguard Worker        print(xRouterId)
1415*cfb92d14SAndroid Build Coastguard Worker        routerId = ''
1416*cfb92d14SAndroid Build Coastguard Worker        routerId = self.__convertRlocToRouterId(xRouterId)
1417*cfb92d14SAndroid Build Coastguard Worker        print(routerId)
1418*cfb92d14SAndroid Build Coastguard Worker
1419*cfb92d14SAndroid Build Coastguard Worker        if routerId is None:
1420*cfb92d14SAndroid Build Coastguard Worker            print('no matched xRouterId')
1421*cfb92d14SAndroid Build Coastguard Worker            return False
1422*cfb92d14SAndroid Build Coastguard Worker
1423*cfb92d14SAndroid Build Coastguard Worker        try:
1424*cfb92d14SAndroid Build Coastguard Worker            cmd = 'releaserouterid %s' % routerId
1425*cfb92d14SAndroid Build Coastguard Worker            return self.__sendCommand(cmd)[0] != 'Fail'
1426*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
1427*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('removeRouter() Error: ' + str(e))
1428*cfb92d14SAndroid Build Coastguard Worker
1429*cfb92d14SAndroid Build Coastguard Worker    def setDefaultValues(self):
1430*cfb92d14SAndroid Build Coastguard Worker        """set default mandatory Thread Network parameter value"""
1431*cfb92d14SAndroid Build Coastguard Worker        print('%s call setDefaultValues' % self.port)
1432*cfb92d14SAndroid Build Coastguard Worker
1433*cfb92d14SAndroid Build Coastguard Worker        # initialize variables
1434*cfb92d14SAndroid Build Coastguard Worker        self.networkName = ModuleHelper.Default_NwkName
1435*cfb92d14SAndroid Build Coastguard Worker        assert '"' not in self.networkName
1436*cfb92d14SAndroid Build Coastguard Worker        self.networkKey = ModuleHelper.Default_NwkKey
1437*cfb92d14SAndroid Build Coastguard Worker        self.channel = ModuleHelper.Default_Channel
1438*cfb92d14SAndroid Build Coastguard Worker        self.channelMask = '0x7fff800'  # (0xffff << 11)
1439*cfb92d14SAndroid Build Coastguard Worker        self.panId = ModuleHelper.Default_PanId
1440*cfb92d14SAndroid Build Coastguard Worker        self.xpanId = ModuleHelper.Default_XpanId
1441*cfb92d14SAndroid Build Coastguard Worker        self.meshLocalPrefix = ModuleHelper.Default_MLPrefix
1442*cfb92d14SAndroid Build Coastguard Worker        # OT only accept hex format PSKc for now
1443*cfb92d14SAndroid Build Coastguard Worker        self.pskc = '00000000000000000000000000000000'
1444*cfb92d14SAndroid Build Coastguard Worker        self.securityPolicySecs = ModuleHelper.Default_SecurityPolicy
1445*cfb92d14SAndroid Build Coastguard Worker        self.securityPolicyFlags = 'onrc'
1446*cfb92d14SAndroid Build Coastguard Worker        self.activetimestamp = ModuleHelper.Default_ActiveTimestamp
1447*cfb92d14SAndroid Build Coastguard Worker        # self.sedPollingRate = ModuleHelper.Default_Harness_SED_Polling_Rate
1448*cfb92d14SAndroid Build Coastguard Worker        self.__sedPollPeriod = 3 * 1000  # in milliseconds
1449*cfb92d14SAndroid Build Coastguard Worker        self.deviceRole = None
1450*cfb92d14SAndroid Build Coastguard Worker        self.provisioningUrl = ''
1451*cfb92d14SAndroid Build Coastguard Worker        self.hasActiveDatasetToCommit = False
1452*cfb92d14SAndroid Build Coastguard Worker        self.logThread = Queue()
1453*cfb92d14SAndroid Build Coastguard Worker        self.logThreadStatus = self.logStatus['stop']
1454*cfb92d14SAndroid Build Coastguard Worker        # indicate Thread device requests full or stable network data
1455*cfb92d14SAndroid Build Coastguard Worker        self.networkDataRequirement = ''
1456*cfb92d14SAndroid Build Coastguard Worker        # indicate if Thread device experiences a power down event
1457*cfb92d14SAndroid Build Coastguard Worker        self.isPowerDown = False
1458*cfb92d14SAndroid Build Coastguard Worker        # indicate AddressFilter mode ['disable', 'allowlist', 'denylist']
1459*cfb92d14SAndroid Build Coastguard Worker        self._addressfilterMode = 'disable'
1460*cfb92d14SAndroid Build Coastguard Worker        self._addressfilterSet = set()  # cache filter entries
1461*cfb92d14SAndroid Build Coastguard Worker        # indicate if Thread device is an active commissioner
1462*cfb92d14SAndroid Build Coastguard Worker        self.isActiveCommissioner = False
1463*cfb92d14SAndroid Build Coastguard Worker        self._lines = None  # buffered lines read from device
1464*cfb92d14SAndroid Build Coastguard Worker
1465*cfb92d14SAndroid Build Coastguard Worker        # initialize device configuration
1466*cfb92d14SAndroid Build Coastguard Worker        try:
1467*cfb92d14SAndroid Build Coastguard Worker            self.setMAC(self.mac)
1468*cfb92d14SAndroid Build Coastguard Worker            self.__setChannelMask(self.channelMask)
1469*cfb92d14SAndroid Build Coastguard Worker            self.__setSecurityPolicy(self.securityPolicySecs, self.securityPolicyFlags)
1470*cfb92d14SAndroid Build Coastguard Worker            self.setChannel(self.channel)
1471*cfb92d14SAndroid Build Coastguard Worker            self.setPANID(self.panId)
1472*cfb92d14SAndroid Build Coastguard Worker            self.setXpanId(self.xpanId)
1473*cfb92d14SAndroid Build Coastguard Worker            self.setNetworkName(self.networkName)
1474*cfb92d14SAndroid Build Coastguard Worker            self.setNetworkKey(self.networkKey)
1475*cfb92d14SAndroid Build Coastguard Worker            self.setMLPrefix(self.meshLocalPrefix)
1476*cfb92d14SAndroid Build Coastguard Worker            self.setPSKc(self.pskc)
1477*cfb92d14SAndroid Build Coastguard Worker            self.setActiveTimestamp(self.activetimestamp)
1478*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
1479*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('setDefaultValue() Error: ' + str(e))
1480*cfb92d14SAndroid Build Coastguard Worker
1481*cfb92d14SAndroid Build Coastguard Worker    def getDeviceConncetionStatus(self):
1482*cfb92d14SAndroid Build Coastguard Worker        """check if serial port connection is ready or not"""
1483*cfb92d14SAndroid Build Coastguard Worker        print('%s call getDeviceConnectionStatus' % self.port)
1484*cfb92d14SAndroid Build Coastguard Worker        return self.deviceConnected
1485*cfb92d14SAndroid Build Coastguard Worker
1486*cfb92d14SAndroid Build Coastguard Worker    def setPollingRate(self, iPollingRate):
1487*cfb92d14SAndroid Build Coastguard Worker        """set data polling rate for sleepy end device
1488*cfb92d14SAndroid Build Coastguard Worker
1489*cfb92d14SAndroid Build Coastguard Worker        Args:
1490*cfb92d14SAndroid Build Coastguard Worker            iPollingRate: data poll period of sleepy end device (in seconds)
1491*cfb92d14SAndroid Build Coastguard Worker
1492*cfb92d14SAndroid Build Coastguard Worker        Returns:
1493*cfb92d14SAndroid Build Coastguard Worker            True: successful to set the data polling rate for sleepy end device
1494*cfb92d14SAndroid Build Coastguard Worker            False: fail to set the data polling rate for sleepy end device
1495*cfb92d14SAndroid Build Coastguard Worker        """
1496*cfb92d14SAndroid Build Coastguard Worker        print('%s call setPollingRate' % self.port)
1497*cfb92d14SAndroid Build Coastguard Worker
1498*cfb92d14SAndroid Build Coastguard Worker        iPollingRate = int(iPollingRate * 1000)
1499*cfb92d14SAndroid Build Coastguard Worker        print(iPollingRate)
1500*cfb92d14SAndroid Build Coastguard Worker
1501*cfb92d14SAndroid Build Coastguard Worker        if self.__sedPollPeriod != iPollingRate:
1502*cfb92d14SAndroid Build Coastguard Worker            self.__sedPollPeriod = iPollingRate
1503*cfb92d14SAndroid Build Coastguard Worker
1504*cfb92d14SAndroid Build Coastguard Worker            # apply immediately
1505*cfb92d14SAndroid Build Coastguard Worker            if self.__isOpenThreadWpanRunning():
1506*cfb92d14SAndroid Build Coastguard Worker                return self.__setPollPeriod(self.__sedPollPeriod)
1507*cfb92d14SAndroid Build Coastguard Worker
1508*cfb92d14SAndroid Build Coastguard Worker        return True
1509*cfb92d14SAndroid Build Coastguard Worker
1510*cfb92d14SAndroid Build Coastguard Worker    def __setPollPeriod(self, iPollPeriod):
1511*cfb92d14SAndroid Build Coastguard Worker        """set data poll period for sleepy end device
1512*cfb92d14SAndroid Build Coastguard Worker
1513*cfb92d14SAndroid Build Coastguard Worker        Args:
1514*cfb92d14SAndroid Build Coastguard Worker            iPollPeriod: data poll period of sleepy end device (in milliseconds)
1515*cfb92d14SAndroid Build Coastguard Worker
1516*cfb92d14SAndroid Build Coastguard Worker        Returns:
1517*cfb92d14SAndroid Build Coastguard Worker            True: successful to set the data poll period for sleepy end device
1518*cfb92d14SAndroid Build Coastguard Worker            False: fail to set the data poll period for sleepy end device
1519*cfb92d14SAndroid Build Coastguard Worker        """
1520*cfb92d14SAndroid Build Coastguard Worker        try:
1521*cfb92d14SAndroid Build Coastguard Worker            cmd = self.wpan_cmd_prefix + 'setprop NCP:SleepyPollInterval %s' % str(iPollPeriod)
1522*cfb92d14SAndroid Build Coastguard Worker            print(cmd)
1523*cfb92d14SAndroid Build Coastguard Worker            return self.__sendCommand(cmd)[0] != 'Fail'
1524*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
1525*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('__setPollingRate() Error: ' + str(e))
1526*cfb92d14SAndroid Build Coastguard Worker
1527*cfb92d14SAndroid Build Coastguard Worker    def setLinkQuality(self, EUIadr, LinkQuality):
1528*cfb92d14SAndroid Build Coastguard Worker        """set custom LinkQualityIn for all receiving messages from the specified EUIadr
1529*cfb92d14SAndroid Build Coastguard Worker
1530*cfb92d14SAndroid Build Coastguard Worker        Args:
1531*cfb92d14SAndroid Build Coastguard Worker            EUIadr: a given extended address
1532*cfb92d14SAndroid Build Coastguard Worker            LinkQuality: a given custom link quality
1533*cfb92d14SAndroid Build Coastguard Worker                         link quality/link margin mapping table
1534*cfb92d14SAndroid Build Coastguard Worker                         3: 21 - 255 (dB)
1535*cfb92d14SAndroid Build Coastguard Worker                         2: 11 - 20 (dB)
1536*cfb92d14SAndroid Build Coastguard Worker                         1: 3 - 9 (dB)
1537*cfb92d14SAndroid Build Coastguard Worker                         0: 0 - 2 (dB)
1538*cfb92d14SAndroid Build Coastguard Worker
1539*cfb92d14SAndroid Build Coastguard Worker        Returns:
1540*cfb92d14SAndroid Build Coastguard Worker            True: successful to set the link quality
1541*cfb92d14SAndroid Build Coastguard Worker            False: fail to set the link quality
1542*cfb92d14SAndroid Build Coastguard Worker
1543*cfb92d14SAndroid Build Coastguard Worker        @todo: required if as reference device
1544*cfb92d14SAndroid Build Coastguard Worker        """
1545*cfb92d14SAndroid Build Coastguard Worker
1546*cfb92d14SAndroid Build Coastguard Worker    def setOutBoundLinkQuality(self, LinkQuality):
1547*cfb92d14SAndroid Build Coastguard Worker        """set custom LinkQualityIn for all receiving messages from the any address
1548*cfb92d14SAndroid Build Coastguard Worker
1549*cfb92d14SAndroid Build Coastguard Worker        Args:
1550*cfb92d14SAndroid Build Coastguard Worker            LinkQuality: a given custom link quality
1551*cfb92d14SAndroid Build Coastguard Worker                         link quality/link margin mapping table
1552*cfb92d14SAndroid Build Coastguard Worker                         3: 21 - 255 (dB)
1553*cfb92d14SAndroid Build Coastguard Worker                         2: 11 - 20 (dB)
1554*cfb92d14SAndroid Build Coastguard Worker                         1: 3 - 9 (dB)
1555*cfb92d14SAndroid Build Coastguard Worker                         0: 0 - 2 (dB)
1556*cfb92d14SAndroid Build Coastguard Worker
1557*cfb92d14SAndroid Build Coastguard Worker        Returns:
1558*cfb92d14SAndroid Build Coastguard Worker            True: successful to set the link quality
1559*cfb92d14SAndroid Build Coastguard Worker            False: fail to set the link quality
1560*cfb92d14SAndroid Build Coastguard Worker
1561*cfb92d14SAndroid Build Coastguard Worker        @todo: required if as reference device
1562*cfb92d14SAndroid Build Coastguard Worker        """
1563*cfb92d14SAndroid Build Coastguard Worker
1564*cfb92d14SAndroid Build Coastguard Worker    def removeRouterPrefix(self, prefixEntry):
1565*cfb92d14SAndroid Build Coastguard Worker        """remove the configured prefix on a border router
1566*cfb92d14SAndroid Build Coastguard Worker
1567*cfb92d14SAndroid Build Coastguard Worker        Args:
1568*cfb92d14SAndroid Build Coastguard Worker            prefixEntry: a on-mesh prefix entry
1569*cfb92d14SAndroid Build Coastguard Worker
1570*cfb92d14SAndroid Build Coastguard Worker        Returns:
1571*cfb92d14SAndroid Build Coastguard Worker            True: successful to remove the prefix entry from border router
1572*cfb92d14SAndroid Build Coastguard Worker            False: fail to remove the prefix entry from border router
1573*cfb92d14SAndroid Build Coastguard Worker
1574*cfb92d14SAndroid Build Coastguard Worker        @todo: required if as reference device
1575*cfb92d14SAndroid Build Coastguard Worker        """
1576*cfb92d14SAndroid Build Coastguard Worker
1577*cfb92d14SAndroid Build Coastguard Worker    def resetAndRejoin(self, timeout):
1578*cfb92d14SAndroid Build Coastguard Worker        """reset and join back Thread Network with a given timeout delay
1579*cfb92d14SAndroid Build Coastguard Worker
1580*cfb92d14SAndroid Build Coastguard Worker        Args:
1581*cfb92d14SAndroid Build Coastguard Worker            timeout: a timeout interval before rejoin Thread Network
1582*cfb92d14SAndroid Build Coastguard Worker
1583*cfb92d14SAndroid Build Coastguard Worker        Returns:
1584*cfb92d14SAndroid Build Coastguard Worker            True: successful to reset and rejoin Thread Network
1585*cfb92d14SAndroid Build Coastguard Worker            False: fail to reset and rejoin the Thread Network
1586*cfb92d14SAndroid Build Coastguard Worker        """
1587*cfb92d14SAndroid Build Coastguard Worker        print('%s call resetAndRejoin' % self.port)
1588*cfb92d14SAndroid Build Coastguard Worker        print(timeout)
1589*cfb92d14SAndroid Build Coastguard Worker        try:
1590*cfb92d14SAndroid Build Coastguard Worker            if self.__sendCommand(self.wpan_cmd_prefix + 'setprop Daemon:AutoAssociateAfterReset false')[0] != 'Fail':
1591*cfb92d14SAndroid Build Coastguard Worker                time.sleep(0.5)
1592*cfb92d14SAndroid Build Coastguard Worker                if self.__sendCommand(self.wpan_cmd_prefix + 'reset')[0] != 'Fail':
1593*cfb92d14SAndroid Build Coastguard Worker                    self.isPowerDown = True
1594*cfb92d14SAndroid Build Coastguard Worker                else:
1595*cfb92d14SAndroid Build Coastguard Worker                    return False
1596*cfb92d14SAndroid Build Coastguard Worker            else:
1597*cfb92d14SAndroid Build Coastguard Worker                return False
1598*cfb92d14SAndroid Build Coastguard Worker            time.sleep(timeout)
1599*cfb92d14SAndroid Build Coastguard Worker
1600*cfb92d14SAndroid Build Coastguard Worker            if self.deviceRole == Thread_Device_Role.SED:
1601*cfb92d14SAndroid Build Coastguard Worker                self.__setPollPeriod(self.__sedPollPeriod)
1602*cfb92d14SAndroid Build Coastguard Worker
1603*cfb92d14SAndroid Build Coastguard Worker            if self.__sendCommand(self.wpan_cmd_prefix + 'attach')[0] != 'Fail':
1604*cfb92d14SAndroid Build Coastguard Worker                time.sleep(3)
1605*cfb92d14SAndroid Build Coastguard Worker            else:
1606*cfb92d14SAndroid Build Coastguard Worker                return False
1607*cfb92d14SAndroid Build Coastguard Worker
1608*cfb92d14SAndroid Build Coastguard Worker            if self.__sendCommand(self.wpan_cmd_prefix + 'setprop Daemon:AutoAssociateAfterReset true')[0] == 'Fail':
1609*cfb92d14SAndroid Build Coastguard Worker                return False
1610*cfb92d14SAndroid Build Coastguard Worker
1611*cfb92d14SAndroid Build Coastguard Worker            if self.__stripValue(self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v NCP:State')[0]) != 'associated':
1612*cfb92d14SAndroid Build Coastguard Worker                print('[FAIL] reset and rejoin')
1613*cfb92d14SAndroid Build Coastguard Worker                return False
1614*cfb92d14SAndroid Build Coastguard Worker            return True
1615*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
1616*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('resetAndRejoin() Error: ' + str(e))
1617*cfb92d14SAndroid Build Coastguard Worker
1618*cfb92d14SAndroid Build Coastguard Worker    def configBorderRouter(self,
1619*cfb92d14SAndroid Build Coastguard Worker                           P_Prefix,
1620*cfb92d14SAndroid Build Coastguard Worker                           P_stable=1,
1621*cfb92d14SAndroid Build Coastguard Worker                           P_default=1,
1622*cfb92d14SAndroid Build Coastguard Worker                           P_slaac_preferred=0,
1623*cfb92d14SAndroid Build Coastguard Worker                           P_Dhcp=0,
1624*cfb92d14SAndroid Build Coastguard Worker                           P_preference=0,
1625*cfb92d14SAndroid Build Coastguard Worker                           P_on_mesh=1,
1626*cfb92d14SAndroid Build Coastguard Worker                           P_nd_dns=0):
1627*cfb92d14SAndroid Build Coastguard Worker        """configure the border router with a given prefix entry parameters
1628*cfb92d14SAndroid Build Coastguard Worker
1629*cfb92d14SAndroid Build Coastguard Worker        Args:
1630*cfb92d14SAndroid Build Coastguard Worker            P_Prefix: IPv6 prefix that is available on the Thread Network
1631*cfb92d14SAndroid Build Coastguard Worker            P_stable: true if the default router is expected to be stable network data
1632*cfb92d14SAndroid Build Coastguard Worker            P_default: true if border router offers the default route for P_Prefix
1633*cfb92d14SAndroid Build Coastguard Worker            P_slaac_preferred: true if allowing auto-configure address using P_Prefix
1634*cfb92d14SAndroid Build Coastguard Worker            P_Dhcp: is true if border router is a DHCPv6 Agent
1635*cfb92d14SAndroid Build Coastguard Worker            P_preference: is two-bit signed integer indicating router preference
1636*cfb92d14SAndroid Build Coastguard Worker            P_on_mesh: is true if P_Prefix is considered to be on-mesh
1637*cfb92d14SAndroid Build Coastguard Worker            P_nd_dns: is true if border router is able to supply DNS information obtained via ND
1638*cfb92d14SAndroid Build Coastguard Worker
1639*cfb92d14SAndroid Build Coastguard Worker        Returns:
1640*cfb92d14SAndroid Build Coastguard Worker            True: successful to configure the border router with a given prefix entry
1641*cfb92d14SAndroid Build Coastguard Worker            False: fail to configure the border router with a given prefix entry
1642*cfb92d14SAndroid Build Coastguard Worker        """
1643*cfb92d14SAndroid Build Coastguard Worker        print('%s call configBorderRouter' % self.port)
1644*cfb92d14SAndroid Build Coastguard Worker        prefix = self.__convertIp6PrefixStringToIp6Address(str(P_Prefix))
1645*cfb92d14SAndroid Build Coastguard Worker        print(prefix)
1646*cfb92d14SAndroid Build Coastguard Worker        try:
1647*cfb92d14SAndroid Build Coastguard Worker            parameter = ''
1648*cfb92d14SAndroid Build Coastguard Worker
1649*cfb92d14SAndroid Build Coastguard Worker            if P_slaac_preferred == 1:
1650*cfb92d14SAndroid Build Coastguard Worker                parameter += ' -a -f'
1651*cfb92d14SAndroid Build Coastguard Worker
1652*cfb92d14SAndroid Build Coastguard Worker            if P_stable == 1:
1653*cfb92d14SAndroid Build Coastguard Worker                parameter += ' -s'
1654*cfb92d14SAndroid Build Coastguard Worker
1655*cfb92d14SAndroid Build Coastguard Worker            if P_default == 1:
1656*cfb92d14SAndroid Build Coastguard Worker                parameter += ' -r'
1657*cfb92d14SAndroid Build Coastguard Worker
1658*cfb92d14SAndroid Build Coastguard Worker            if P_Dhcp == 1:
1659*cfb92d14SAndroid Build Coastguard Worker                parameter += ' -d'
1660*cfb92d14SAndroid Build Coastguard Worker
1661*cfb92d14SAndroid Build Coastguard Worker            if P_on_mesh == 1:
1662*cfb92d14SAndroid Build Coastguard Worker                parameter += ' -o'
1663*cfb92d14SAndroid Build Coastguard Worker
1664*cfb92d14SAndroid Build Coastguard Worker            cmd = self.wpan_cmd_prefix + 'add-prefix %s %s -P %d' % (prefix, parameter, P_preference)
1665*cfb92d14SAndroid Build Coastguard Worker            print(parameter)
1666*cfb92d14SAndroid Build Coastguard Worker            print(cmd)
1667*cfb92d14SAndroid Build Coastguard Worker            if self.__sendCommand(cmd)[0] != 'Fail':
1668*cfb92d14SAndroid Build Coastguard Worker                return True
1669*cfb92d14SAndroid Build Coastguard Worker            else:
1670*cfb92d14SAndroid Build Coastguard Worker                return False
1671*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
1672*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('configBorderRouter() Error: ' + str(e))
1673*cfb92d14SAndroid Build Coastguard Worker
1674*cfb92d14SAndroid Build Coastguard Worker    def setNetworkIDTimeout(self, iNwkIDTimeOut):
1675*cfb92d14SAndroid Build Coastguard Worker        """set networkid timeout for OpenThreadWpan
1676*cfb92d14SAndroid Build Coastguard Worker
1677*cfb92d14SAndroid Build Coastguard Worker        Args:
1678*cfb92d14SAndroid Build Coastguard Worker            iNwkIDTimeOut: a given NETWORK_ID_TIMEOUT
1679*cfb92d14SAndroid Build Coastguard Worker
1680*cfb92d14SAndroid Build Coastguard Worker        Returns:
1681*cfb92d14SAndroid Build Coastguard Worker            True: successful to set NETWORK_ID_TIMEOUT
1682*cfb92d14SAndroid Build Coastguard Worker            False: fail to set NETWORK_ID_TIMEOUT
1683*cfb92d14SAndroid Build Coastguard Worker
1684*cfb92d14SAndroid Build Coastguard Worker        @todo: required if as reference device
1685*cfb92d14SAndroid Build Coastguard Worker        """
1686*cfb92d14SAndroid Build Coastguard Worker
1687*cfb92d14SAndroid Build Coastguard Worker    def setKeepAliveTimeOut(self, iTimeOut):
1688*cfb92d14SAndroid Build Coastguard Worker        """set keep alive timeout for device
1689*cfb92d14SAndroid Build Coastguard Worker           has been deprecated and also set SED polling rate
1690*cfb92d14SAndroid Build Coastguard Worker
1691*cfb92d14SAndroid Build Coastguard Worker        Args:
1692*cfb92d14SAndroid Build Coastguard Worker            iTimeOut: data poll period for sleepy end device
1693*cfb92d14SAndroid Build Coastguard Worker
1694*cfb92d14SAndroid Build Coastguard Worker        Returns:
1695*cfb92d14SAndroid Build Coastguard Worker            True: successful to set the data poll period for SED
1696*cfb92d14SAndroid Build Coastguard Worker            False: fail to set the data poll period for SED
1697*cfb92d14SAndroid Build Coastguard Worker        """
1698*cfb92d14SAndroid Build Coastguard Worker        print('%s call setKeepAliveTimeOut' % self.port)
1699*cfb92d14SAndroid Build Coastguard Worker        print(iTimeOut)
1700*cfb92d14SAndroid Build Coastguard Worker        try:
1701*cfb92d14SAndroid Build Coastguard Worker            cmd = self.wpan_cmd_prefix + 'setprop NCP:SleepyPollInterval %s' % str(iTimeOut * 1000)
1702*cfb92d14SAndroid Build Coastguard Worker            print(cmd)
1703*cfb92d14SAndroid Build Coastguard Worker            return self.__sendCommand(cmd)[0] != 'Fail'
1704*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
1705*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('setKeepAliveTimeOut() Error: ' + str(e))
1706*cfb92d14SAndroid Build Coastguard Worker
1707*cfb92d14SAndroid Build Coastguard Worker    def setKeySequenceCounter(self, iKeySequenceValue):
1708*cfb92d14SAndroid Build Coastguard Worker        """ set the Key sequence counter corresponding to Thread network key
1709*cfb92d14SAndroid Build Coastguard Worker
1710*cfb92d14SAndroid Build Coastguard Worker        Args:
1711*cfb92d14SAndroid Build Coastguard Worker            iKeySequenceValue: key sequence value
1712*cfb92d14SAndroid Build Coastguard Worker
1713*cfb92d14SAndroid Build Coastguard Worker        Returns:
1714*cfb92d14SAndroid Build Coastguard Worker            True: successful to set the key sequence
1715*cfb92d14SAndroid Build Coastguard Worker            False: fail to set the key sequence
1716*cfb92d14SAndroid Build Coastguard Worker        """
1717*cfb92d14SAndroid Build Coastguard Worker        print('%s call setKeySequenceCounter' % self.port)
1718*cfb92d14SAndroid Build Coastguard Worker        print(iKeySequenceValue)
1719*cfb92d14SAndroid Build Coastguard Worker        try:
1720*cfb92d14SAndroid Build Coastguard Worker            # avoid key switch guard timer protection for reference device
1721*cfb92d14SAndroid Build Coastguard Worker            self.__setKeySwitchGuardTime(0)
1722*cfb92d14SAndroid Build Coastguard Worker
1723*cfb92d14SAndroid Build Coastguard Worker            cmd = self.wpan_cmd_prefix + 'setprop Network:KeyIndex %s' % str(iKeySequenceValue)
1724*cfb92d14SAndroid Build Coastguard Worker            if self.__sendCommand(cmd)[0] != 'Fail':
1725*cfb92d14SAndroid Build Coastguard Worker                time.sleep(1)
1726*cfb92d14SAndroid Build Coastguard Worker                return True
1727*cfb92d14SAndroid Build Coastguard Worker            else:
1728*cfb92d14SAndroid Build Coastguard Worker                return False
1729*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
1730*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('setKeySequenceCounter() Error: ' + str(e))
1731*cfb92d14SAndroid Build Coastguard Worker
1732*cfb92d14SAndroid Build Coastguard Worker    def getKeySequenceCounter(self):
1733*cfb92d14SAndroid Build Coastguard Worker        """get current Thread Network key sequence"""
1734*cfb92d14SAndroid Build Coastguard Worker        print('%s call getKeySequenceCounter' % self.port)
1735*cfb92d14SAndroid Build Coastguard Worker        keySequence = ''
1736*cfb92d14SAndroid Build Coastguard Worker        keySequence = self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v Network:KeyIndex')[0]
1737*cfb92d14SAndroid Build Coastguard Worker        return keySequence
1738*cfb92d14SAndroid Build Coastguard Worker
1739*cfb92d14SAndroid Build Coastguard Worker    def incrementKeySequenceCounter(self, iIncrementValue=1):
1740*cfb92d14SAndroid Build Coastguard Worker        """increment the key sequence with a given value
1741*cfb92d14SAndroid Build Coastguard Worker
1742*cfb92d14SAndroid Build Coastguard Worker        Args:
1743*cfb92d14SAndroid Build Coastguard Worker            iIncrementValue: specific increment value to be added
1744*cfb92d14SAndroid Build Coastguard Worker
1745*cfb92d14SAndroid Build Coastguard Worker        Returns:
1746*cfb92d14SAndroid Build Coastguard Worker            True: successful to increment the key sequence with a given value
1747*cfb92d14SAndroid Build Coastguard Worker            False: fail to increment the key sequence with a given value
1748*cfb92d14SAndroid Build Coastguard Worker        """
1749*cfb92d14SAndroid Build Coastguard Worker        print('%s call incrementKeySequenceCounter' % self.port)
1750*cfb92d14SAndroid Build Coastguard Worker        print(iIncrementValue)
1751*cfb92d14SAndroid Build Coastguard Worker        currentKeySeq = ''
1752*cfb92d14SAndroid Build Coastguard Worker        try:
1753*cfb92d14SAndroid Build Coastguard Worker            # avoid key switch guard timer protection for reference device
1754*cfb92d14SAndroid Build Coastguard Worker            self.__setKeySwitchGuardTime(0)
1755*cfb92d14SAndroid Build Coastguard Worker
1756*cfb92d14SAndroid Build Coastguard Worker            currentKeySeq = self.getKeySequenceCounter()
1757*cfb92d14SAndroid Build Coastguard Worker            keySequence = int(currentKeySeq, 10) + iIncrementValue
1758*cfb92d14SAndroid Build Coastguard Worker            print(keySequence)
1759*cfb92d14SAndroid Build Coastguard Worker            return self.setKeySequenceCounter(keySequence)
1760*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
1761*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('incrementKeySequenceCounter() Error: ' + str(e))
1762*cfb92d14SAndroid Build Coastguard Worker
1763*cfb92d14SAndroid Build Coastguard Worker    def setNetworkDataRequirement(self, eDataRequirement):
1764*cfb92d14SAndroid Build Coastguard Worker        """set whether the Thread device requires the full network data
1765*cfb92d14SAndroid Build Coastguard Worker           or only requires the stable network data
1766*cfb92d14SAndroid Build Coastguard Worker
1767*cfb92d14SAndroid Build Coastguard Worker        Args:
1768*cfb92d14SAndroid Build Coastguard Worker            eDataRequirement: is true if requiring the full network data
1769*cfb92d14SAndroid Build Coastguard Worker
1770*cfb92d14SAndroid Build Coastguard Worker        Returns:
1771*cfb92d14SAndroid Build Coastguard Worker            True: successful to set the network requirement
1772*cfb92d14SAndroid Build Coastguard Worker        """
1773*cfb92d14SAndroid Build Coastguard Worker        print('%s call setNetworkDataRequirement' % self.port)
1774*cfb92d14SAndroid Build Coastguard Worker        print(eDataRequirement)
1775*cfb92d14SAndroid Build Coastguard Worker
1776*cfb92d14SAndroid Build Coastguard Worker        if eDataRequirement == Device_Data_Requirement.ALL_DATA:
1777*cfb92d14SAndroid Build Coastguard Worker            self.networkDataRequirement = 'n'
1778*cfb92d14SAndroid Build Coastguard Worker        return True
1779*cfb92d14SAndroid Build Coastguard Worker
1780*cfb92d14SAndroid Build Coastguard Worker    def configExternalRouter(self, P_Prefix, P_stable, R_Preference=0):
1781*cfb92d14SAndroid Build Coastguard Worker        """configure border router with a given external route prefix entry
1782*cfb92d14SAndroid Build Coastguard Worker
1783*cfb92d14SAndroid Build Coastguard Worker        Args:
1784*cfb92d14SAndroid Build Coastguard Worker            P_Prefix: IPv6 prefix for the route
1785*cfb92d14SAndroid Build Coastguard Worker            P_Stable: is true if the external route prefix is stable network data
1786*cfb92d14SAndroid Build Coastguard Worker            R_Preference: a two-bit signed integer indicating Router preference
1787*cfb92d14SAndroid Build Coastguard Worker                          1: high
1788*cfb92d14SAndroid Build Coastguard Worker                          0: medium
1789*cfb92d14SAndroid Build Coastguard Worker                         -1: low
1790*cfb92d14SAndroid Build Coastguard Worker
1791*cfb92d14SAndroid Build Coastguard Worker        Returns:
1792*cfb92d14SAndroid Build Coastguard Worker            True: successful to configure the border router with a given external route prefix
1793*cfb92d14SAndroid Build Coastguard Worker            False: fail to configure the border router with a given external route prefix
1794*cfb92d14SAndroid Build Coastguard Worker        """
1795*cfb92d14SAndroid Build Coastguard Worker        print('%s call configExternalRouter' % self.port)
1796*cfb92d14SAndroid Build Coastguard Worker        print(P_Prefix)
1797*cfb92d14SAndroid Build Coastguard Worker        prefix = self.__convertIp6PrefixStringToIp6Address(str(P_Prefix))
1798*cfb92d14SAndroid Build Coastguard Worker        try:
1799*cfb92d14SAndroid Build Coastguard Worker            if P_stable:
1800*cfb92d14SAndroid Build Coastguard Worker                cmd = self.wpan_cmd_prefix + 'add-route %s -l 64 -p %d' % (prefix, R_Preference)
1801*cfb92d14SAndroid Build Coastguard Worker            else:
1802*cfb92d14SAndroid Build Coastguard Worker                cmd = self.wpan_cmd_prefix + 'add-route %s -l 64 -p %d -n' % (prefix, R_Preference)
1803*cfb92d14SAndroid Build Coastguard Worker            print(cmd)
1804*cfb92d14SAndroid Build Coastguard Worker
1805*cfb92d14SAndroid Build Coastguard Worker            if self.__sendCommand(cmd)[0] != 'Fail':
1806*cfb92d14SAndroid Build Coastguard Worker                return True
1807*cfb92d14SAndroid Build Coastguard Worker            else:
1808*cfb92d14SAndroid Build Coastguard Worker                return False
1809*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
1810*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('configExternalRouter() Error: ' + str(e))
1811*cfb92d14SAndroid Build Coastguard Worker
1812*cfb92d14SAndroid Build Coastguard Worker    def getNeighbouringRouters(self):
1813*cfb92d14SAndroid Build Coastguard Worker        """get neighboring routers information
1814*cfb92d14SAndroid Build Coastguard Worker
1815*cfb92d14SAndroid Build Coastguard Worker        Returns:
1816*cfb92d14SAndroid Build Coastguard Worker            neighboring routers' extended address
1817*cfb92d14SAndroid Build Coastguard Worker
1818*cfb92d14SAndroid Build Coastguard Worker        @todo: required if as reference device
1819*cfb92d14SAndroid Build Coastguard Worker        """
1820*cfb92d14SAndroid Build Coastguard Worker
1821*cfb92d14SAndroid Build Coastguard Worker    def getChildrenInfo(self):
1822*cfb92d14SAndroid Build Coastguard Worker        """get all children information
1823*cfb92d14SAndroid Build Coastguard Worker
1824*cfb92d14SAndroid Build Coastguard Worker        Returns:
1825*cfb92d14SAndroid Build Coastguard Worker            children's extended address
1826*cfb92d14SAndroid Build Coastguard Worker
1827*cfb92d14SAndroid Build Coastguard Worker        @todo: required if as reference device
1828*cfb92d14SAndroid Build Coastguard Worker        """
1829*cfb92d14SAndroid Build Coastguard Worker
1830*cfb92d14SAndroid Build Coastguard Worker    def setXpanId(self, xPanId):
1831*cfb92d14SAndroid Build Coastguard Worker        """set extended PAN ID of Thread Network
1832*cfb92d14SAndroid Build Coastguard Worker
1833*cfb92d14SAndroid Build Coastguard Worker        Args:
1834*cfb92d14SAndroid Build Coastguard Worker            xPanId: extended PAN ID in hex format
1835*cfb92d14SAndroid Build Coastguard Worker
1836*cfb92d14SAndroid Build Coastguard Worker        Returns:
1837*cfb92d14SAndroid Build Coastguard Worker            True: successful to set the extended PAN ID
1838*cfb92d14SAndroid Build Coastguard Worker            False: fail to set the extended PAN ID
1839*cfb92d14SAndroid Build Coastguard Worker        """
1840*cfb92d14SAndroid Build Coastguard Worker        xpanid = ''
1841*cfb92d14SAndroid Build Coastguard Worker        print('%s call setXpanId' % self.port)
1842*cfb92d14SAndroid Build Coastguard Worker        print(xPanId)
1843*cfb92d14SAndroid Build Coastguard Worker        try:
1844*cfb92d14SAndroid Build Coastguard Worker            if not isinstance(xPanId, str):
1845*cfb92d14SAndroid Build Coastguard Worker                xpanid = self.__convertLongToHex(xPanId, 16)
1846*cfb92d14SAndroid Build Coastguard Worker
1847*cfb92d14SAndroid Build Coastguard Worker                cmd = self.wpan_cmd_prefix + 'setprop Network:XPANID %s' % xpanid
1848*cfb92d14SAndroid Build Coastguard Worker                datasetCmd = self.wpan_cmd_prefix + 'setprop Dataset:ExtendedPanId %s' % xpanid
1849*cfb92d14SAndroid Build Coastguard Worker            else:
1850*cfb92d14SAndroid Build Coastguard Worker                xpanid = xPanId
1851*cfb92d14SAndroid Build Coastguard Worker                cmd = self.wpan_cmd_prefix + 'setprop Network:XPANID %s' % xpanid
1852*cfb92d14SAndroid Build Coastguard Worker                datasetCmd = self.wpan_cmd_prefix + 'setprop Dataset:ExtendedPanId %s' % xpanid
1853*cfb92d14SAndroid Build Coastguard Worker
1854*cfb92d14SAndroid Build Coastguard Worker            self.xpanId = xpanid
1855*cfb92d14SAndroid Build Coastguard Worker            self.hasActiveDatasetToCommit = True
1856*cfb92d14SAndroid Build Coastguard Worker            return self.__sendCommand(cmd)[0] != 'Fail' and self.__sendCommand(datasetCmd)[0] != 'Fail'
1857*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
1858*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('setXpanId() Error: ' + str(e))
1859*cfb92d14SAndroid Build Coastguard Worker
1860*cfb92d14SAndroid Build Coastguard Worker    def getNeighbouringDevices(self):
1861*cfb92d14SAndroid Build Coastguard Worker        """gets the neighboring devices' extended address to compute the DUT
1862*cfb92d14SAndroid Build Coastguard Worker           extended address automatically
1863*cfb92d14SAndroid Build Coastguard Worker
1864*cfb92d14SAndroid Build Coastguard Worker        Returns:
1865*cfb92d14SAndroid Build Coastguard Worker            A list including extended address of neighboring routers, parent
1866*cfb92d14SAndroid Build Coastguard Worker            as well as children
1867*cfb92d14SAndroid Build Coastguard Worker        """
1868*cfb92d14SAndroid Build Coastguard Worker        print('%s call getNeighbouringDevices' % self.port)
1869*cfb92d14SAndroid Build Coastguard Worker        neighbourList = []
1870*cfb92d14SAndroid Build Coastguard Worker
1871*cfb92d14SAndroid Build Coastguard Worker        # get parent info
1872*cfb92d14SAndroid Build Coastguard Worker        parentAddr = self.getParentAddress()
1873*cfb92d14SAndroid Build Coastguard Worker        if parentAddr != 0:
1874*cfb92d14SAndroid Build Coastguard Worker            neighbourList.append(parentAddr)
1875*cfb92d14SAndroid Build Coastguard Worker
1876*cfb92d14SAndroid Build Coastguard Worker        # get ED/SED children info
1877*cfb92d14SAndroid Build Coastguard Worker        childNeighbours = self.getChildrenInfo()
1878*cfb92d14SAndroid Build Coastguard Worker        if childNeighbours is not None and len(childNeighbours) > 0:
1879*cfb92d14SAndroid Build Coastguard Worker            for entry in childNeighbours:
1880*cfb92d14SAndroid Build Coastguard Worker                neighbourList.append(entry)
1881*cfb92d14SAndroid Build Coastguard Worker
1882*cfb92d14SAndroid Build Coastguard Worker        # get neighboring routers info
1883*cfb92d14SAndroid Build Coastguard Worker        routerNeighbours = self.getNeighbouringRouters()
1884*cfb92d14SAndroid Build Coastguard Worker        if routerNeighbours is not None and len(routerNeighbours) > 0:
1885*cfb92d14SAndroid Build Coastguard Worker            for entry in routerNeighbours:
1886*cfb92d14SAndroid Build Coastguard Worker                neighbourList.append(entry)
1887*cfb92d14SAndroid Build Coastguard Worker
1888*cfb92d14SAndroid Build Coastguard Worker        print(neighbourList)
1889*cfb92d14SAndroid Build Coastguard Worker        return neighbourList
1890*cfb92d14SAndroid Build Coastguard Worker
1891*cfb92d14SAndroid Build Coastguard Worker    def setPartationId(self, partationId):
1892*cfb92d14SAndroid Build Coastguard Worker        """set Thread Network Partition ID
1893*cfb92d14SAndroid Build Coastguard Worker
1894*cfb92d14SAndroid Build Coastguard Worker        Args:
1895*cfb92d14SAndroid Build Coastguard Worker            partitionId: partition id to be set by leader
1896*cfb92d14SAndroid Build Coastguard Worker
1897*cfb92d14SAndroid Build Coastguard Worker        Returns:
1898*cfb92d14SAndroid Build Coastguard Worker            True: successful to set the Partition ID
1899*cfb92d14SAndroid Build Coastguard Worker            False: fail to set the Partition ID
1900*cfb92d14SAndroid Build Coastguard Worker        """
1901*cfb92d14SAndroid Build Coastguard Worker        print('%s call setPartationId' % self.port)
1902*cfb92d14SAndroid Build Coastguard Worker        print(partationId)
1903*cfb92d14SAndroid Build Coastguard Worker
1904*cfb92d14SAndroid Build Coastguard Worker        cmd = self.wpan_cmd_prefix + 'setprop Network:PartitionId %s' % (str(hex(partationId)).rstrip('L'))
1905*cfb92d14SAndroid Build Coastguard Worker        print(cmd)
1906*cfb92d14SAndroid Build Coastguard Worker        return self.__sendCommand(cmd)[0] != 'Fail'
1907*cfb92d14SAndroid Build Coastguard Worker
1908*cfb92d14SAndroid Build Coastguard Worker    def getGUA(self, filterByPrefix=None):
1909*cfb92d14SAndroid Build Coastguard Worker        """get expected global unicast IPv6 address of OpenThreadWpan
1910*cfb92d14SAndroid Build Coastguard Worker
1911*cfb92d14SAndroid Build Coastguard Worker        note: existing filterByPrefix are string of in lowercase. e.g.
1912*cfb92d14SAndroid Build Coastguard Worker        '2001' or '2001:0db8:0001:0000".
1913*cfb92d14SAndroid Build Coastguard Worker
1914*cfb92d14SAndroid Build Coastguard Worker        Args:
1915*cfb92d14SAndroid Build Coastguard Worker            filterByPrefix: a given expected global IPv6 prefix to be matched
1916*cfb92d14SAndroid Build Coastguard Worker
1917*cfb92d14SAndroid Build Coastguard Worker        Returns:
1918*cfb92d14SAndroid Build Coastguard Worker            a global IPv6 address
1919*cfb92d14SAndroid Build Coastguard Worker        """
1920*cfb92d14SAndroid Build Coastguard Worker        print('%s call getGUA' % self.port)
1921*cfb92d14SAndroid Build Coastguard Worker        print(filterByPrefix)
1922*cfb92d14SAndroid Build Coastguard Worker        globalAddrs = []
1923*cfb92d14SAndroid Build Coastguard Worker        try:
1924*cfb92d14SAndroid Build Coastguard Worker            # get global addrs set if multiple
1925*cfb92d14SAndroid Build Coastguard Worker            globalAddrs = self.getGlobal()
1926*cfb92d14SAndroid Build Coastguard Worker
1927*cfb92d14SAndroid Build Coastguard Worker            if filterByPrefix is None:
1928*cfb92d14SAndroid Build Coastguard Worker                return self.globalAddrs[0]
1929*cfb92d14SAndroid Build Coastguard Worker            else:
1930*cfb92d14SAndroid Build Coastguard Worker                for fullIp in globalAddrs:
1931*cfb92d14SAndroid Build Coastguard Worker                    if fullIp.startswith(filterByPrefix):
1932*cfb92d14SAndroid Build Coastguard Worker                        print('target global %s' % fullIp)
1933*cfb92d14SAndroid Build Coastguard Worker                        return fullIp
1934*cfb92d14SAndroid Build Coastguard Worker                print('no global address matched')
1935*cfb92d14SAndroid Build Coastguard Worker                return str(globalAddrs[0])
1936*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
1937*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('getGUA() Error: ' + str(e))
1938*cfb92d14SAndroid Build Coastguard Worker            return e
1939*cfb92d14SAndroid Build Coastguard Worker
1940*cfb92d14SAndroid Build Coastguard Worker    def getShortAddress(self):
1941*cfb92d14SAndroid Build Coastguard Worker        """get Rloc16 short address of Thread device"""
1942*cfb92d14SAndroid Build Coastguard Worker        print('%s call getShortAddress' % self.port)
1943*cfb92d14SAndroid Build Coastguard Worker        return self.getRloc16()
1944*cfb92d14SAndroid Build Coastguard Worker
1945*cfb92d14SAndroid Build Coastguard Worker    def getULA64(self):
1946*cfb92d14SAndroid Build Coastguard Worker        """get mesh local EID of Thread device"""
1947*cfb92d14SAndroid Build Coastguard Worker        print('%s call getULA64' % self.port)
1948*cfb92d14SAndroid Build Coastguard Worker        return self.getMLEID()
1949*cfb92d14SAndroid Build Coastguard Worker
1950*cfb92d14SAndroid Build Coastguard Worker    def setMLPrefix(self, sMeshLocalPrefix):
1951*cfb92d14SAndroid Build Coastguard Worker        """set mesh local prefix"""
1952*cfb92d14SAndroid Build Coastguard Worker        print('%s call setMLPrefix' % self.port)
1953*cfb92d14SAndroid Build Coastguard Worker        try:
1954*cfb92d14SAndroid Build Coastguard Worker            cmd = self.wpan_cmd_prefix + 'setprop IPv6:MeshLocalPrefix %s' % sMeshLocalPrefix
1955*cfb92d14SAndroid Build Coastguard Worker            datasetCmd = self.wpan_cmd_prefix + 'setprop Dataset:MeshLocalPrefix %s' % sMeshLocalPrefix
1956*cfb92d14SAndroid Build Coastguard Worker            self.hasActiveDatasetToCommit = True
1957*cfb92d14SAndroid Build Coastguard Worker            return self.__sendCommand(cmd)[0] != 'Fail' and self.__sendCommand(datasetCmd)[0] != 'Fail'
1958*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
1959*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('setMLPrefix() Error: ' + str(e))
1960*cfb92d14SAndroid Build Coastguard Worker
1961*cfb92d14SAndroid Build Coastguard Worker    def getML16(self):
1962*cfb92d14SAndroid Build Coastguard Worker        """get mesh local 16 unicast address (Rloc)"""
1963*cfb92d14SAndroid Build Coastguard Worker        print('%s call getML16' % self.port)
1964*cfb92d14SAndroid Build Coastguard Worker        return self.getRloc()
1965*cfb92d14SAndroid Build Coastguard Worker
1966*cfb92d14SAndroid Build Coastguard Worker    def downgradeToDevice(self):
1967*cfb92d14SAndroid Build Coastguard Worker        pass
1968*cfb92d14SAndroid Build Coastguard Worker
1969*cfb92d14SAndroid Build Coastguard Worker    def upgradeToRouter(self):
1970*cfb92d14SAndroid Build Coastguard Worker        pass
1971*cfb92d14SAndroid Build Coastguard Worker
1972*cfb92d14SAndroid Build Coastguard Worker    def forceSetSlaac(self, slaacAddress):
1973*cfb92d14SAndroid Build Coastguard Worker        """@todo : required if as reference device"""
1974*cfb92d14SAndroid Build Coastguard Worker
1975*cfb92d14SAndroid Build Coastguard Worker    def setSleepyNodePollTime(self):
1976*cfb92d14SAndroid Build Coastguard Worker        pass
1977*cfb92d14SAndroid Build Coastguard Worker
1978*cfb92d14SAndroid Build Coastguard Worker    def enableAutoDUTObjectFlag(self):
1979*cfb92d14SAndroid Build Coastguard Worker        """set AutoDUTenable flag"""
1980*cfb92d14SAndroid Build Coastguard Worker        print('%s call enableAutoDUTObjectFlag' % self.port)
1981*cfb92d14SAndroid Build Coastguard Worker        self.AutoDUTEnable = True
1982*cfb92d14SAndroid Build Coastguard Worker
1983*cfb92d14SAndroid Build Coastguard Worker    def getChildTimeoutValue(self):
1984*cfb92d14SAndroid Build Coastguard Worker        """get child timeout"""
1985*cfb92d14SAndroid Build Coastguard Worker        print('%s call getChildTimeoutValue' % self.port)
1986*cfb92d14SAndroid Build Coastguard Worker        childTimeout = self.__sendCommand(self.wpan_cmd_prefix + 'getprop -v Thread:ChildTimeout')[0]
1987*cfb92d14SAndroid Build Coastguard Worker        return int(childTimeout)
1988*cfb92d14SAndroid Build Coastguard Worker
1989*cfb92d14SAndroid Build Coastguard Worker    def diagnosticGet(self, strDestinationAddr, listTLV_ids=[]):
1990*cfb92d14SAndroid Build Coastguard Worker        """@todo : required if as reference device"""
1991*cfb92d14SAndroid Build Coastguard Worker
1992*cfb92d14SAndroid Build Coastguard Worker    def diagnosticQuery(self, strDestinationAddr, listTLV_ids=[]):
1993*cfb92d14SAndroid Build Coastguard Worker        """@todo : required if as reference device"""
1994*cfb92d14SAndroid Build Coastguard Worker        self.diagnosticGet(strDestinationAddr, listTLV_ids)
1995*cfb92d14SAndroid Build Coastguard Worker
1996*cfb92d14SAndroid Build Coastguard Worker    def diagnosticReset(self, strDestinationAddr, listTLV_ids=[]):
1997*cfb92d14SAndroid Build Coastguard Worker        """@todo : required if as reference device"""
1998*cfb92d14SAndroid Build Coastguard Worker
1999*cfb92d14SAndroid Build Coastguard Worker    def startNativeCommissioner(self, strPSKc='GRLPASSPHRASE'):
2000*cfb92d14SAndroid Build Coastguard Worker        # TODO: Support the whole Native Commissioner functionality
2001*cfb92d14SAndroid Build Coastguard Worker        # Currently it only aims to trigger a Discovery Request message to pass
2002*cfb92d14SAndroid Build Coastguard Worker        # Certification test 5.8.4
2003*cfb92d14SAndroid Build Coastguard Worker        print('%s call startNativeCommissioner' % self.port)
2004*cfb92d14SAndroid Build Coastguard Worker        cmd = self.wpan_cmd_prefix + 'joiner --start %s' % (strPSKc)
2005*cfb92d14SAndroid Build Coastguard Worker        print(cmd)
2006*cfb92d14SAndroid Build Coastguard Worker        if self.__sendCommand(cmd)[0] != 'Fail':
2007*cfb92d14SAndroid Build Coastguard Worker            return True
2008*cfb92d14SAndroid Build Coastguard Worker        else:
2009*cfb92d14SAndroid Build Coastguard Worker            return False
2010*cfb92d14SAndroid Build Coastguard Worker
2011*cfb92d14SAndroid Build Coastguard Worker    def startCollapsedCommissioner(self):
2012*cfb92d14SAndroid Build Coastguard Worker        """start Collapsed Commissioner
2013*cfb92d14SAndroid Build Coastguard Worker
2014*cfb92d14SAndroid Build Coastguard Worker        Returns:
2015*cfb92d14SAndroid Build Coastguard Worker            True: successful to start Commissioner
2016*cfb92d14SAndroid Build Coastguard Worker            False: fail to start Commissioner
2017*cfb92d14SAndroid Build Coastguard Worker        """
2018*cfb92d14SAndroid Build Coastguard Worker        print('%s call startCollapsedCommissioner' % self.port)
2019*cfb92d14SAndroid Build Coastguard Worker        startCmd = self.wpan_cmd_prefix + 'form "%s" -c %s -T router' % (self.networkName, str(self.channel))
2020*cfb92d14SAndroid Build Coastguard Worker        if self.__sendCommand(startCmd) != 'Fail':
2021*cfb92d14SAndroid Build Coastguard Worker            time.sleep(2)
2022*cfb92d14SAndroid Build Coastguard Worker            cmd = self.wpan_cmd_prefix + 'commissioner start'
2023*cfb92d14SAndroid Build Coastguard Worker            print(cmd)
2024*cfb92d14SAndroid Build Coastguard Worker            if self.__sendCommand(cmd)[0] != 'Fail':
2025*cfb92d14SAndroid Build Coastguard Worker                self.isActiveCommissioner = True
2026*cfb92d14SAndroid Build Coastguard Worker                time.sleep(20)  # time for petition process
2027*cfb92d14SAndroid Build Coastguard Worker                return True
2028*cfb92d14SAndroid Build Coastguard Worker        return False
2029*cfb92d14SAndroid Build Coastguard Worker
2030*cfb92d14SAndroid Build Coastguard Worker    def setJoinKey(self, strPSKc):
2031*cfb92d14SAndroid Build Coastguard Worker        pass
2032*cfb92d14SAndroid Build Coastguard Worker
2033*cfb92d14SAndroid Build Coastguard Worker    def scanJoiner(self, xEUI='*', strPSKd='THREADJPAKETEST'):
2034*cfb92d14SAndroid Build Coastguard Worker        """scan Joiner
2035*cfb92d14SAndroid Build Coastguard Worker
2036*cfb92d14SAndroid Build Coastguard Worker        Args:
2037*cfb92d14SAndroid Build Coastguard Worker            xEUI: Joiner's EUI-64
2038*cfb92d14SAndroid Build Coastguard Worker            strPSKd: Joiner's PSKd for commissioning
2039*cfb92d14SAndroid Build Coastguard Worker
2040*cfb92d14SAndroid Build Coastguard Worker        Returns:
2041*cfb92d14SAndroid Build Coastguard Worker            True: successful to add Joiner's steering data
2042*cfb92d14SAndroid Build Coastguard Worker            False: fail to add Joiner's steering data
2043*cfb92d14SAndroid Build Coastguard Worker        """
2044*cfb92d14SAndroid Build Coastguard Worker        print('%s call scanJoiner' % self.port)
2045*cfb92d14SAndroid Build Coastguard Worker        if not isinstance(xEUI, str):
2046*cfb92d14SAndroid Build Coastguard Worker            eui64 = self.__convertLongToHex(xEUI, 16)
2047*cfb92d14SAndroid Build Coastguard Worker        else:
2048*cfb92d14SAndroid Build Coastguard Worker            eui64 = xEUI
2049*cfb92d14SAndroid Build Coastguard Worker
2050*cfb92d14SAndroid Build Coastguard Worker        # long timeout value to avoid automatic joiner removal (in seconds)
2051*cfb92d14SAndroid Build Coastguard Worker        timeout = 500
2052*cfb92d14SAndroid Build Coastguard Worker
2053*cfb92d14SAndroid Build Coastguard Worker        cmd = self.wpan_cmd_prefix + 'commissioner joiner-add "%s" %s %s' % (eui64, str(timeout), strPSKd)
2054*cfb92d14SAndroid Build Coastguard Worker        print(cmd)
2055*cfb92d14SAndroid Build Coastguard Worker        if not self.isActiveCommissioner:
2056*cfb92d14SAndroid Build Coastguard Worker            self.startCollapsedCommissioner()
2057*cfb92d14SAndroid Build Coastguard Worker        if self.__sendCommand(cmd)[0] != 'Fail':
2058*cfb92d14SAndroid Build Coastguard Worker            return True
2059*cfb92d14SAndroid Build Coastguard Worker        else:
2060*cfb92d14SAndroid Build Coastguard Worker            return False
2061*cfb92d14SAndroid Build Coastguard Worker
2062*cfb92d14SAndroid Build Coastguard Worker    def setProvisioningUrl(self, strURL='grl.com'):
2063*cfb92d14SAndroid Build Coastguard Worker        """set provisioning Url
2064*cfb92d14SAndroid Build Coastguard Worker
2065*cfb92d14SAndroid Build Coastguard Worker        Args:
2066*cfb92d14SAndroid Build Coastguard Worker            strURL: Provisioning Url string
2067*cfb92d14SAndroid Build Coastguard Worker
2068*cfb92d14SAndroid Build Coastguard Worker        Returns:
2069*cfb92d14SAndroid Build Coastguard Worker            True: successful to set provisioning Url
2070*cfb92d14SAndroid Build Coastguard Worker            False: fail to set provisioning Url
2071*cfb92d14SAndroid Build Coastguard Worker        """
2072*cfb92d14SAndroid Build Coastguard Worker        print('%s call setProvisioningUrl' % self.port)
2073*cfb92d14SAndroid Build Coastguard Worker        self.provisioningUrl = strURL
2074*cfb92d14SAndroid Build Coastguard Worker        if self.deviceRole == Thread_Device_Role.Commissioner:
2075*cfb92d14SAndroid Build Coastguard Worker            cmd = self.wpan_cmd_prefix + 'setprop Commissioner:ProvisioningUrl %s' % (strURL)
2076*cfb92d14SAndroid Build Coastguard Worker            print(cmd)
2077*cfb92d14SAndroid Build Coastguard Worker            return self.__sendCommand(cmd)[0] != 'Fail'
2078*cfb92d14SAndroid Build Coastguard Worker        return True
2079*cfb92d14SAndroid Build Coastguard Worker
2080*cfb92d14SAndroid Build Coastguard Worker    def allowCommission(self):
2081*cfb92d14SAndroid Build Coastguard Worker        """start commissioner candidate petition process
2082*cfb92d14SAndroid Build Coastguard Worker
2083*cfb92d14SAndroid Build Coastguard Worker        Returns:
2084*cfb92d14SAndroid Build Coastguard Worker            True: successful to start commissioner candidate petition process
2085*cfb92d14SAndroid Build Coastguard Worker            False: fail to start commissioner candidate petition process
2086*cfb92d14SAndroid Build Coastguard Worker        """
2087*cfb92d14SAndroid Build Coastguard Worker        print('%s call allowCommission' % self.port)
2088*cfb92d14SAndroid Build Coastguard Worker        try:
2089*cfb92d14SAndroid Build Coastguard Worker            cmd = self.wpan_cmd_prefix + 'commissioner start'
2090*cfb92d14SAndroid Build Coastguard Worker            print(cmd)
2091*cfb92d14SAndroid Build Coastguard Worker            if self.isActiveCommissioner:
2092*cfb92d14SAndroid Build Coastguard Worker                return True
2093*cfb92d14SAndroid Build Coastguard Worker            if self.__sendCommand(cmd)[0] != 'Fail':
2094*cfb92d14SAndroid Build Coastguard Worker                self.isActiveCommissioner = True
2095*cfb92d14SAndroid Build Coastguard Worker                time.sleep(40)  # time for petition process and at least one keep alive
2096*cfb92d14SAndroid Build Coastguard Worker                return True
2097*cfb92d14SAndroid Build Coastguard Worker            else:
2098*cfb92d14SAndroid Build Coastguard Worker                return False
2099*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
2100*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('allowcommission() error: ' + str(e))
2101*cfb92d14SAndroid Build Coastguard Worker
2102*cfb92d14SAndroid Build Coastguard Worker    def joinCommissioned(self, strPSKd='THREADJPAKETEST', waitTime=20):
2103*cfb92d14SAndroid Build Coastguard Worker        """start joiner
2104*cfb92d14SAndroid Build Coastguard Worker
2105*cfb92d14SAndroid Build Coastguard Worker        Args:
2106*cfb92d14SAndroid Build Coastguard Worker            strPSKd: Joiner's PSKd
2107*cfb92d14SAndroid Build Coastguard Worker
2108*cfb92d14SAndroid Build Coastguard Worker        Returns:
2109*cfb92d14SAndroid Build Coastguard Worker            True: successful to start joiner
2110*cfb92d14SAndroid Build Coastguard Worker            False: fail to start joiner
2111*cfb92d14SAndroid Build Coastguard Worker        """
2112*cfb92d14SAndroid Build Coastguard Worker        print('%s call joinCommissioned' % self.port)
2113*cfb92d14SAndroid Build Coastguard Worker        cmd = self.wpan_cmd_prefix + 'joiner --start %s %s' % (strPSKd, self.provisioningUrl)
2114*cfb92d14SAndroid Build Coastguard Worker        print(cmd)
2115*cfb92d14SAndroid Build Coastguard Worker        if self.__sendCommand(cmd)[0] != 'Fail':
2116*cfb92d14SAndroid Build Coastguard Worker            if self.__getJoinerState():
2117*cfb92d14SAndroid Build Coastguard Worker                self.__sendCommand(self.wpan_cmd_prefix + 'joiner --attach')
2118*cfb92d14SAndroid Build Coastguard Worker                time.sleep(30)
2119*cfb92d14SAndroid Build Coastguard Worker                return True
2120*cfb92d14SAndroid Build Coastguard Worker            else:
2121*cfb92d14SAndroid Build Coastguard Worker                return False
2122*cfb92d14SAndroid Build Coastguard Worker        else:
2123*cfb92d14SAndroid Build Coastguard Worker            return False
2124*cfb92d14SAndroid Build Coastguard Worker
2125*cfb92d14SAndroid Build Coastguard Worker    def getCommissioningLogs(self):
2126*cfb92d14SAndroid Build Coastguard Worker        """get Commissioning logs
2127*cfb92d14SAndroid Build Coastguard Worker
2128*cfb92d14SAndroid Build Coastguard Worker        Returns:
2129*cfb92d14SAndroid Build Coastguard Worker           Commissioning logs
2130*cfb92d14SAndroid Build Coastguard Worker        """
2131*cfb92d14SAndroid Build Coastguard Worker        rawLogs = self.logThread.get()
2132*cfb92d14SAndroid Build Coastguard Worker        ProcessedLogs = []
2133*cfb92d14SAndroid Build Coastguard Worker        payload = []
2134*cfb92d14SAndroid Build Coastguard Worker        while not rawLogs.empty():
2135*cfb92d14SAndroid Build Coastguard Worker            rawLogEach = rawLogs.get()
2136*cfb92d14SAndroid Build Coastguard Worker            print(rawLogEach)
2137*cfb92d14SAndroid Build Coastguard Worker            if '[THCI]' not in rawLogEach:
2138*cfb92d14SAndroid Build Coastguard Worker                continue
2139*cfb92d14SAndroid Build Coastguard Worker
2140*cfb92d14SAndroid Build Coastguard Worker            EncryptedPacket = PlatformDiagnosticPacket()
2141*cfb92d14SAndroid Build Coastguard Worker            infoList = rawLogEach.split('[THCI]')[1].split(']')[0].split('|')
2142*cfb92d14SAndroid Build Coastguard Worker            for eachInfo in infoList:
2143*cfb92d14SAndroid Build Coastguard Worker                print(eachInfo)
2144*cfb92d14SAndroid Build Coastguard Worker                info = eachInfo.split('=')
2145*cfb92d14SAndroid Build Coastguard Worker                infoType = info[0].strip()
2146*cfb92d14SAndroid Build Coastguard Worker                infoValue = info[1].strip()
2147*cfb92d14SAndroid Build Coastguard Worker                if 'direction' in infoType:
2148*cfb92d14SAndroid Build Coastguard Worker                    EncryptedPacket.Direction = (PlatformDiagnosticPacket_Direction.IN
2149*cfb92d14SAndroid Build Coastguard Worker                                                 if 'recv' in infoValue else PlatformDiagnosticPacket_Direction.OUT if
2150*cfb92d14SAndroid Build Coastguard Worker                                                 'send' in infoValue else PlatformDiagnosticPacket_Direction.UNKNOWN)
2151*cfb92d14SAndroid Build Coastguard Worker                elif 'type' in infoType:
2152*cfb92d14SAndroid Build Coastguard Worker                    EncryptedPacket.Type = (PlatformDiagnosticPacket_Type.JOIN_FIN_req if 'JOIN_FIN.req' in infoValue
2153*cfb92d14SAndroid Build Coastguard Worker                                            else PlatformDiagnosticPacket_Type.JOIN_FIN_rsp if 'JOIN_FIN.rsp'
2154*cfb92d14SAndroid Build Coastguard Worker                                            in infoValue else PlatformDiagnosticPacket_Type.JOIN_ENT_req if
2155*cfb92d14SAndroid Build Coastguard Worker                                            'JOIN_ENT.ntf' in infoValue else PlatformDiagnosticPacket_Type.JOIN_ENT_rsp
2156*cfb92d14SAndroid Build Coastguard Worker                                            if 'JOIN_ENT.rsp' in infoValue else PlatformDiagnosticPacket_Type.UNKNOWN)
2157*cfb92d14SAndroid Build Coastguard Worker                elif 'len' in infoType:
2158*cfb92d14SAndroid Build Coastguard Worker                    bytesInEachLine = 16
2159*cfb92d14SAndroid Build Coastguard Worker                    EncryptedPacket.TLVsLength = int(infoValue)
2160*cfb92d14SAndroid Build Coastguard Worker                    payloadLineCount = (int(infoValue) + bytesInEachLine - 1) / bytesInEachLine
2161*cfb92d14SAndroid Build Coastguard Worker                    while payloadLineCount > 0:
2162*cfb92d14SAndroid Build Coastguard Worker                        payloadLineCount = payloadLineCount - 1
2163*cfb92d14SAndroid Build Coastguard Worker                        payloadLine = rawLogs.get()
2164*cfb92d14SAndroid Build Coastguard Worker                        payloadSplit = payloadLine.split('|')
2165*cfb92d14SAndroid Build Coastguard Worker                        for block in range(1, 3):
2166*cfb92d14SAndroid Build Coastguard Worker                            payloadBlock = payloadSplit[block]
2167*cfb92d14SAndroid Build Coastguard Worker                            payloadValues = payloadBlock.split(' ')
2168*cfb92d14SAndroid Build Coastguard Worker                            for num in range(1, 9):
2169*cfb92d14SAndroid Build Coastguard Worker                                if '..' not in payloadValues[num]:
2170*cfb92d14SAndroid Build Coastguard Worker                                    payload.append(int(payloadValues[num], 16))
2171*cfb92d14SAndroid Build Coastguard Worker
2172*cfb92d14SAndroid Build Coastguard Worker                    EncryptedPacket.TLVs = PlatformPackets.read(EncryptedPacket.Type, payload) if payload != [] else []
2173*cfb92d14SAndroid Build Coastguard Worker
2174*cfb92d14SAndroid Build Coastguard Worker            ProcessedLogs.append(EncryptedPacket)
2175*cfb92d14SAndroid Build Coastguard Worker        return ProcessedLogs
2176*cfb92d14SAndroid Build Coastguard Worker
2177*cfb92d14SAndroid Build Coastguard Worker    def MGMT_ED_SCAN(self, sAddr, xCommissionerSessionId, listChannelMask, xCount, xPeriod, xScanDuration):
2178*cfb92d14SAndroid Build Coastguard Worker        """send MGMT_ED_SCAN message to a given destinaition.
2179*cfb92d14SAndroid Build Coastguard Worker
2180*cfb92d14SAndroid Build Coastguard Worker        Args:
2181*cfb92d14SAndroid Build Coastguard Worker            sAddr: IPv6 destination address for this message
2182*cfb92d14SAndroid Build Coastguard Worker            xCommissionerSessionId: commissioner session id
2183*cfb92d14SAndroid Build Coastguard Worker            listChannelMask: a channel array to indicate which channels to be scanned
2184*cfb92d14SAndroid Build Coastguard Worker            xCount: number of IEEE 802.15.4 ED Scans (milliseconds)
2185*cfb92d14SAndroid Build Coastguard Worker            xPeriod: Period between successive IEEE802.15.4 ED Scans (milliseconds)
2186*cfb92d14SAndroid Build Coastguard Worker            xScanDuration: IEEE 802.15.4 ScanDuration to use when performing an IEEE 802.15.4 ED Scan (milliseconds)
2187*cfb92d14SAndroid Build Coastguard Worker
2188*cfb92d14SAndroid Build Coastguard Worker        Returns:
2189*cfb92d14SAndroid Build Coastguard Worker            True: successful to send MGMT_ED_SCAN message.
2190*cfb92d14SAndroid Build Coastguard Worker            False: fail to send MGMT_ED_SCAN message
2191*cfb92d14SAndroid Build Coastguard Worker        """
2192*cfb92d14SAndroid Build Coastguard Worker        print('%s call MGMT_ED_SCAN' % self.port)
2193*cfb92d14SAndroid Build Coastguard Worker        channelMask = ''
2194*cfb92d14SAndroid Build Coastguard Worker        channelMask = self.__ChannelMaskListToStr(listChannelMask)
2195*cfb92d14SAndroid Build Coastguard Worker        try:
2196*cfb92d14SAndroid Build Coastguard Worker            cmd = self.wpan_cmd_prefix + 'commissioner energy-scan %s %s %s %s %s' % (
2197*cfb92d14SAndroid Build Coastguard Worker                channelMask,
2198*cfb92d14SAndroid Build Coastguard Worker                xCount,
2199*cfb92d14SAndroid Build Coastguard Worker                xPeriod,
2200*cfb92d14SAndroid Build Coastguard Worker                xScanDuration,
2201*cfb92d14SAndroid Build Coastguard Worker                sAddr,
2202*cfb92d14SAndroid Build Coastguard Worker            )
2203*cfb92d14SAndroid Build Coastguard Worker            print(cmd)
2204*cfb92d14SAndroid Build Coastguard Worker            return self.__sendCommand(cmd) != 'Fail'
2205*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
2206*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('MGMT_ED_SCAN() error: ' + str(e))
2207*cfb92d14SAndroid Build Coastguard Worker
2208*cfb92d14SAndroid Build Coastguard Worker    def MGMT_PANID_QUERY(self, sAddr, xCommissionerSessionId, listChannelMask, xPanId):
2209*cfb92d14SAndroid Build Coastguard Worker        """send MGMT_PANID_QUERY message to a given destination
2210*cfb92d14SAndroid Build Coastguard Worker
2211*cfb92d14SAndroid Build Coastguard Worker        Args:
2212*cfb92d14SAndroid Build Coastguard Worker            xPanId: a given PAN ID to check the conflicts
2213*cfb92d14SAndroid Build Coastguard Worker
2214*cfb92d14SAndroid Build Coastguard Worker        Returns:
2215*cfb92d14SAndroid Build Coastguard Worker            True: successful to send MGMT_PANID_QUERY message.
2216*cfb92d14SAndroid Build Coastguard Worker            False: fail to send MGMT_PANID_QUERY message.
2217*cfb92d14SAndroid Build Coastguard Worker        """
2218*cfb92d14SAndroid Build Coastguard Worker        print('%s call MGMT_PANID_QUERY' % self.port)
2219*cfb92d14SAndroid Build Coastguard Worker        panid = ''
2220*cfb92d14SAndroid Build Coastguard Worker        channelMask = ''
2221*cfb92d14SAndroid Build Coastguard Worker        channelMask = self.__ChannelMaskListToStr(listChannelMask)
2222*cfb92d14SAndroid Build Coastguard Worker
2223*cfb92d14SAndroid Build Coastguard Worker        if not isinstance(xPanId, str):
2224*cfb92d14SAndroid Build Coastguard Worker            panid = str(hex(xPanId))
2225*cfb92d14SAndroid Build Coastguard Worker
2226*cfb92d14SAndroid Build Coastguard Worker        try:
2227*cfb92d14SAndroid Build Coastguard Worker            cmd = self.wpan_cmd_prefix + 'commissioner pan-id-query %s %s %s' % (panid, channelMask, sAddr)
2228*cfb92d14SAndroid Build Coastguard Worker            print(cmd)
2229*cfb92d14SAndroid Build Coastguard Worker            return self.__sendCommand(cmd) != 'Fail'
2230*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
2231*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('MGMT_PANID_QUERY() error: ' + str(e))
2232*cfb92d14SAndroid Build Coastguard Worker
2233*cfb92d14SAndroid Build Coastguard Worker    def MGMT_ANNOUNCE_BEGIN(self, sAddr, xCommissionerSessionId, listChannelMask, xCount, xPeriod):
2234*cfb92d14SAndroid Build Coastguard Worker        """send MGMT_ANNOUNCE_BEGIN message to a given destination
2235*cfb92d14SAndroid Build Coastguard Worker
2236*cfb92d14SAndroid Build Coastguard Worker        Returns:
2237*cfb92d14SAndroid Build Coastguard Worker            True: successful to send MGMT_ANNOUNCE_BEGIN message.
2238*cfb92d14SAndroid Build Coastguard Worker            False: fail to send MGMT_ANNOUNCE_BEGIN message.
2239*cfb92d14SAndroid Build Coastguard Worker        """
2240*cfb92d14SAndroid Build Coastguard Worker        print('%s call MGMT_ANNOUNCE_BEGIN' % self.port)
2241*cfb92d14SAndroid Build Coastguard Worker        channelMask = ''
2242*cfb92d14SAndroid Build Coastguard Worker        channelMask = self.__ChannelMaskListToStr(listChannelMask)
2243*cfb92d14SAndroid Build Coastguard Worker        try:
2244*cfb92d14SAndroid Build Coastguard Worker            cmd = self.wpan_cmd_prefix + 'commissioner announce-begin %s %s %s %s' % (
2245*cfb92d14SAndroid Build Coastguard Worker                channelMask,
2246*cfb92d14SAndroid Build Coastguard Worker                xCount,
2247*cfb92d14SAndroid Build Coastguard Worker                xPeriod,
2248*cfb92d14SAndroid Build Coastguard Worker                sAddr,
2249*cfb92d14SAndroid Build Coastguard Worker            )
2250*cfb92d14SAndroid Build Coastguard Worker            print(cmd)
2251*cfb92d14SAndroid Build Coastguard Worker            return self.__sendCommand(cmd) != 'Fail'
2252*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
2253*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('MGMT_ANNOUNCE_BEGIN() error: ' + str(e))
2254*cfb92d14SAndroid Build Coastguard Worker
2255*cfb92d14SAndroid Build Coastguard Worker    def MGMT_ACTIVE_GET(self, Addr='', TLVs=[]):
2256*cfb92d14SAndroid Build Coastguard Worker        """send MGMT_ACTIVE_GET command
2257*cfb92d14SAndroid Build Coastguard Worker
2258*cfb92d14SAndroid Build Coastguard Worker        Returns:
2259*cfb92d14SAndroid Build Coastguard Worker            True: successful to send MGMT_ACTIVE_GET
2260*cfb92d14SAndroid Build Coastguard Worker            False: fail to send MGMT_ACTIVE_GET
2261*cfb92d14SAndroid Build Coastguard Worker        """
2262*cfb92d14SAndroid Build Coastguard Worker        print('%s call MGMT_ACTIVE_GET' % self.port)
2263*cfb92d14SAndroid Build Coastguard Worker        try:
2264*cfb92d14SAndroid Build Coastguard Worker
2265*cfb92d14SAndroid Build Coastguard Worker            cmd = self.wpan_cmd_prefix + 'dataset mgmt-get-active'
2266*cfb92d14SAndroid Build Coastguard Worker
2267*cfb92d14SAndroid Build Coastguard Worker            if len(TLVs) != 0:
2268*cfb92d14SAndroid Build Coastguard Worker                tlvs = ''.join('%02x' % tlv for tlv in TLVs)
2269*cfb92d14SAndroid Build Coastguard Worker                setTLVCmd = self.wpan_cmd_prefix + 'setprop Dataset:RawTlvs ' + tlvs
2270*cfb92d14SAndroid Build Coastguard Worker                if self.__sendCommand(setTLVCmd)[0] == 'Fail':
2271*cfb92d14SAndroid Build Coastguard Worker                    return False
2272*cfb92d14SAndroid Build Coastguard Worker            else:
2273*cfb92d14SAndroid Build Coastguard Worker                if self.__sendCommand(self.wpan_cmd_prefix + 'dataset erase')[0] == 'Fail':
2274*cfb92d14SAndroid Build Coastguard Worker                    return False
2275*cfb92d14SAndroid Build Coastguard Worker
2276*cfb92d14SAndroid Build Coastguard Worker            if Addr != '':
2277*cfb92d14SAndroid Build Coastguard Worker                setAddressCmd = self.wpan_cmd_prefix + 'setprop Dataset:DestIpAddress ' + Addr
2278*cfb92d14SAndroid Build Coastguard Worker                if self.__sendCommand(setAddressCmd)[0] == 'Fail':
2279*cfb92d14SAndroid Build Coastguard Worker                    return False
2280*cfb92d14SAndroid Build Coastguard Worker
2281*cfb92d14SAndroid Build Coastguard Worker            print(cmd)
2282*cfb92d14SAndroid Build Coastguard Worker
2283*cfb92d14SAndroid Build Coastguard Worker            return self.__sendCommand(cmd)[0] != 'Fail'
2284*cfb92d14SAndroid Build Coastguard Worker
2285*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
2286*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('MGMT_ACTIVE_GET() Error: ' + str(e))
2287*cfb92d14SAndroid Build Coastguard Worker
2288*cfb92d14SAndroid Build Coastguard Worker    def MGMT_ACTIVE_SET(
2289*cfb92d14SAndroid Build Coastguard Worker        self,
2290*cfb92d14SAndroid Build Coastguard Worker        sAddr='',
2291*cfb92d14SAndroid Build Coastguard Worker        xCommissioningSessionId=None,
2292*cfb92d14SAndroid Build Coastguard Worker        listActiveTimestamp=None,
2293*cfb92d14SAndroid Build Coastguard Worker        listChannelMask=None,
2294*cfb92d14SAndroid Build Coastguard Worker        xExtendedPanId=None,
2295*cfb92d14SAndroid Build Coastguard Worker        sNetworkName=None,
2296*cfb92d14SAndroid Build Coastguard Worker        sPSKc=None,
2297*cfb92d14SAndroid Build Coastguard Worker        listSecurityPolicy=None,
2298*cfb92d14SAndroid Build Coastguard Worker        xChannel=None,
2299*cfb92d14SAndroid Build Coastguard Worker        sMeshLocalPrefix=None,
2300*cfb92d14SAndroid Build Coastguard Worker        xMasterKey=None,
2301*cfb92d14SAndroid Build Coastguard Worker        xPanId=None,
2302*cfb92d14SAndroid Build Coastguard Worker        xTmfPort=None,
2303*cfb92d14SAndroid Build Coastguard Worker        xSteeringData=None,
2304*cfb92d14SAndroid Build Coastguard Worker        xBorderRouterLocator=None,
2305*cfb92d14SAndroid Build Coastguard Worker        BogusTLV=None,
2306*cfb92d14SAndroid Build Coastguard Worker        xDelayTimer=None,
2307*cfb92d14SAndroid Build Coastguard Worker    ):
2308*cfb92d14SAndroid Build Coastguard Worker        """send MGMT_ACTIVE_SET command
2309*cfb92d14SAndroid Build Coastguard Worker
2310*cfb92d14SAndroid Build Coastguard Worker        Returns:
2311*cfb92d14SAndroid Build Coastguard Worker            True: successful to send MGMT_ACTIVE_SET
2312*cfb92d14SAndroid Build Coastguard Worker            False: fail to send MGMT_ACTIVE_SET
2313*cfb92d14SAndroid Build Coastguard Worker        """
2314*cfb92d14SAndroid Build Coastguard Worker        print('%s call MGMT_ACTIVE_SET' % self.port)
2315*cfb92d14SAndroid Build Coastguard Worker        try:
2316*cfb92d14SAndroid Build Coastguard Worker            cmd = self.wpan_cmd_prefix + 'dataset mgmt-set-active'
2317*cfb92d14SAndroid Build Coastguard Worker
2318*cfb92d14SAndroid Build Coastguard Worker            if self.__sendCommand(self.wpan_cmd_prefix + 'dataset erase')[0] == 'Fail':
2319*cfb92d14SAndroid Build Coastguard Worker                return False
2320*cfb92d14SAndroid Build Coastguard Worker
2321*cfb92d14SAndroid Build Coastguard Worker            if listActiveTimestamp is not None:
2322*cfb92d14SAndroid Build Coastguard Worker                sActiveTimestamp = '%016x' % listActiveTimestamp[0]
2323*cfb92d14SAndroid Build Coastguard Worker                setActiveTimeCmd = self.wpan_cmd_prefix + 'setprop Dataset:ActiveTimestamp ' + sActiveTimestamp
2324*cfb92d14SAndroid Build Coastguard Worker                if self.__sendCommand(setActiveTimeCmd)[0] == 'Fail':
2325*cfb92d14SAndroid Build Coastguard Worker                    return False
2326*cfb92d14SAndroid Build Coastguard Worker
2327*cfb92d14SAndroid Build Coastguard Worker            if xExtendedPanId is not None:
2328*cfb92d14SAndroid Build Coastguard Worker                xpanid = self.__convertLongToHex(xExtendedPanId, 16)
2329*cfb92d14SAndroid Build Coastguard Worker                setExtendedPanIdCmd = self.wpan_cmd_prefix + 'setprop Dataset:ExtendedPanId ' + xpanid
2330*cfb92d14SAndroid Build Coastguard Worker                if self.__sendCommand(setExtendedPanIdCmd)[0] == 'Fail':
2331*cfb92d14SAndroid Build Coastguard Worker                    return False
2332*cfb92d14SAndroid Build Coastguard Worker
2333*cfb92d14SAndroid Build Coastguard Worker            if sNetworkName is not None:
2334*cfb92d14SAndroid Build Coastguard Worker                setNetworkNameCmd = self.wpan_cmd_prefix + 'setprop Dataset:NetworkName ' + str(sNetworkName)
2335*cfb92d14SAndroid Build Coastguard Worker                if self.__sendCommand(setNetworkNameCmd)[0] == 'Fail':
2336*cfb92d14SAndroid Build Coastguard Worker                    return False
2337*cfb92d14SAndroid Build Coastguard Worker
2338*cfb92d14SAndroid Build Coastguard Worker            if xChannel is not None:
2339*cfb92d14SAndroid Build Coastguard Worker                setChannelCmd = self.wpan_cmd_prefix + 'setprop Dataset:Channel ' + str(xChannel)
2340*cfb92d14SAndroid Build Coastguard Worker                if self.__sendCommand(setChannelCmd)[0] == 'Fail':
2341*cfb92d14SAndroid Build Coastguard Worker                    return False
2342*cfb92d14SAndroid Build Coastguard Worker
2343*cfb92d14SAndroid Build Coastguard Worker            if sMeshLocalPrefix is not None:
2344*cfb92d14SAndroid Build Coastguard Worker                setMLPrefixCmd = self.wpan_cmd_prefix + 'setprop Dataset:MeshLocalPrefix ' + str(sMeshLocalPrefix)
2345*cfb92d14SAndroid Build Coastguard Worker                if self.__sendCommand(setMLPrefixCmd)[0] == 'Fail':
2346*cfb92d14SAndroid Build Coastguard Worker                    return False
2347*cfb92d14SAndroid Build Coastguard Worker
2348*cfb92d14SAndroid Build Coastguard Worker            if xMasterKey is not None:
2349*cfb92d14SAndroid Build Coastguard Worker                key = self.__convertLongToHex(xMasterKey, 32)
2350*cfb92d14SAndroid Build Coastguard Worker                setNetworkKeyCmd = self.wpan_cmd_prefix + 'setprop Dataset:NetworkKey ' + key
2351*cfb92d14SAndroid Build Coastguard Worker                if self.__sendCommand(setNetworkKeyCmd)[0] == 'Fail':
2352*cfb92d14SAndroid Build Coastguard Worker                    return False
2353*cfb92d14SAndroid Build Coastguard Worker
2354*cfb92d14SAndroid Build Coastguard Worker            if xPanId is not None:
2355*cfb92d14SAndroid Build Coastguard Worker                setPanIdCmd = self.wpan_cmd_prefix + 'setprop Dataset:PanId ' + str(xPanId)
2356*cfb92d14SAndroid Build Coastguard Worker                if self.__sendCommand(setPanIdCmd)[0] == 'Fail':
2357*cfb92d14SAndroid Build Coastguard Worker                    return False
2358*cfb92d14SAndroid Build Coastguard Worker
2359*cfb92d14SAndroid Build Coastguard Worker            if listChannelMask is not None:
2360*cfb92d14SAndroid Build Coastguard Worker                setChannelMaskCmd = (self.wpan_cmd_prefix + 'setprop Dataset:ChannelMaskPage0 ' + '0x' +
2361*cfb92d14SAndroid Build Coastguard Worker                                     self.__convertLongToHex(self.__convertChannelMask(listChannelMask)))
2362*cfb92d14SAndroid Build Coastguard Worker                if self.__sendCommand(setChannelMaskCmd)[0] == 'Fail':
2363*cfb92d14SAndroid Build Coastguard Worker                    return False
2364*cfb92d14SAndroid Build Coastguard Worker
2365*cfb92d14SAndroid Build Coastguard Worker            if (sPSKc is not None or listSecurityPolicy is not None or xCommissioningSessionId is not None or
2366*cfb92d14SAndroid Build Coastguard Worker                    xTmfPort is not None or xSteeringData is not None or xBorderRouterLocator is not None or
2367*cfb92d14SAndroid Build Coastguard Worker                    BogusTLV is not None):
2368*cfb92d14SAndroid Build Coastguard Worker                setRawTLVCmd = self.wpan_cmd_prefix + 'setprop Dataset:RawTlvs '
2369*cfb92d14SAndroid Build Coastguard Worker
2370*cfb92d14SAndroid Build Coastguard Worker            if sPSKc is not None:
2371*cfb92d14SAndroid Build Coastguard Worker                setRawTLVCmd += '0410'
2372*cfb92d14SAndroid Build Coastguard Worker                stretchedPskc = Thread_PBKDF2.get(sPSKc, ModuleHelper.Default_XpanId, ModuleHelper.Default_NwkName)
2373*cfb92d14SAndroid Build Coastguard Worker                pskc = '%x' % stretchedPskc
2374*cfb92d14SAndroid Build Coastguard Worker
2375*cfb92d14SAndroid Build Coastguard Worker                if len(pskc) < 32:
2376*cfb92d14SAndroid Build Coastguard Worker                    pskc = pskc.zfill(32)
2377*cfb92d14SAndroid Build Coastguard Worker
2378*cfb92d14SAndroid Build Coastguard Worker                setRawTLVCmd += pskc
2379*cfb92d14SAndroid Build Coastguard Worker
2380*cfb92d14SAndroid Build Coastguard Worker            if listSecurityPolicy is not None:
2381*cfb92d14SAndroid Build Coastguard Worker                setRawTLVCmd += '0c03'
2382*cfb92d14SAndroid Build Coastguard Worker
2383*cfb92d14SAndroid Build Coastguard Worker                rotationTime = 0
2384*cfb92d14SAndroid Build Coastguard Worker                policyBits = 0
2385*cfb92d14SAndroid Build Coastguard Worker
2386*cfb92d14SAndroid Build Coastguard Worker                # previous passing way listSecurityPolicy=[True, True, 3600,
2387*cfb92d14SAndroid Build Coastguard Worker                # False, False, True]
2388*cfb92d14SAndroid Build Coastguard Worker                if len(listSecurityPolicy) == 6:
2389*cfb92d14SAndroid Build Coastguard Worker                    rotationTime = listSecurityPolicy[2]
2390*cfb92d14SAndroid Build Coastguard Worker
2391*cfb92d14SAndroid Build Coastguard Worker                    # the last three reserved bits must be 1
2392*cfb92d14SAndroid Build Coastguard Worker                    policyBits = 0b00000111
2393*cfb92d14SAndroid Build Coastguard Worker
2394*cfb92d14SAndroid Build Coastguard Worker                    if listSecurityPolicy[0]:
2395*cfb92d14SAndroid Build Coastguard Worker                        policyBits = policyBits | 0b10000000
2396*cfb92d14SAndroid Build Coastguard Worker                    if listSecurityPolicy[1]:
2397*cfb92d14SAndroid Build Coastguard Worker                        policyBits = policyBits | 0b01000000
2398*cfb92d14SAndroid Build Coastguard Worker                    if listSecurityPolicy[3]:
2399*cfb92d14SAndroid Build Coastguard Worker                        policyBits = policyBits | 0b00100000
2400*cfb92d14SAndroid Build Coastguard Worker                    if listSecurityPolicy[4]:
2401*cfb92d14SAndroid Build Coastguard Worker                        policyBits = policyBits | 0b00010000
2402*cfb92d14SAndroid Build Coastguard Worker                    if listSecurityPolicy[5]:
2403*cfb92d14SAndroid Build Coastguard Worker                        policyBits = policyBits | 0b00001000
2404*cfb92d14SAndroid Build Coastguard Worker                else:
2405*cfb92d14SAndroid Build Coastguard Worker                    # new passing way listSecurityPolicy=[3600, 0b11001111]
2406*cfb92d14SAndroid Build Coastguard Worker                    rotationTime = listSecurityPolicy[0]
2407*cfb92d14SAndroid Build Coastguard Worker                    policyBits = listSecurityPolicy[1]
2408*cfb92d14SAndroid Build Coastguard Worker
2409*cfb92d14SAndroid Build Coastguard Worker                policy = str(hex(rotationTime))[2:]
2410*cfb92d14SAndroid Build Coastguard Worker
2411*cfb92d14SAndroid Build Coastguard Worker                if len(policy) < 4:
2412*cfb92d14SAndroid Build Coastguard Worker                    policy = policy.zfill(4)
2413*cfb92d14SAndroid Build Coastguard Worker
2414*cfb92d14SAndroid Build Coastguard Worker                setRawTLVCmd += policy
2415*cfb92d14SAndroid Build Coastguard Worker
2416*cfb92d14SAndroid Build Coastguard Worker                setRawTLVCmd += str(hex(policyBits))[2:]
2417*cfb92d14SAndroid Build Coastguard Worker
2418*cfb92d14SAndroid Build Coastguard Worker            if xCommissioningSessionId is not None:
2419*cfb92d14SAndroid Build Coastguard Worker                setRawTLVCmd += '0b02'
2420*cfb92d14SAndroid Build Coastguard Worker                sessionid = str(hex(xCommissioningSessionId))[2:]
2421*cfb92d14SAndroid Build Coastguard Worker
2422*cfb92d14SAndroid Build Coastguard Worker                if len(sessionid) < 4:
2423*cfb92d14SAndroid Build Coastguard Worker                    sessionid = sessionid.zfill(4)
2424*cfb92d14SAndroid Build Coastguard Worker
2425*cfb92d14SAndroid Build Coastguard Worker                setRawTLVCmd += sessionid
2426*cfb92d14SAndroid Build Coastguard Worker
2427*cfb92d14SAndroid Build Coastguard Worker            if xBorderRouterLocator is not None:
2428*cfb92d14SAndroid Build Coastguard Worker                setRawTLVCmd += '0902'
2429*cfb92d14SAndroid Build Coastguard Worker                locator = str(hex(xBorderRouterLocator))[2:]
2430*cfb92d14SAndroid Build Coastguard Worker
2431*cfb92d14SAndroid Build Coastguard Worker                if len(locator) < 4:
2432*cfb92d14SAndroid Build Coastguard Worker                    locator = locator.zfill(4)
2433*cfb92d14SAndroid Build Coastguard Worker
2434*cfb92d14SAndroid Build Coastguard Worker                setRawTLVCmd += locator
2435*cfb92d14SAndroid Build Coastguard Worker
2436*cfb92d14SAndroid Build Coastguard Worker            if xSteeringData is not None:
2437*cfb92d14SAndroid Build Coastguard Worker                steeringData = self.__convertLongToHex(xSteeringData)
2438*cfb92d14SAndroid Build Coastguard Worker                setRawTLVCmd += '08' + str(len(steeringData) / 2).zfill(2)
2439*cfb92d14SAndroid Build Coastguard Worker                setRawTLVCmd += steeringData
2440*cfb92d14SAndroid Build Coastguard Worker
2441*cfb92d14SAndroid Build Coastguard Worker            if BogusTLV is not None:
2442*cfb92d14SAndroid Build Coastguard Worker                setRawTLVCmd += '8202aa55'
2443*cfb92d14SAndroid Build Coastguard Worker
2444*cfb92d14SAndroid Build Coastguard Worker            print(setRawTLVCmd)
2445*cfb92d14SAndroid Build Coastguard Worker            print(cmd)
2446*cfb92d14SAndroid Build Coastguard Worker
2447*cfb92d14SAndroid Build Coastguard Worker            if self.__sendCommand(setRawTLVCmd)[0] == 'Fail':
2448*cfb92d14SAndroid Build Coastguard Worker                return False
2449*cfb92d14SAndroid Build Coastguard Worker
2450*cfb92d14SAndroid Build Coastguard Worker            return self.__sendCommand(cmd)[0] != 'Fail'
2451*cfb92d14SAndroid Build Coastguard Worker
2452*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
2453*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('MGMT_ACTIVE_SET() Error: ' + str(e))
2454*cfb92d14SAndroid Build Coastguard Worker
2455*cfb92d14SAndroid Build Coastguard Worker    def MGMT_PENDING_GET(self, Addr='', TLVs=[]):
2456*cfb92d14SAndroid Build Coastguard Worker        """send MGMT_PENDING_GET command
2457*cfb92d14SAndroid Build Coastguard Worker
2458*cfb92d14SAndroid Build Coastguard Worker        Returns:
2459*cfb92d14SAndroid Build Coastguard Worker            True: successful to send MGMT_PENDING_GET
2460*cfb92d14SAndroid Build Coastguard Worker            False: fail to send MGMT_PENDING_GET
2461*cfb92d14SAndroid Build Coastguard Worker        """
2462*cfb92d14SAndroid Build Coastguard Worker        print('%s call MGMT_PENDING_GET' % self.port)
2463*cfb92d14SAndroid Build Coastguard Worker        try:
2464*cfb92d14SAndroid Build Coastguard Worker            cmd = self.wpan_cmd_prefix + 'dataset mgmt-get-pending'
2465*cfb92d14SAndroid Build Coastguard Worker
2466*cfb92d14SAndroid Build Coastguard Worker            if len(TLVs) != 0:
2467*cfb92d14SAndroid Build Coastguard Worker                tlvs = ''.join('%02x' % tlv for tlv in TLVs)
2468*cfb92d14SAndroid Build Coastguard Worker                setTLVCmd = self.wpan_cmd_prefix + 'setprop Dataset:RawTlvs ' + tlvs
2469*cfb92d14SAndroid Build Coastguard Worker                if self.__sendCommand(setTLVCmd)[0] == 'Fail':
2470*cfb92d14SAndroid Build Coastguard Worker                    return False
2471*cfb92d14SAndroid Build Coastguard Worker            else:
2472*cfb92d14SAndroid Build Coastguard Worker                if self.__sendCommand(self.wpan_cmd_prefix + 'dataset erase')[0] == 'Fail':
2473*cfb92d14SAndroid Build Coastguard Worker                    return False
2474*cfb92d14SAndroid Build Coastguard Worker
2475*cfb92d14SAndroid Build Coastguard Worker            if Addr != '':
2476*cfb92d14SAndroid Build Coastguard Worker                setAddressCmd = self.wpan_cmd_prefix + 'setprop Dataset:DestIpAddress ' + Addr
2477*cfb92d14SAndroid Build Coastguard Worker                if self.__sendCommand(setAddressCmd)[0] == 'Fail':
2478*cfb92d14SAndroid Build Coastguard Worker                    return False
2479*cfb92d14SAndroid Build Coastguard Worker
2480*cfb92d14SAndroid Build Coastguard Worker            print(cmd)
2481*cfb92d14SAndroid Build Coastguard Worker
2482*cfb92d14SAndroid Build Coastguard Worker            return self.__sendCommand(cmd)[0] != 'Fail'
2483*cfb92d14SAndroid Build Coastguard Worker
2484*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
2485*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('MGMT_PENDING_GET() Error: ' + str(e))
2486*cfb92d14SAndroid Build Coastguard Worker
2487*cfb92d14SAndroid Build Coastguard Worker    def MGMT_PENDING_SET(
2488*cfb92d14SAndroid Build Coastguard Worker        self,
2489*cfb92d14SAndroid Build Coastguard Worker        sAddr='',
2490*cfb92d14SAndroid Build Coastguard Worker        xCommissionerSessionId=None,
2491*cfb92d14SAndroid Build Coastguard Worker        listPendingTimestamp=None,
2492*cfb92d14SAndroid Build Coastguard Worker        listActiveTimestamp=None,
2493*cfb92d14SAndroid Build Coastguard Worker        xDelayTimer=None,
2494*cfb92d14SAndroid Build Coastguard Worker        xChannel=None,
2495*cfb92d14SAndroid Build Coastguard Worker        xPanId=None,
2496*cfb92d14SAndroid Build Coastguard Worker        xMasterKey=None,
2497*cfb92d14SAndroid Build Coastguard Worker        sMeshLocalPrefix=None,
2498*cfb92d14SAndroid Build Coastguard Worker        sNetworkName=None,
2499*cfb92d14SAndroid Build Coastguard Worker    ):
2500*cfb92d14SAndroid Build Coastguard Worker        """send MGMT_PENDING_SET command
2501*cfb92d14SAndroid Build Coastguard Worker
2502*cfb92d14SAndroid Build Coastguard Worker        Returns:
2503*cfb92d14SAndroid Build Coastguard Worker            True: successful to send MGMT_PENDING_SET
2504*cfb92d14SAndroid Build Coastguard Worker            False: fail to send MGMT_PENDING_SET
2505*cfb92d14SAndroid Build Coastguard Worker        """
2506*cfb92d14SAndroid Build Coastguard Worker        print('%s call MGMT_PENDING_SET' % self.port)
2507*cfb92d14SAndroid Build Coastguard Worker        try:
2508*cfb92d14SAndroid Build Coastguard Worker            cmd = self.wpan_cmd_prefix + 'dataset mgmt-set-pending'
2509*cfb92d14SAndroid Build Coastguard Worker            if self.__sendCommand(self.wpan_cmd_prefix + 'dataset erase')[0] == 'Fail':
2510*cfb92d14SAndroid Build Coastguard Worker                return False
2511*cfb92d14SAndroid Build Coastguard Worker
2512*cfb92d14SAndroid Build Coastguard Worker            if listPendingTimestamp is not None:
2513*cfb92d14SAndroid Build Coastguard Worker                sActiveTimestamp = '%016x' % listPendingTimestamp[0]
2514*cfb92d14SAndroid Build Coastguard Worker                setPendingTimeCmd = self.wpan_cmd_prefix + 'setprop Dataset:PendingTimestamp ' + sActiveTimestamp
2515*cfb92d14SAndroid Build Coastguard Worker                if self.__sendCommand(setPendingTimeCmd)[0] == 'Fail':
2516*cfb92d14SAndroid Build Coastguard Worker                    return False
2517*cfb92d14SAndroid Build Coastguard Worker
2518*cfb92d14SAndroid Build Coastguard Worker            if listActiveTimestamp is not None:
2519*cfb92d14SAndroid Build Coastguard Worker                sActiveTimestamp = '%016x' % listActiveTimestamp[0]
2520*cfb92d14SAndroid Build Coastguard Worker                setActiveTimeCmd = self.wpan_cmd_prefix + 'setprop Dataset:ActiveTimestamp ' + sActiveTimestamp
2521*cfb92d14SAndroid Build Coastguard Worker                if self.__sendCommand(setActiveTimeCmd)[0] == 'Fail':
2522*cfb92d14SAndroid Build Coastguard Worker                    return False
2523*cfb92d14SAndroid Build Coastguard Worker
2524*cfb92d14SAndroid Build Coastguard Worker            if xDelayTimer is not None:
2525*cfb92d14SAndroid Build Coastguard Worker                setDelayTimerCmd = self.wpan_cmd_prefix + 'setprop Dataset:Delay ' + str(xDelayTimer)
2526*cfb92d14SAndroid Build Coastguard Worker                if self.__sendCommand(setDelayTimerCmd)[0] == 'Fail':
2527*cfb92d14SAndroid Build Coastguard Worker                    return False
2528*cfb92d14SAndroid Build Coastguard Worker
2529*cfb92d14SAndroid Build Coastguard Worker            if sNetworkName is not None:
2530*cfb92d14SAndroid Build Coastguard Worker                setNetworkNameCmd = self.wpan_cmd_prefix + 'setprop Dataset:NetworkName ' + str(sNetworkName)
2531*cfb92d14SAndroid Build Coastguard Worker                if self.__sendCommand(setNetworkNameCmd)[0] == 'Fail':
2532*cfb92d14SAndroid Build Coastguard Worker                    return False
2533*cfb92d14SAndroid Build Coastguard Worker
2534*cfb92d14SAndroid Build Coastguard Worker            if xChannel is not None:
2535*cfb92d14SAndroid Build Coastguard Worker                setChannelCmd = self.wpan_cmd_prefix + 'setprop Dataset:Channel ' + str(xChannel)
2536*cfb92d14SAndroid Build Coastguard Worker                if self.__sendCommand(setChannelCmd)[0] == 'Fail':
2537*cfb92d14SAndroid Build Coastguard Worker                    return False
2538*cfb92d14SAndroid Build Coastguard Worker
2539*cfb92d14SAndroid Build Coastguard Worker            if sMeshLocalPrefix is not None:
2540*cfb92d14SAndroid Build Coastguard Worker                setMLPrefixCmd = self.wpan_cmd_prefix + 'setprop Dataset:MeshLocalPrefix ' + str(sMeshLocalPrefix)
2541*cfb92d14SAndroid Build Coastguard Worker                if self.__sendCommand(setMLPrefixCmd)[0] == 'Fail':
2542*cfb92d14SAndroid Build Coastguard Worker                    return False
2543*cfb92d14SAndroid Build Coastguard Worker
2544*cfb92d14SAndroid Build Coastguard Worker            if xMasterKey is not None:
2545*cfb92d14SAndroid Build Coastguard Worker                key = self.__convertLongToHex(xMasterKey, 32)
2546*cfb92d14SAndroid Build Coastguard Worker                setNetworkKeyCmd = self.wpan_cmd_prefix + 'setprop Dataset:NetworkKey ' + key
2547*cfb92d14SAndroid Build Coastguard Worker                if self.__sendCommand(setNetworkKeyCmd)[0] == 'Fail':
2548*cfb92d14SAndroid Build Coastguard Worker                    return False
2549*cfb92d14SAndroid Build Coastguard Worker
2550*cfb92d14SAndroid Build Coastguard Worker            if xPanId is not None:
2551*cfb92d14SAndroid Build Coastguard Worker                setPanIdCmd = self.wpan_cmd_prefix + 'setprop Dataset:PanId ' + str(xPanId)
2552*cfb92d14SAndroid Build Coastguard Worker                if self.__sendCommand(setPanIdCmd)[0] == 'Fail':
2553*cfb92d14SAndroid Build Coastguard Worker                    return False
2554*cfb92d14SAndroid Build Coastguard Worker
2555*cfb92d14SAndroid Build Coastguard Worker            if xCommissionerSessionId is not None:
2556*cfb92d14SAndroid Build Coastguard Worker                print('not handle xCommissionerSessionId')
2557*cfb92d14SAndroid Build Coastguard Worker
2558*cfb92d14SAndroid Build Coastguard Worker            print(cmd)
2559*cfb92d14SAndroid Build Coastguard Worker
2560*cfb92d14SAndroid Build Coastguard Worker            return self.__sendCommand(cmd)[0] != 'Fail'
2561*cfb92d14SAndroid Build Coastguard Worker
2562*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
2563*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('MGMT_PENDING_SET() Error: ' + str(e))
2564*cfb92d14SAndroid Build Coastguard Worker
2565*cfb92d14SAndroid Build Coastguard Worker    def MGMT_COMM_GET(self, Addr='ff02::1', TLVs=[]):
2566*cfb92d14SAndroid Build Coastguard Worker        """send MGMT_COMM_GET command
2567*cfb92d14SAndroid Build Coastguard Worker
2568*cfb92d14SAndroid Build Coastguard Worker        Returns:
2569*cfb92d14SAndroid Build Coastguard Worker            True: successful to send MGMT_COMM_GET
2570*cfb92d14SAndroid Build Coastguard Worker            False: fail to send MGMT_COMM_GET
2571*cfb92d14SAndroid Build Coastguard Worker        """
2572*cfb92d14SAndroid Build Coastguard Worker        print('%s call MGMT_COMM_GET' % self.port)
2573*cfb92d14SAndroid Build Coastguard Worker        try:
2574*cfb92d14SAndroid Build Coastguard Worker            cmd = self.wpan_cmd_prefix + 'commissioner mgmt-get '
2575*cfb92d14SAndroid Build Coastguard Worker            print('TLVs:')
2576*cfb92d14SAndroid Build Coastguard Worker            print(TLVs)
2577*cfb92d14SAndroid Build Coastguard Worker
2578*cfb92d14SAndroid Build Coastguard Worker            if len(TLVs) != 0:
2579*cfb92d14SAndroid Build Coastguard Worker                tlvs = ''.join('%02x' % tlv for tlv in TLVs)
2580*cfb92d14SAndroid Build Coastguard Worker                cmd += tlvs
2581*cfb92d14SAndroid Build Coastguard Worker
2582*cfb92d14SAndroid Build Coastguard Worker            print(cmd)
2583*cfb92d14SAndroid Build Coastguard Worker
2584*cfb92d14SAndroid Build Coastguard Worker            return self.__sendCommand(cmd)[0] != 'Fail'
2585*cfb92d14SAndroid Build Coastguard Worker
2586*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
2587*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('MGMT_COMM_GET() Error: ' + str(e))
2588*cfb92d14SAndroid Build Coastguard Worker
2589*cfb92d14SAndroid Build Coastguard Worker    def MGMT_COMM_SET(
2590*cfb92d14SAndroid Build Coastguard Worker        self,
2591*cfb92d14SAndroid Build Coastguard Worker        Addr='ff02::1',
2592*cfb92d14SAndroid Build Coastguard Worker        xCommissionerSessionID=None,
2593*cfb92d14SAndroid Build Coastguard Worker        xSteeringData=None,
2594*cfb92d14SAndroid Build Coastguard Worker        xBorderRouterLocator=None,
2595*cfb92d14SAndroid Build Coastguard Worker        xChannelTlv=None,
2596*cfb92d14SAndroid Build Coastguard Worker        ExceedMaxPayload=False,
2597*cfb92d14SAndroid Build Coastguard Worker    ):
2598*cfb92d14SAndroid Build Coastguard Worker        """send MGMT_COMM_SET command
2599*cfb92d14SAndroid Build Coastguard Worker
2600*cfb92d14SAndroid Build Coastguard Worker        Returns:
2601*cfb92d14SAndroid Build Coastguard Worker            True: successful to send MGMT_COMM_SET
2602*cfb92d14SAndroid Build Coastguard Worker            False: fail to send MGMT_COMM_SET
2603*cfb92d14SAndroid Build Coastguard Worker        """
2604*cfb92d14SAndroid Build Coastguard Worker        print('%s call MGMT_COMM_SET' % self.port)
2605*cfb92d14SAndroid Build Coastguard Worker        try:
2606*cfb92d14SAndroid Build Coastguard Worker            cmd = self.wpan_cmd_prefix + 'commissioner mgmt-set '
2607*cfb92d14SAndroid Build Coastguard Worker            print('-------------------------------')
2608*cfb92d14SAndroid Build Coastguard Worker            print(xCommissionerSessionID)
2609*cfb92d14SAndroid Build Coastguard Worker            print(xSteeringData)
2610*cfb92d14SAndroid Build Coastguard Worker            print(str(xSteeringData) + '   ' + str(hex(xSteeringData)[2:]))
2611*cfb92d14SAndroid Build Coastguard Worker            print(xBorderRouterLocator)
2612*cfb92d14SAndroid Build Coastguard Worker            print(xChannelTlv)
2613*cfb92d14SAndroid Build Coastguard Worker            print(ExceedMaxPayload)
2614*cfb92d14SAndroid Build Coastguard Worker            print('-------------------------------')
2615*cfb92d14SAndroid Build Coastguard Worker
2616*cfb92d14SAndroid Build Coastguard Worker            if xCommissionerSessionID is not None:
2617*cfb92d14SAndroid Build Coastguard Worker                # use assigned session id
2618*cfb92d14SAndroid Build Coastguard Worker                cmd += '0b02' + str(xCommissionerSessionID)
2619*cfb92d14SAndroid Build Coastguard Worker            elif xCommissionerSessionID is None:
2620*cfb92d14SAndroid Build Coastguard Worker                # use original session id
2621*cfb92d14SAndroid Build Coastguard Worker                if self.isActiveCommissioner is True:
2622*cfb92d14SAndroid Build Coastguard Worker                    cmd += '0b02' + self.__lstrip0x(self.__getCommissionerSessionId())
2623*cfb92d14SAndroid Build Coastguard Worker                else:
2624*cfb92d14SAndroid Build Coastguard Worker                    pass
2625*cfb92d14SAndroid Build Coastguard Worker
2626*cfb92d14SAndroid Build Coastguard Worker            if xSteeringData is not None:
2627*cfb92d14SAndroid Build Coastguard Worker                cmd += '08' + str(len(hex(xSteeringData)[2:])) + str(hex(xSteeringData)[2:])
2628*cfb92d14SAndroid Build Coastguard Worker
2629*cfb92d14SAndroid Build Coastguard Worker            if xBorderRouterLocator is not None:
2630*cfb92d14SAndroid Build Coastguard Worker                cmd += '0902' + str(hex(xBorderRouterLocator))
2631*cfb92d14SAndroid Build Coastguard Worker
2632*cfb92d14SAndroid Build Coastguard Worker            if xChannelTlv is not None:
2633*cfb92d14SAndroid Build Coastguard Worker                cmd += '000300' + '%04x' % xChannelTlv
2634*cfb92d14SAndroid Build Coastguard Worker
2635*cfb92d14SAndroid Build Coastguard Worker            print(cmd)
2636*cfb92d14SAndroid Build Coastguard Worker
2637*cfb92d14SAndroid Build Coastguard Worker            return self.__sendCommand(cmd)[0] != 'Fail'
2638*cfb92d14SAndroid Build Coastguard Worker
2639*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
2640*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('MGMT_COMM_SET() Error: ' + str(e))
2641*cfb92d14SAndroid Build Coastguard Worker
2642*cfb92d14SAndroid Build Coastguard Worker    def setActiveDataset(self, listActiveDataset=[]):
2643*cfb92d14SAndroid Build Coastguard Worker        print('%s call setActiveDataset' % self.port)
2644*cfb92d14SAndroid Build Coastguard Worker
2645*cfb92d14SAndroid Build Coastguard Worker    def setCommisionerMode(self):
2646*cfb92d14SAndroid Build Coastguard Worker        print('%s call setCommissionerMode' % self.port)
2647*cfb92d14SAndroid Build Coastguard Worker
2648*cfb92d14SAndroid Build Coastguard Worker    def setPSKc(self, strPSKc):
2649*cfb92d14SAndroid Build Coastguard Worker        print('%s call setPSKc' % self.port)
2650*cfb92d14SAndroid Build Coastguard Worker        try:
2651*cfb92d14SAndroid Build Coastguard Worker            cmd = self.wpan_cmd_prefix + 'setprop Network:PSKc %s' % strPSKc
2652*cfb92d14SAndroid Build Coastguard Worker            datasetCmd = self.wpan_cmd_prefix + 'setprop Dataset:PSKc %s' % strPSKc
2653*cfb92d14SAndroid Build Coastguard Worker            self.hasActiveDatasetToCommit = True
2654*cfb92d14SAndroid Build Coastguard Worker            return self.__sendCommand(cmd)[0] != 'Fail' and self.__sendCommand(datasetCmd)[0] != 'Fail'
2655*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
2656*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('setPSKc() Error: ' + str(e))
2657*cfb92d14SAndroid Build Coastguard Worker
2658*cfb92d14SAndroid Build Coastguard Worker    def setActiveTimestamp(self, xActiveTimestamp):
2659*cfb92d14SAndroid Build Coastguard Worker        print('%s call setActiveTimestamp' % self.port)
2660*cfb92d14SAndroid Build Coastguard Worker        try:
2661*cfb92d14SAndroid Build Coastguard Worker            sActiveTimestamp = str(xActiveTimestamp)
2662*cfb92d14SAndroid Build Coastguard Worker            if len(sActiveTimestamp) < 16:
2663*cfb92d14SAndroid Build Coastguard Worker                sActiveTimestamp = sActiveTimestamp.zfill(16)
2664*cfb92d14SAndroid Build Coastguard Worker            self.activetimestamp = sActiveTimestamp
2665*cfb92d14SAndroid Build Coastguard Worker            cmd = self.wpan_cmd_prefix + 'setprop Dataset:ActiveTimestamp %s' % sActiveTimestamp
2666*cfb92d14SAndroid Build Coastguard Worker            self.hasActiveDatasetToCommit = True
2667*cfb92d14SAndroid Build Coastguard Worker            return self.__sendCommand(cmd)[0] != 'Fail'
2668*cfb92d14SAndroid Build Coastguard Worker        except Exception as e:
2669*cfb92d14SAndroid Build Coastguard Worker            ModuleHelper.WriteIntoDebugLogger('setActiveTimestamp() Error: ' + str(e))
2670*cfb92d14SAndroid Build Coastguard Worker
2671*cfb92d14SAndroid Build Coastguard Worker    def setUdpJoinerPort(self, portNumber):
2672*cfb92d14SAndroid Build Coastguard Worker        """set Joiner UDP Port
2673*cfb92d14SAndroid Build Coastguard Worker
2674*cfb92d14SAndroid Build Coastguard Worker        Args:
2675*cfb92d14SAndroid Build Coastguard Worker            portNumber: Joiner UDP Port number
2676*cfb92d14SAndroid Build Coastguard Worker
2677*cfb92d14SAndroid Build Coastguard Worker        Returns:
2678*cfb92d14SAndroid Build Coastguard Worker            True: successful to set Joiner UDP Port
2679*cfb92d14SAndroid Build Coastguard Worker            False: fail to set Joiner UDP Port
2680*cfb92d14SAndroid Build Coastguard Worker
2681*cfb92d14SAndroid Build Coastguard Worker        @todo : required if as reference device
2682*cfb92d14SAndroid Build Coastguard Worker        """
2683*cfb92d14SAndroid Build Coastguard Worker
2684*cfb92d14SAndroid Build Coastguard Worker    def commissionerUnregister(self):
2685*cfb92d14SAndroid Build Coastguard Worker        """stop commissioner
2686*cfb92d14SAndroid Build Coastguard Worker
2687*cfb92d14SAndroid Build Coastguard Worker        Returns:
2688*cfb92d14SAndroid Build Coastguard Worker            True: successful to stop commissioner
2689*cfb92d14SAndroid Build Coastguard Worker            False: fail to stop commissioner
2690*cfb92d14SAndroid Build Coastguard Worker        """
2691*cfb92d14SAndroid Build Coastguard Worker        print('%s call commissionerUnregister' % self.port)
2692*cfb92d14SAndroid Build Coastguard Worker        cmd = self.wpan_cmd_prefix + 'commissioner stop'
2693*cfb92d14SAndroid Build Coastguard Worker        print(cmd)
2694*cfb92d14SAndroid Build Coastguard Worker        if self.__sendCommand(cmd)[0] != 'Fail':
2695*cfb92d14SAndroid Build Coastguard Worker            self.isActiveCommissioner = False
2696*cfb92d14SAndroid Build Coastguard Worker            return True
2697*cfb92d14SAndroid Build Coastguard Worker        else:
2698*cfb92d14SAndroid Build Coastguard Worker            return False
2699*cfb92d14SAndroid Build Coastguard Worker
2700*cfb92d14SAndroid Build Coastguard Worker    def sendBeacons(self, sAddr, xCommissionerSessionId, listChannelMask, xPanId):
2701*cfb92d14SAndroid Build Coastguard Worker        print('%s call sendBeacons' % self.port)
2702*cfb92d14SAndroid Build Coastguard Worker        self._sendline(self.wpan_cmd_prefix + 'scan')
2703*cfb92d14SAndroid Build Coastguard Worker        return True
2704*cfb92d14SAndroid Build Coastguard Worker
2705*cfb92d14SAndroid Build Coastguard Worker    def updateRouterStatus(self):
2706*cfb92d14SAndroid Build Coastguard Worker        """force update to router as if there is child id request
2707*cfb92d14SAndroid Build Coastguard Worker            @todo : required if as reference device
2708*cfb92d14SAndroid Build Coastguard Worker        """
2709*cfb92d14SAndroid Build Coastguard Worker
2710*cfb92d14SAndroid Build Coastguard Worker    def setRouterThresholdValues(self, upgradeThreshold, downgradeThreshold):
2711*cfb92d14SAndroid Build Coastguard Worker        print('%s call setRouterThresholdValues' % self.port)
2712*cfb92d14SAndroid Build Coastguard Worker        self.__setRouterUpgradeThreshold(upgradeThreshold)
2713*cfb92d14SAndroid Build Coastguard Worker        self.__setRouterDowngradeThreshold(downgradeThreshold)
2714*cfb92d14SAndroid Build Coastguard Worker
2715*cfb92d14SAndroid Build Coastguard Worker    def setMinDelayTimer(self, iSeconds):
2716*cfb92d14SAndroid Build Coastguard Worker        pass
2717*cfb92d14SAndroid Build Coastguard Worker
2718*cfb92d14SAndroid Build Coastguard Worker    def ValidateDeviceFirmware(self):
2719*cfb92d14SAndroid Build Coastguard Worker        print('%s call ValidateDeviceFirmware' % self.port)
2720*cfb92d14SAndroid Build Coastguard Worker        if 'OPENTHREAD' in self.UIStatusMsg:
2721*cfb92d14SAndroid Build Coastguard Worker            return True
2722*cfb92d14SAndroid Build Coastguard Worker        else:
2723*cfb92d14SAndroid Build Coastguard Worker            return False
2724*cfb92d14SAndroid Build Coastguard Worker
2725*cfb92d14SAndroid Build Coastguard Worker    @staticmethod
2726*cfb92d14SAndroid Build Coastguard Worker    def __lstrip0x(s):
2727*cfb92d14SAndroid Build Coastguard Worker        """strip 0x at the beginning of a hex string if it exists
2728*cfb92d14SAndroid Build Coastguard Worker
2729*cfb92d14SAndroid Build Coastguard Worker        Args:
2730*cfb92d14SAndroid Build Coastguard Worker            s: hex string
2731*cfb92d14SAndroid Build Coastguard Worker
2732*cfb92d14SAndroid Build Coastguard Worker        Returns:
2733*cfb92d14SAndroid Build Coastguard Worker            hex string with leading 0x stripped
2734*cfb92d14SAndroid Build Coastguard Worker        """
2735*cfb92d14SAndroid Build Coastguard Worker        if s.startswith('0x'):
2736*cfb92d14SAndroid Build Coastguard Worker            s = s[2:]
2737*cfb92d14SAndroid Build Coastguard Worker
2738*cfb92d14SAndroid Build Coastguard Worker        return s
2739