Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revisionBoth sides next revision
inbox:toh:d-link:covr-p2500_a1 [2023/11/09 16:33] – [OEM bootlog] jokujossaiinbox:toh:d-link:covr-p2500_a1 [2023/11/23 17:12] – [D-Link COVR-P2500 A1] jokujossai
Line 1: Line 1:
 ====== D-Link COVR-P2500 A1====== ====== D-Link COVR-P2500 A1======
 ~~NOTOC~~ ~~NOTOC~~
- 
-/* This template is intended to be used via https://openwrt.org/meta/create_new_device_page . */ 
- 
-{{page>meta:infobox:construction&noheader&nofooter&noeditbtn}} 
  
 The D-Link COVR-P2500 A1 is a AC1200 dual band wireless access point with wired Ethernet, Wi-Fi and PowerLine interfaces. It is basically a standard router with a Homeplug AV2 Powerline Communication (PLC) interface connected internally to one of the Ethernet switch ports.  The D-Link COVR-P2500 A1 is a AC1200 dual band wireless access point with wired Ethernet, Wi-Fi and PowerLine interfaces. It is basically a standard router with a Homeplug AV2 Powerline Communication (PLC) interface connected internally to one of the Ethernet switch ports. 
Line 68: Line 64:
 filter  : Version=A1 filter  : Version=A1
 ---- ----
 +
 +==== OEM easy installation ====
 +
 +  - Obtain *squashfs-factory.bin [[https://github.com/jokujossai/openwrt_covr_p2500/releases|openwrt_covr_p2500 releases]]
 +  - Flash with OEM firware upgrade
 +  - After installation finished reset factory defaults by holding reset button until red led blinks (~10 seconds)
  
  
Line 75: Line 77:
   - Flash with [[docs:guide-user:installation:installation_methods:d-link_recovery_gui|D-Link Recovery GUI]].   - Flash with [[docs:guide-user:installation:installation_methods:d-link_recovery_gui|D-Link Recovery GUI]].
     - The IP address of the Recovery UI is 192.168.0.50.     - The IP address of the Recovery UI is 192.168.0.50.
-    - Uploading does not work with modern operating systems, use dlink_recovery_upload.py script (Linux and Windows 10 version 1703 or newer)+    - Uploading does not work with modern operating systems, use [[#dlink_recovery_uploadpy|dlink_recovery_upload.py]] script (supported on Linux, MacOS and Windows 10 version 1703 or newer)
  
-==== Failsafe mode insallation ====+=== dlink_recovery_upload.py === 
 +<WRAP bootlog> 
 +<nowiki>#!/usr/bin/env python3 
 +# SPDX-License-Identifier: MIT 
 +
 +#   D-Link COVR-P2500 flash utility 
 +
 +#   Upload firmware to the device with waiting for ACK after each TCP packet. 
 +
 +#   Copyright (C) 2023 Daniel Linjama <daniel@dev.linjama.com> 
 +
 +#   Permission is hereby granted, free of charge, to any person obtaining a copy of 
 +#   this software and associated documentation files (the “Software”), to deal in the 
 +#   Software without restriction, including without limitation the rights to use, copy, 
 +#   modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, 
 +#   and to permit persons to whom the Software is furnished to do so, subject to the 
 +#   following conditions: 
 +
 +#   The above copyright notice and this permission notice shall be included in all 
 +#   copies or substantial portions of the Software. 
 +
 +#   THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 
 +#   INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 
 +#   PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 
 +#   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
 +#   OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 
 +#   SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
 + 
 + 
 +import argparse 
 +import ctypes 
 +import ctypes.wintypes 
 +import os 
 +import random 
 +import socket 
 +import sys 
 +import time 
 + 
 +BUFFER_SIZE = 512 
 +ACK_TIMEOUT = 10 
 + 
 + 
 +if sys.platform in ("linux", "linux2"): 
 +    class TCP_INFO(ctypes.Structure): 
 +        """ 
 +        tcp_info structure (https://sourceware.org/git?p=glibc.git;a=blob_plain;f=sysdeps/gnu/netinet/tcp.h;hb=HEAD) 
 + 
 +        struct tcp_info 
 +        { 
 +            uint8_t     tcpi_state; 
 +            uint8_t     tcpi_ca_state; 
 +            uint8_t     tcpi_retransmits; 
 +            uint8_t     tcpi_probes; 
 +            uint8_t     tcpi_backoff; 
 +            uint8_t     tcpi_options; 
 +            uint8_t     tcpi_snd_wscale : 4, tcpi_rcv_wscale : 4; 
 + 
 +            uint32_t    tcpi_rto; 
 +            uint32_t    tcpi_ato; 
 +            uint32_t    tcpi_snd_mss; 
 +            uint32_t    tcpi_rcv_mss; 
 + 
 +            uint32_t    tcpi_unacked; 
 +            uint32_t    tcpi_sacked; 
 +            uint32_t    tcpi_lost; 
 +            uint32_t    tcpi_retrans; 
 +            uint32_t    tcpi_fackets; 
 + 
 +            /* Times. */ 
 +            uint32_t    tcpi_last_data_sent; 
 +            uint32_t    tcpi_last_ack_sent; /* Not remembered, sorry.  */ 
 +            uint32_t    tcpi_last_data_recv; 
 +            uint32_t    tcpi_last_ack_recv; 
 + 
 +            /* Metrics. */ 
 +            uint32_t    tcpi_pmtu; 
 +            uint32_t    tcpi_rcv_ssthresh; 
 +            uint32_t    tcpi_rtt; 
 +            uint32_t    tcpi_rttvar; 
 +            uint32_t    tcpi_snd_ssthresh; 
 +            uint32_t    tcpi_snd_cwnd; 
 +            uint32_t    tcpi_advmss; 
 +            uint32_t    tcpi_reordering; 
 + 
 +            uint32_t    tcpi_rcv_rtt; 
 +            uint32_t    tcpi_rcv_space; 
 + 
 +            uint32_t    tcpi_total_retrans; 
 +        }; 
 +        """ 
 +        _fields_ = [ 
 +            ("tcpi_state", ctypes.c_uint8), 
 +            ("tcpi_ca_state", ctypes.c_uint8), 
 +            ("tcpi_retransmits", ctypes.c_uint8), 
 +            ("tcpi_probes", ctypes.c_uint8), 
 +            ("tcpi_backoff", ctypes.c_uint8), 
 +            ("tcpi_options", ctypes.c_uint8), 
 +            ("tcpi_snd_wscale", ctypes.c_uint8, 4), 
 +            ("tcpi_rcv_wscale", ctypes.c_uint8, 4), 
 + 
 +            ("tcpi_rto", ctypes.c_uint32), 
 +            ("tcpi_ato", ctypes.c_uint32), 
 +            ("tcpi_snd_mss", ctypes.c_uint32), 
 +            ("tcpi_rcv_mss", ctypes.c_uint32), 
 + 
 +            ("tcpi_unacked", ctypes.c_uint32), 
 +            ("tcpi_sacked", ctypes.c_uint32), 
 +            ("tcpi_lost", ctypes.c_uint32), 
 +            ("tcpi_retrans", ctypes.c_uint32), 
 +            ("tcpi_fackets", ctypes.c_uint32), 
 + 
 +            ("tcpi_last_data_sent", ctypes.c_uint32), 
 +            ("tcpi_last_ack_sent", ctypes.c_uint32), 
 +            ("tcpi_last_data_recv", ctypes.c_uint32), 
 +            ("tcpi_last_ack_recv", ctypes.c_uint32), 
 + 
 +            ("tcpi_pmtu", ctypes.c_uint32), 
 +            ("tcpi_rcv_ssthresh", ctypes.c_uint32), 
 +            ("tcpi_rtt", ctypes.c_uint32), 
 +            ("tcpi_rttvar", ctypes.c_uint32), 
 +            ("tcpi_snd_ssthresh", ctypes.c_uint32), 
 +            ("tcpi_snd_cwnd", ctypes.c_uint32), 
 +            ("tcpi_advmss", ctypes.c_uint32), 
 +            ("tcpi_reordering", ctypes.c_uint32), 
 + 
 +            ("tcpi_rcv_rtt", ctypes.c_uint32), 
 +            ("tcpi_rcv_space", ctypes.c_uint32), 
 + 
 +            ("tcpi_total_retrans", ctypes.c_uint32), 
 +        ] 
 + 
 +    def wait_ack(s: socket.socket): 
 +        """ 
 +        Linux compatible wait_ack implementation. 
 + 
 +        Waits until tcp_info.tcpi_unacked is zero. 
 + 
 +        :param socket.socket s: The socket to check for unacked TCP packets 
 +        :raises RuntimeError: if ACK_TIMEOUT exceeded 
 +        """ 
 +        timeout = time.time() + ACK_TIMEOUT 
 +        unacked = 1 
 +        while unacked > 0: 
 +            # Check timeout 
 +            if time.time() > timeout: 
 +                raise RuntimeError("ACK timeout"
 + 
 +            # Fetch tcp_info 
 +            tcp_info = TCP_INFO.from_buffer_copy( 
 +                s.getsockopt( 
 +                    socket.IPPROTO_TCP, 
 +                    socket.TCP_INFO, 
 +                    ctypes.sizeof(TCP_INFO) 
 +                ) 
 +            ) 
 + 
 +            unacked = tcp_info.tcpi_unacked 
 +elif sys.platform == "win32": 
 +    class TCP_INFO_v0(ctypes.Structure): 
 +        """ 
 +        TCP_INFO_v0 structure (https://learn.microsoft.com/en-us/windows/desktop/api/mstcpip/ns-mstcpip-tcp_info_v0) 
 + 
 +        Minimum supported client Windows 10, version 1703 [desktop apps only] 
 +        Minimum supported server Windows Server 2016 [desktop apps only] 
 + 
 +        typedef struct _TCP_INFO_v0 { 
 +            TCPSTATE State; 
 +            ULONG    Mss; 
 +            ULONG64  ConnectionTimeMs; 
 +            BOOLEAN  TimestampsEnabled; 
 +            ULONG    RttUs; 
 +            ULONG    MinRttUs; 
 +            ULONG    BytesInFlight; 
 +            ULONG    Cwnd; 
 +            ULONG    SndWnd; 
 +            ULONG    RcvWnd; 
 +            ULONG    RcvBuf; 
 +            ULONG64  BytesOut; 
 +            ULONG64  BytesIn; 
 +            ULONG    BytesReordered; 
 +            ULONG    BytesRetrans; 
 +            ULONG    FastRetrans; 
 +            ULONG    DupAcksIn; 
 +            ULONG    TimeoutEpisodes; 
 +            UCHAR    SynRetrans; 
 +        } TCP_INFO_v0, *PTCP_INFO_v0; 
 +        """ 
 +        _fields_ = [ 
 +            ("State", ctypes.c_int), 
 +            ("Mss", ctypes.wintypes.ULONG), 
 +            ("ConnectionTimeMs", ctypes.c_uint64), 
 +            ("TimestampsEnabled", ctypes.wintypes.BOOLEAN), 
 +            ("RttUs", ctypes.wintypes.ULONG), 
 +            ("MinRttUs", ctypes.wintypes.ULONG), 
 +            ("BytesInFlight", ctypes.wintypes.ULONG), 
 +            ("Cwnd", ctypes.wintypes.ULONG), 
 +            ("SndWnd", ctypes.wintypes.ULONG), 
 +            ("RcvWnd", ctypes.wintypes.ULONG), 
 +            ("RcvBuf", ctypes.wintypes.ULONG), 
 +            ("BytesOut", ctypes.c_uint64), 
 +            ("BytesIn", ctypes.c_uint64), 
 +            ("BytesReordered", ctypes.wintypes.ULONG), 
 +            ("BytesRetrans", ctypes.wintypes.ULONG), 
 +            ("FastRetrans", ctypes.wintypes.ULONG), 
 +            ("DupAcksIn", ctypes.wintypes.ULONG), 
 +            ("TimeoutEpisodes", ctypes.wintypes.ULONG), 
 +            ("SynRetrans", ctypes.c_uint8), 
 +        ] 
 + 
 +    # WSAIoctl function (https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsaioctl) 
 +    WSAIoctl_Fn = ctypes.windll.ws2_32.WSAIoctl 
 +    WSAIoctl_Fn.argtypes = [ 
 +        ctypes.c_void_p,                            # [in]  SOCKET 
 +        ctypes.wintypes.DWORD,                      # [in]  DWORD   dwIoControlCode 
 +        ctypes.c_void_p,                            # [in]  LPVOID  lpvInBuffer 
 +        ctypes.wintypes.DWORD,                      # [in]  DWORD   cbInBuffer 
 +        ctypes.c_void_p,                            # [out] LPVOID  lpvOutBuffer 
 +        ctypes.wintypes.DWORD,                      # [in]  DWORD   cbOutBuffer 
 +        ctypes.POINTER(ctypes.wintypes.DWORD),      # [out] LPWORD  lpcbBytesReturned 
 +        ctypes.c_void_p,                            # [in]  LPWSAOVERLAPPED lpOverlapped 
 +        ctypes.c_void_p,                            # [in]  LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine 
 +    ] 
 +    WSAIoctl_Fn.restype = ctypes.c_int              # int 
 + 
 +    def wait_ack(s: socket.socket): 
 +        """ 
 +        Windows compatible wait_ack implementation. 
 + 
 +        Waits until TCP_INFO_v0.BytesInFlight is zero. 
 +        Raises RuntimeError if ACK_TIMEOUT exceeded 
 +        """ 
 +        timeout = time.time() + ACK_TIMEOUT 
 + 
 +        sockfd = ctypes.c_void_p(s.fileno()) 
 +        # SIO_TCP_INFO 
 +        dwIoControlCode = ctypes.wintypes.DWORD( 
 +            1 << 31 # IOC_IN 
 +            | 
 +            1 << 30 # IOC_OUT 
 +            | 
 +            3 << 27 # IOC_VENDOR? 
 +            | 
 +            39 
 +        ) 
 +        infoVersion = ctypes.wintypes.DWORD(0) 
 +        tcpinfo = TCP_INFO_v0() 
 +        bytesReturned = ctypes.wintypes.DWORD(0) 
 + 
 +        unacked = 1 
 +        while unacked > 0: 
 +            # Check timeout 
 +            if time.time() > timeout: 
 +                raise RuntimeError("ACK timeout"
 + 
 +            # Fetch TCP_INFO_v0 
 +            res = WSAIoctl_Fn( 
 +                sockfd, 
 +                dwIoControlCode, 
 +                ctypes.pointer(infoVersion), 
 +                ctypes.wintypes.DWORD(ctypes.sizeof(infoVersion)), 
 +                ctypes.pointer(tcpinfo), 
 +                ctypes.wintypes.DWORD(ctypes.sizeof(tcpinfo)), 
 +                ctypes.pointer(bytesReturned), 
 +                None, 
 +                None 
 +            ) 
 +            assert res == 0 
 + 
 +            unacked = tcpinfo.BytesInFlight 
 +elif sys.platform == "darwin": 
 +    """ 
 +    SO_NWRITE returns the amount of data in the output buffer not yet sent by the protocol. 
 + 
 +    /Library/Developer/CommandLineTools/SDKs/MacOSX13.3.sdk/usr/include/sys/socket.h 
 +    #define SO_NWRITE       0x1024          /* APPLE: Get number of bytes currently in send socket buffer */ 
 +    """ 
 +    SO_NWRITE = 0x1024 
 + 
 +    def wait_ack(s: socket.socket): 
 +        """ 
 +        MacOS compatible wait_ack implementation. 
 + 
 +        Waits until SO_NWRITE is zero 
 + 
 +        :param socket.socket s: The socket to check for unacked TCP packets 
 +        :raises RuntimeError: if ACK_TIMEOUT exceeded 
 +        """ 
 +        timeout = time.time() + ACK_TIMEOUT 
 +        unacked = 1 
 +        while unacked > 0: 
 +            # Check timeout 
 +            if time.time() > timeout: 
 +                raise RuntimeError("ACK timeout"
 + 
 +            # Fecth SO_NWRITE 
 +            unacked = s.getsockopt( 
 +                socket.SOL_SOCKET, 
 +                SO_NWRITE 
 +            ) 
 +else: 
 +    raise RuntimeError("Unsupported sys.platform"
 + 
 + 
 +def upload(firmware, host="192.168.0.50", port=80, path="/upgrade.cgi"): 
 +    """ 
 +    Upload firmware to router 
 + 
 +    :param str firmware: Firmware file path 
 +    """ 
 + 
 +    assert os.path.isfile(firmware), f"File not found: firmware" 
 +    # File size for Content-Length calculation 
 +    fsize = os.stat(firmware).st_size 
 + 
 +    # Connect to router with TCP_NODELAY 
 +    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
 +    s.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) 
 +    s.connect((host, port)) 
 + 
 +    print(f"Connection established to {host}:{port}"
 + 
 +    # Values for headers 
 +    boundary = "---------------------------"+random.randbytes(6).hex()[:-1] 
 +    content_disposition = 'Content-Disposition: form-data; name="firmware"; filename="firmware.bin"' 
 +    content_type = 'Content-Type: application/octet-stream' 
 +    newline = "\r\n" 
 + 
 +    # Calculate HTTP Content-Length 
 +    content_length = ( 
 +        2+len(boundary)+len(newline) 
 +        +len(content_disposition)+len(newline) 
 +        +len(content_type)+len(newline) 
 +        +len(newline) 
 +        +fsize+len(newline) 
 +        +2+len(boundary)+2+len(newline) 
 +    ) 
 + 
 +    # Send HTTP headers 
 +    buffer = """POST {} HTTP/1.1 
 +Host: {} 
 +Content-Length: {} 
 +Content-Type: multipart/form-data; boundary={} 
 +Connection: Keep-Alive 
 + 
 +""".format(path, host, content_length, boundary).replace("\n", "\r\n").encode() 
 +    s.send(buffer) 
 +    wait_ack(s) 
 + 
 +    # Send multipart encapsulation boundary and headers 
 +    buffer = """--{} 
 +{} 
 +{} 
 + 
 +""".format(boundary, content_disposition, content_type).replace("\n", "\r\n").encode() 
 +    s.send(buffer) 
 +    wait_ack(s) 
 + 
 +    # Send firmware 
 +    print("If the upload gets stuck, turn off the device and try again"
 +    sent_bytes = 0 
 +    with open(firmware, "rb") as fh: 
 +        while True: 
 +            buffer = fh.read(BUFFER_SIZE) 
 +            if buffer == b"": 
 +                break 
 +            s.send(buffer) 
 +            wait_ack(s) 
 +            sent_bytes += len(buffer) 
 +            print("Uploading {}/{}".format(sent_bytes, fsize), end="\r"
 +            #sys.exit(1) 
 + 
 +    # Send ending boundary 
 +    buffer = """ 
 +--{}-- 
 +""".format(boundary).replace("\n", "\r\n").encode() 
 +    s.send(buffer) 
 +    wait_ack(s) 
 + 
 +    print() 
 +    print("Firmware uploaded successfully"
 + 
 +    # Print response 
 +    response = s.recv(4096).decode() 
 +    print(response) 
 +    # Check response contains "Upgrade successfully!" 
 +    assert "Upgrade successfully!" in response 
 + 
 +    # Wait some time before closing socket 
 +    time.sleep(1) 
 +    s.close() 
 + 
 +    # COVR-P2500 firmwares logic 
 +    # Increase percentage value every 2200ms and after 100% show ready message 
 +    percent = 1 
 +    while percent <= 100: 
 +        print(f"Device is upgrading the firmware... {percent}%", end='\r'
 +        percent += 1 
 +        time.sleep(2.2) 
 +    print("Upgrade should now be successfully finished."
 + 
 + 
 +if __name__ == "__main__": 
 +    parser = argparse.ArgumentParser( 
 +        description="D-Link COVR-P2500 flash utility", 
 +        epilog="(C) 2023 Daniel Linjama" 
 +    ) 
 +    parser.add_argument("firmware", type=str, help="Firmware file to upload"
 +    parser.add_argument("--host", type=str, default="192.168.0.50", help="Router IP address (default: 192.168.0.50)"
 +    parser.add_argument("--port", type=int, default=80, help="Router HTTP port (default: 80)"
 +    parser.add_argument("--path", type=str, default="/upgrade.cgi", help="HTTP path for firmware upgrade (default: /upgrade.cgi)"
 + 
 +    args = parser.parse_args() 
 + 
 +    upload(args.firmware, args.host, args.port, args.path) 
 +</nowiki> 
 +</WRAP>\\ 
 + 
 +==== Reverting to stock ==== 
 + 
 +  - Obtain unencrypted version of original firmware or decrypt with [[https://github.com/0xricksanchez/dlink-decrypt|dlink-decrypt]] 
 +  - Flash with [[docs:guide-user:installation:installation_methods:d-link_recovery_gui|D-Link Recovery GUI]]. 
 +    - The IP address of the Recovery UI is 192.168.0.50. 
 +    - Uploading does not work with modern operating systems, use [[#dlink_recovery_uploadpy|dlink_recovery_upload.py]] script (supported on Linux, MacOS and Windows 10 version 1703 or newer) 
 +==== Failsafe mode installation ====
  
-**NOTE! Only for stock firmware. OpenWRT has different flash layout**+**NOTE! Only use this method with stock firmware. OpenWRT has different flash layout**
  
   - Obtain *squashfs-recovery.bin [[https://github.com/jokujossai/openwrt_covr_p2500/releases|openwrt_covr_p2500 releases]]   - Obtain *squashfs-recovery.bin [[https://github.com/jokujossai/openwrt_covr_p2500/releases|openwrt_covr_p2500 releases]]
Line 98: Line 523:
 [[docs:guide-user:troubleshooting:failsafe_and_factory_reset]] [[docs:guide-user:troubleshooting:failsafe_and_factory_reset]]
  
-WIP+=== With OpenWRT firmware === 
 +  - Power on the device 
 +  - Wait until the power led color turns green 
 +  - Press the WPS button every 1 second until the power led starts blinking red  
 +  - Access device with "telnet 192.168.1.1"
  
 === With stock firmware === === With stock firmware ===
Line 147: Line 576:
 ***/ ***/
  
 +
 +===== Specific Configuration =====
 +
 +==== Network interfaces ====
 +The default network configuration is:
 +^ Interface Name   ^ Description                                ^ Default configuration    ^
 +| br-lan           | LAN & WiFi                                 | 192.168.1.1/24           |
 +| vlan1 (eth0.1)   | LAN Ports (1,2)                            | None                     |
 +| vlan2 (eth0.2)   | WAN Port (3)                               | DHCP                     |
 +| vlan3 (eth0.3    | PLC Port (4)                               | None                     |
 +| wlan0            | WiFi 5 GHz                                 | Disabled                 |
 +| wlan1            | WiFi 2.4 GHz                               | Disabled                 |
 +
 +==== Switch Ports (for VLANs) ====
 +
 +^ Port              ^ Switch port ^
 +| CPU               | 0           |
 +| LAN 1             | 1           |
 +| LAN 2             | 2           |
 +| WAN               | 3           |
 +| PLC               | 4           |
 +
 +==== Powerline configuration ====
 +
 +Powerline interface needs ''plchost'' daemon to work. PLC packages are installed by default but ''plchost'' requires also ''.nvm'' and ''.pib'' files to work. These files can be extracted from [[http://pmdap.dlink.com.tw/PMD/GetAgileFile?itemNumber=FIR1800225&fileName=COVRP2500A1_FW101b08_decrypted.bin&fileSize=1.5990457E7;1.5992229E7;65141.0;|original decrypted firmware]] and [[#etcinitdplc|/etc/init.d/plc]] service handles running ''plchost'' automatically.
 +
 +''plchost'' does not work if PLC device is added to ''br-lan'' bridge before connection is established. ''plc'' service bypasses this limitation by waiting PLC connection to be established before adding ''eth0.3'' to ''br-lan''.
 +
 +=== Powerline Quick Setup ===
 +
 +1. Add file [[#etcinitdplc|/etc/init.d/plc]] to device and make executable ''chmod +x /etc/init.d/plc''
 +
 +2. Make plc configuration kept on sysupgrade by creating file ''/lib/upgrade/keep.d/plc'' with following contents
 +
 +  /etc/plc
 +  /etc/init.d/plc
 +  /lib/upgrade/keep.d/plc
 +
 +3. Install ''unsquashfs'' tool for extracting files from original firmware ''opkg install squashfs-tools-unsquashfs''
 +
 +4. Install open-plc packages ''opkg install open-plc-utils open-plc-utils-hpavkey open-plc-utils-modpib open-plc-utils-plchost open-plc-utils-plctool''
 +
 +5. (Optional) Download ''QCA75XX-2.10.0.0032_modules_5-6_stripped.nvm'' (https://community.tp-link.com/us/home/forum/topic/204234) to /etc/plc directory
 +
 +6. Run setup tool ''/etc/init.d/plc setup''
 +
 +<hidden Setup example>
 +<code>
 +root@covrp2500_1:/# /etc/init.d/plc setup
 +Download original firmware and extract files from /lib/plc to /etc/plc [y|n] y
 +Downloading 'http://pmdap.dlink.com.tw/PMD/GetAgileFile?itemNumber=FIR1800225&fileName=COVRP2500A1_FW101b08_decrypted.bin&fileSize=1.5990457E7;1.5992229E7;65141.0;'
 +Connecting to 60.248.210.49:80
 +Writing to 'COVRP2500A1_FW101b08_decrypted.bin'
 +COVRP2500A1_FW101b08 15460k --:--:-- ETA
 +Download completed (15990457 bytes)
 +Parallel unsquashfs: Using 1 processor
 +4 inodes (6 blocks) to write
 +
 +[===================================================================|] 6/6 100%
 +
 +created 4 files
 +created 3 directories
 +created 0 symlinks
 +created 0 devices
 +created 0 fifos
 +created 0 sockets
 +1) /etc/plc/COVRP2500AVA1_PIB100EU_WM.pib
 +2) /etc/plc/COVRP2500AVA1_PIB100NA_WM.pib
 +3) /etc/plc/COVRP2500AVA1_PIB100SG_WM.pib
 +Select PibPath [1-3]: 1
 +1) /etc/plc/MAC-7500-v2.2.2-03-X-CS.nvm
 +2) /etc/plc/QCA7500-2.10.0032_modules_5-6_stripped.nvm
 +Select NvmPath [1-2]: 2
 +NetworkPasswd (leave empty to use default plc_networkpwd): SomePassword
 +Enable plc [0-1]: 1
 +Automatically add to br-lan bridge [0-1]: 1
 +root@covrp2500_1:/# /etc/init.d/plc start
 +root@covrp2500_1:/# brctl show br-lan
 +bridge name     bridge id               STP enabled     interfaces
 +br-lan          7fff.xxxxxxxxxxxx       no              eth0.3
 +                                                        eth0.1
 +root@covrp2500_1:/# plctool -i br-lan -m
 +br-lan 00:B0:52:00:00:01 Fetch Network Information
 +br-lan XX:XX:XX:XX:XX:XX Found 1 Network(s)
 +
 +source address = XX:XX:XX:XX:XX:XX
 +
 + network->NID = XX:XX:XX:XX:XX:XX:XX
 + network->SNID = 14
 + network->TEI = 1
 + network->ROLE = 0x00 (STA)
 + network->CCO_DA = XX:XX:XX:XX:XX:XX
 + network->CCO_TEI = 3
 + network->STATIONS = 1
 +
 + station->MAC = XX:XX:XX:XX:XX:XX
 + station->TEI = 3
 + station->BDA = 28:3B:82:2A:AB:7A
 + station->AvgPHYDR_TX = 154 mbps Alternate
 + station->AvgPHYDR_RX = 233 mbps Alternate
 +
 +
 +</code>
 +</hidden>
 +
 +6. Start plc service with ''/etc/init.d/plc start''
 +
 +=== /etc/init.d/plc ===
 +<hidden /etc/init.d/plc>
 +<code - /etc/init.d/plc>
 +#!/bin/sh /etc/rc.common
 +
 +USE_PROCD=1
 +
 +START=60
 +STOP=80
 +
 +EXTRA_COMMANDS="setup"
 +EXTRA_HELP=" setup PLC configuration setup helper"
 +
 +mtd_get_key() {
 + local mtdname="$1"
 + local key="$2"
 + local part
 + local value_dirty
 +
 + part=$(find_mtd_part "$mtdname")
 + if [ -z "$part" ]; then
 + echo "mtd_get_key: partition $mtdname not found!" >&2
 + return
 + fi
 +
 + value_dirty=$(strings "$part" | sed -n 's/^'"$key"'=//p')
 +
 + echo "$value_dirty"
 +}
 +
 +board=$(board_name)
 +
 +start_service() {
 + if [ ! -f /etc/config/plc ] || [ "$(uci show plc 2>/dev/null)" = "" ]; then
 + touch /etc/config/plc
 + uci set plc.config=config
 + uci commit plc
 + fi
 +
 + local NvmPath
 + local PibPath
 + local Mac
 + local device
 + local NmkSelected
 + local NetworkPasswd
 + local Nmk
 + local Dek
 + local Dak
 + local AdapterName
 + local Enabled
 + local Network
 + local pibpath_tmp
 +
 + config_load plc
 + config_get NvmPath config NvmPath
 + config_get PibPath config PibPath
 + config_get Mac config Mac
 + config_get NmkSelected config NmkSelected
 + config_get NetworkPasswd config NetworkPasswd
 + config_get Nmk config Nmk
 + config_get Dek config Dek
 + config_get Dak config Dak
 + config_get AdapterName config AdapterName
 + config_get Enabled config Enabled
 + config_get Network config Network
 + config_load network
 + config_get device plc device
 +
 + if [ -z "$NvmPath" ]; then
 + echo "plc.config.NvmPath not defined" >&2
 + exit 1
 + fi
 + if [ ! -f "$NvmPath" ]; then
 + echo "plc.config.NvmPath does not exist" >&2
 + exit 1
 + fi
 +
 + if [ -z "$PibPath" ]; then
 + echo "plc.config.PibPath not defined" >&2
 + exit 1
 + fi
 + if [ ! -f "$PibPath" ]; then
 + echo "plc.config.PibPath file does not exist" >&2
 + exit 1
 + fi
 + if [ -z "$Mac" ]; then
 + Mac="$(mtd_get_mac_ascii art protest_plc_mac)"
 + fi
 + if [ -z "$device" ]; then
 + echo "network.plc.device not defined" >&2
 + exit 1
 + fi
 +
 + # Create modded pib
 + pibpath_tmp="${PibPath}.tmp"
 + rm -f "$pibpath_tmp"
 + cp "$PibPath" "$pibpath_tmp"
 +
 + # Patch MAC into pib
 + if [ ! -z "$Mac" ]; then
 + modpib -M "$Mac" "$pibpath_tmp"
 + fi
 +
 + # Patch NMK
 + if [ 'true' != "$NmkSelected" ]; then
 + if [ -z "$NetworkPwd" ]; then
 + NetworkPwd="$(nmk_get_key art plc_networkpwd)"
 + fi
 + Nmk="$(hpavkey -M "$NetworkPwd")"
 + fi
 + if [ ! -z "$Nmk" ]; then
 + modpib -N "$Nmk" "$pibpath_tmp"
 + fi
 +
 + # Patch DAK
 + if [ -z "$Dek" ]; then
 + if [ -z "$Dak" ]; then
 + Dek="$(mtd_get_key art plc_dek)"
 +
 + if [ ! -z "$Dek" ]; then
 + Dak="$(hpavkey -D "$Dek")"
 + fi
 + fi
 + else
 + Dak="$(hpavkey -D "$Dek")"
 + fi
 + if [ ! -z "$Dak" ]; then
 + modpib -D "$Dak" "$pibpath_tmp"
 + fi
 +
 + # Patch USR
 + if [ -z "$AdapterName" ]; then
 + AdapterName="$(uci get system.@system[0].hostname)"
 + fi
 + modpib -U "$AdapterName" -S "D-Link COVR-P2500" -T "$NetworkPwd" "$pibpath_tmp"
 +
 + if [ -z "$Enabled" ]; then
 + echo "plc.config.Enabled not defined" >&2
 + exit 1
 + fi
 + if [ "$Enabled" -ne 1 ]; then
 + echo "plc.config.Enabled is not 1" >&2
 + exit 1
 + fi
 +
 + cd /tmp
 +
 + for i in $(seq 1 30); do
 + if [ -d /sys/class/net/$device ]; then
 + break
 + fi
 + sleep 1s
 + done
 +
 + procd_open_instance
 + if [ -z "$Network" ]; then
 + procd_set_param command /usr/bin/plchost -i "$device" -N "$NvmPath" -P "$pibpath_tmp"
 + else
 + [ ! -e /dev/fd ] && ln -s /proc/self/fd /dev/fd
 + procd_set_param command sh -c '/usr/bin/plchost -i '"$device"' -N '"$NvmPath"' -P '"$pibpath_tmp"' 2> >(\
 + while read line; do \
 + echo "$line" >&2; \
 + if [ $(expr match "$line" ".*'$device'.*is running.*") -gt 0 ]; then \
 + echo "Adding '$device' to br-'$Network'"; \
 + brctl addif "br-'$Network'" "'$device'"; \
 + fi; \
 + done)'
 + fi
 + procd_set_param file /etc/config/plc
 + procd_set_param stdout 1
 + procd_set_param stderr 1
 + procd_set_param netdev "$device"
 + procd_close_instance
 +}
 +
 +service_triggers() {
 + procd_add_reload_trigger "plc" "network"
 +}
 +
 +reload_service() {
 + stop
 + start
 +}
 +
 +stop_service() {
 + local device
 + local Network
 +
 + config_load plc
 + config_get Network config Network
 + config_load network
 + config_get device plc device
 +
 + if [ ! -z "$Network" ]; then
 + brctl delif "br-$Network" "$device"
 + fi
 +}
 +
 +service_stopped() {
 + local PibPath
 + local Mac
 + local device
 +
 + config_load plc
 + config_get PibPath config PibPath
 + config_get Mac config Mac
 + config_load network
 + config_get device plc device
 +
 + if [ ! -z "$PibPath" ] && [ -f "${PibPath}.tmp" ]; then
 + rm "${PibPath}.tmp"
 + fi
 +
 + if [ -z "$Mac" ]; then
 + Mac="$(mtd_get_mac_ascii art protest_plc_mac)"
 + fi
 +
 + plctool -i "$device" -R "$Mac"
 +}
 +
 +setup() {
 + if [ ! -f /etc/config/plc ] || [ "$(uci show plc 2>/dev/null)" = "" ]; then
 + touch /etc/config/plc
 + uci set plc.config=config
 + uci commit plc
 + fi
 +
 + echo -n "Download original firmware and extract files from /lib/plc to /etc/plc [y|n] "
 + read i
 + if [ "$i" = "y" ] || [ "$i" = "Y" ]; then
 + if [ -z "$(which unsquashfs)" ]; then
 + echo "unsquashfs missing. Install squashfs-tools-unsquashfs package" >&2
 + exit 1
 + fi
 +
 + cd /tmp
 + FW="COVRP2500A1_FW101b08_decrypted.bin"
 + rm -f "$FW"
 + wget -O "$FW" "http://pmdap.dlink.com.tw/PMD/GetAgileFile?itemNumber=FIR1800225&fileName=COVRP2500A1_FW101b08_decrypted.bin&fileSize=1.5990457E7;1.5992229E7;65141.0;"
 + if [ ! -f "$FW" ]; then
 + echo "Download failed. Check network" >&2
 + exit 1
 + fi
 + unsquashfs -lls "$FW" /lib/plc | grep -q '\.pib$'
 + if [ $? -ne 0 ]; then
 + echo "$FW does not contain any /lib/plc/*.pib files" >&2
 + exit 1
 + fi
 +
 + unsquashfs "$FW" /lib/plc
 + mkdir -p /etc/plc/
 + cp squashfs-root/lib/plc/* /etc/plc/
 + rm -rf squashfs-root
 + rm "$FW"
 + fi
 +
 + options=$(echo /etc/plc/*.pib)
 + if [ "$options" = "/etc/plc/*.pib" ]; then
 + echo "No files matching /etc/plc/*.pib" >&2
 + exit 1
 + fi
 + count=$(echo $options | wc -w)
 + i=""
 + while [ -z "$i" ] || [ $i -lt 1 ] || [ $i -gt $count ]; do
 + i=1
 + for f in $options; do
 + echo "${i}) $f"
 + i=$((i+1))
 + done
 + echo -n "Select PibPath [1-${count}]: "
 + read i
 + done
 + pibpath=$(echo $options | awk '{print$'$i'}')
 + uci set plc.config.PibPath=$pibpath
 +
 + options=$(echo /etc/plc/*.nvm)
 + if [ "$options" = "/etc/plc/*.nvm" ]; then
 + echo "No files matching /etc/plc/*.nvm" >&2
 + exit 1
 + fi
 + count=$(echo $options | wc -w)
 + if [ $count -gt 1 ]; then
 + i=""
 + while [ -z "$i" ] || [ $i -lt 1 ] || [ $i -gt $count ]; do
 + i=1
 + for f in $options; do
 + echo "${i}) $f"
 + i=$((i+1))
 + done
 + echo -n "Select NvmPath [1-${count}]: "
 + read i
 + done
 + nvmpath=$(echo $options | awk '{print$'$i'}')
 + else
 + nvmpath=$options
 + fi
 + uci set plc.config.NvmPath=$nvmpath
 +
 + echo -n "NetworkPasswd (leave empty to use default plc_networkpwd): "
 + read networkpwd
 + if [ -z "$networkpwd" ]; then
 + networkpwd="$(mtd_get_key art plc_networkpwd)"
 + fi
 + uci set plc.config.NetworkPasswd="$networkpwd"
 + uci set plc.config.Nmk="$(hpavkey -M "$networkpwd")"
 + uci set plc.config.NmkSelected='true'
 +
 + uci set plc.config.Mac="$(mtd_get_key art protest_plc_mac)"
 +
 + dek="$(mtd_get_key art plc_dek)"
 + uci set plc.config.Dek="$dek"
 + uci set plc.config.Dak="$(hpavkey -D "$dek")"
 +
 + uci set plc.config.AdapterName="$(uci get system.@system[0].hostname)"
 +
 + echo -n "Enable plc [0-1]: "
 + read i
 + if [ ! -z "$i" ] && [ $i -eq 1 ]; then
 + uci set plc.config.Enabled=1
 + enable
 + else
 + uci set plc.config.Enabled=0
 + disable
 + fi
 +
 + echo -n "Automatically add to br-lan bridge [0-1]: "
 + read i
 + if [ ! -z "$i" ] && [ $i -eq 1 ]; then
 + uci set plc.config.Network="lan"
 + else
 + uci set plc.config.Network=""
 + fi
 +
 + # Commit changes
 + if [ ! -z "$(uci changes plc)" ]; then
 + uci commit plc
 + fi
 +}
 +</code>
 +</hidden>
  
 ===== Hardware ===== ===== Hardware =====
Line 1180: Line 2056:
 ==== OpenWrt bootlog ==== ==== OpenWrt bootlog ====
 <WRAP bootlog> <WRAP bootlog>
-<nowiki>COPY HERE THE BOOTLOG ONCE OPENWRT IS INSTALLED AND RUNNING</nowiki>+<nowiki>[    0.303493] printk: console [ttyS0] enabled 
 +[    0.303493] printk: console [ttyS0] enabled 
 +[    0.312560] printk: bootconsole [early0] disabled 
 +[    0.312560] printk: bootconsole [early0] disabled 
 +[    0.334632] spi-nor spi0.0: mx25l12805d (16384 Kbytes) 
 +[    0.340062] 6 fixed-partitions partitions found on MTD device spi0.0 
 +[    0.346669] Creating 6 MTD partitions on "spi0.0": 
 +[    0.351620] 0x000000000000-0x000000040000 : "u-boot" 
 +[    0.360501] 0x000000040000-0x000000050000 : "u-boot-env" 
 +[    0.367057] 0x000000050000-0x000000e80000 : "fwconcat0" 
 +[    0.374962] 0x000000e80000-0x000000e90000 : "loader" 
 +[    0.381288] 0x000000e90000-0x000000ff0000 : "fwconcat1" 
 +[    0.389177] 0x000000ff0000-0x000001000000 : "art" 
 +[    0.395142] OF: Bad cell count for /ahb/spi@1f000000/flash@0/partitions 
 +[    0.405099] Concatenating MTD devices: 
 +[    0.409045] (0): "fwconcat0" 
 +[    0.412020] (1): "fwconcat1" 
 +[    0.414993] into device "virtual_flash" 
 +[    0.419003] 1 fixed-partitions partitions found on MTD device virtual_flash 
 +[    0.426461] Creating 1 MTD partitions on "virtual_flash": 
 +[    0.432092] 0x000000000000-0x000000f90000 : "firmware" 
 +[    0.445748] 2 uimage-fw partitions found on MTD device firmware 
 +[    0.451887] Creating 2 MTD partitions on "firmware": 
 +[    0.457067] 0x000000000000-0x000000240000 : "kernel" 
 +[    0.463957] 0x000000240000-0x000000f90000 : "rootfs" 
 +[    0.470002] mtd: setting mtd8 (rootfs) as root device 
 +[    0.476204] 1 squashfs-split partitions found on MTD device rootfs 
 +[    0.482617] 0x0000006a0000-0x000000f90000 : "rootfs_data" 
 +[    1.219382] switch0: Atheros AR8337 rev. 2 switch registered on mdio.0 
 +[    1.876904] ag71xx 19000000.eth: connected to PHY at mdio.0:00 [uid=004dd036, driver=Atheros AR8216/AR8236/AR8316] 
 +[    1.888202] eth0: Atheros AG71xx at 0xb9000000, irq 4, mode: sgmii 
 +[    1.894903] i2c_dev: i2c /dev entries driver 
 +[    1.901982] NET: Registered PF_INET6 protocol family 
 +[    1.917053] Segment Routing with IPv6 
 +[    1.920915] In-situ OAM (IOAM) with IPv6 
 +[    1.925073] NET: Registered PF_PACKET protocol family 
 +[    1.930482] 8021q: 802.1Q VLAN Support v1.8 
 +[    1.936161] PCI host bridge to bus 0000:00 
 +[    1.940415] pci_bus 0000:00: root bus resource [mem 0x12000000-0x13ffffff] 
 +[    1.947570] pci_bus 0000:00: root bus resource [io  0x0000] 
 +[    1.953329] pci_bus 0000:00: No busn resource found for root bus, will use [bus 00-ff] 
 +[    1.961563] pci 0000:00:00.0: [168c:0056] type 00 class 0x028000 
 +[    1.967819] pci 0000:00:00.0: reg 0x10: [mem 0x00000000-0x001fffff 64bit] 
 +[    1.974954] pci 0000:00:00.0: PME# supported from D0 D3hot 
 +[    1.981843] pci_bus 0000:00: busn_res: [bus 00-ff] end is updated to 00 
 +[    1.988756] pci 0000:00:00.0: BAR 0: assigned [mem 0x12000000-0x121fffff 64bit] 
 +[    2.006325] VFS: Mounted root (squashfs filesystem) readonly on device 31:8. 
 +[    2.020267] Freeing unused kernel image (initmem) memory: 1232K 
 +[    2.026419] This architecture does not have kernel memory protection. 
 +[    2.033075] Run /sbin/init as init process 
 +[    2.603084] init: Console is alive 
 +[    2.607162] init: - watchdog - 
 +[    3.919036] kmodloader: loading kernel modules from /etc/modules-boot.d/
 +[    4.001001] usbcore: registered new interface driver usbfs 
 +[    4.006839] usbcore: registered new interface driver hub 
 +[    4.012424] usbcore: registered new device driver usb 
 +[    4.025010] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver 
 +[    4.035217] fsl-ehci: Freescale EHCI Host controller driver 
 +[    4.043406] ehci-platform: EHCI generic platform driver 
 +[    4.051769] kmodloader: done loading kernel modules from /etc/modules-boot.d/
 +[    4.069842] init: - preinit - 
 +[    5.212136] random: jshn: uninitialized urandom read (4 bytes read) 
 +[    5.439182] random: jshn: uninitialized urandom read (4 bytes read) 
 +[    5.703576] random: jshn: uninitialized urandom read (4 bytes read) 
 +[    7.006302] Atheros AR8216/AR8236/AR8316 mdio.0:00: Port 3 is up 
 +[    7.012693] Atheros AR8216/AR8236/AR8316 mdio.0:00: Port 4 is up 
 +[    7.032909] eth0: link up (1000Mbps/Full duplex) 
 +[    7.047096] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready 
 +[    7.053976] IPv6: ADDRCONF(NETDEV_CHANGE): eth0.1: link becomes ready 
 +[    7.065559] random: procd: uninitialized urandom read (4 bytes read) 
 +Press the [f] key and hit [enter] to enter failsafe mode 
 +Press the [1], [2], [3] or [4] key and hit [enter] to select the debug level 
 +[    9.337885] jffs2: notice: (415) jffs2_build_xattr_subsystem: complete building xattr subsystem, 23 of xdatum (0 unchecked, 14 orphan) and 27 of xref (2 dead, 14 orphan) found. 
 +[    9.355914] mount_root: switching to jffs2 overlay 
 +[    9.364614] overlayfs: upper fs does not support tmpfile. 
 +[    9.377347] urandom-seed: Seeding with /etc/urandom.seed 
 +[    9.458586] eth0: link down 
 +[    9.481184] procd: - early - 
 +[    9.484476] procd: - watchdog - 
 +[   10.211493] procd: - watchdog - 
 +[   10.215345] procd: - ubus - 
 +[   10.297431] random: ubusd: uninitialized urandom read (4 bytes read) 
 +[   10.306771] random: ubusd: uninitialized urandom read (4 bytes read) 
 +[   10.313849] random: ubusd: uninitialized urandom read (4 bytes read) 
 +[   10.327600] procd: - init - 
 +Please press Enter to activate this console. 
 +[   11.339617] kmodloader: loading kernel modules from /etc/modules.d/
 +[   11.899475] Loading modules backported from Linux version v6.5-0-g2dde18cd1d8f 
 +[   11.907007] Backport generated by backports.git v5.15.92-1-56-g5fb2ccb6b9e8 
 +[   12.377192] PPP generic driver version 2.4.2 
 +[   12.396387] NET: Registered PF_PPPOX protocol family 
 +[   12.458915] ath10k 6.4 driver, optimized for CT firmware, probing pci device: 0x56. 
 +[   12.486248] ath10k_pci 0000:00:00.0: enabling device (0000 -> 0002) 
 +[   12.493048] ath10k_pci 0000:00:00.0: pci irq legacy oper_irq_mode 1 irq_mode 0 reset_mode 0 
 +[   13.285655] urngd: v1.0.2 started. 
 +[   15.036257] random: crng init done 
 +[   15.039787] random: 27 urandom warning(s) missed due to ratelimiting 
 +[   17.248660] ath10k_pci 0000:00:00.0: qca9888 hw2.0 target 0x01000000 chip_id 0x00000000 sub 0000:0000 
 +[   17.258248] ath10k_pci 0000:00:00.0: kconfig debug 0 debugfs 1 tracing 0 dfs 1 testmode 0 
 +[   17.277436] ath10k_pci 0000:00:00.0: firmware ver 10.4b-ct-9888-fW-13-5ae337bb1 api 5 features mfp,peer-flow-ctrl,txstatus-noack,wmi-10.x-CT,ratemask-CT,regdump-CT,txrate-CT,flush-all-CT,pingpong-CT,ch-regs-CT,nop-CT,set-special-CT,tx-rc-CT,cust-stats-CT,txrate2-CT,beacon-cb-CT,wmi-block-ack-CT,wmi-bcn-rc-CT crc32 59e741e7 
 +[   17.628785] ath10k_pci 0000:00:00.0: board_file api 2 bmi_id 0:18 crc32 ae4cbea5 
 +[   19.405350] ath10k_pci 0000:00:00.0: 10.4 wmi init: vdevs: 16  peers: 48  tid: 96 
 +[   19.413113] ath10k_pci 0000:00:00.0: msdu-desc: 2500  skid: 32 
 +[   19.443483] ath10k_pci 0000:00:00.0: wmi print 'P 48/48 V 16 K 144 PH 176 T 186  msdu-desc: 2500  sw-crypt: 0 ct-sta: 0' 
 +[   19.454869] ath10k_pci 0000:00:00.0: wmi print 'free: 114572 iram: 12644 sram: 29508' 
 +[   19.589353] ath10k_pci 0000:00:00.0: htt-ver 2.2 wmi-op 6 htt-op 4 cal pre-cal-nvmem max-sta 32 raw 0 hwcrypto 1 
 +[   19.889487] ieee80211 phy1: Atheros AR9561 Rev:0 mem=0xb8100000, irq=2 
 +[   19.920937] kmodloader: done loading kernel modules from /etc/modules.d/
 +[   38.747378] eth0: link up (1000Mbps/Full duplex) 
 +[   38.752195] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready 
 +[   38.775967] br-lan: port 1(eth0.1) entered blocking state 
 +[   38.781564] br-lan: port 1(eth0.1) entered disabled state 
 +[   38.787465] device eth0.1 entered promiscuous mode 
 +[   38.792423] device eth0 entered promiscuous mode 
 +[   38.821547] br-lan: port 1(eth0.1) entered blocking state 
 +[   38.827187] br-lan: port 1(eth0.1) entered forwarding state 
 +[   39.807860] IPv6: ADDRCONF(NETDEV_CHANGE): br-lan: link becomes ready</nowiki>
 </WRAP>\\ </WRAP>\\
  
  • Last modified: 2024/08/29 18:27
  • by jokujossai