; *************************************************************************** ; copyright : (C) 2025 by Martin Preuss ; email : martin@libchipcard.de ; ; *************************************************************************** ; * This file is part of the project "AqHome". * ; * Please see toplevel file COPYING of that project for license details. * ; *************************************************************************** ; *************************************************************************** ; defines ; --------------------------------------------------------------------------- ; network interfaces .equ NETDEV0_IFACENUM = 1 .equ NETDEV1_IFACENUM = 2 ; *************************************************************************** ; data .dseg appRouterDataBegin: appRouterRangeBegin: .byte 1 appRouterRangeEnd: .byte 1 appRouterDataEnd: ; *************************************************************************** ; code .cseg ; --------------------------------------------------------------------------- ; @routine AppRouter_Init @global AppRouter_Init: ldi xh, HIGH(appRouterDataBegin) ldi xl, LOW(appRouterDataBegin) clr r16 ldi r17, (appRouterDataEnd-appRouterDataBegin) rcall Utils_FillSram ldi r16, 0xe0 ; default range from 0xe0-0xef (will be changed later) sts netInterfaceData+NET_IFACE_OFFS_ADDRESS, r16 ; use first address for router itself sts netInterfaceData2+NET_IFACE_OFFS_ADDRESS, r16 ; use same address for both interfaces to save on addresses inc r16 sts appRouterRangeBegin, r16 ; range from router+1 ldi r16, 0xef sts appRouterRangeEnd, r16 ; set interface number for NETDEV0 ldi r16, NETDEV0_IFACENUM sts netInterfaceData+NET_IFACE_OFFS_IFACENUM, r16 ; set interface number for NETDEV1 ldi r16, NETDEV1_IFACENUM sts netInterfaceData2+NET_IFACE_OFFS_IFACENUM, r16 ret ; @end ; --------------------------------------------------------------------------- ; @routine AppRouter_EveryDay @global ; ; @clobbers R16, R17, X AppRouter_EveryDay: ldi yl, LOW(netInterfaceData) ldi yh, HIGH(netInterfaceData) bigcall NET_Interface_ResetStats ; (R16, R17, X) ldi yl, LOW(netInterfaceData2) ldi yh, HIGH(netInterfaceData2) bigcall NET_Interface_ResetStats ; (R16, R17, X) ret ; @end ; --------------------------------------------------------------------------- ; @routine AppRouter_Run @global ; ; Read messages from either interface and forward to the other one. AppRouter_Run: rjmp appRouterCheckRecvdMsg ; @end ; --------------------------------------------------------------------------- ; @routine AppRouter_HandleMsg @global ; ; @param X pointer to received message AppRouter_HandleMsg: adiw xh:xl, NETMSG_OFFS_CMD ; maybe move ping/reboot handling to all/main.asm? ld r16, X sbiw xh:xl, NETMSG_OFFS_CMD cpi r16, NETMSG_CMD_REBOOT_REQUEST breq AppRouter_HandleMsg_handleRebootMsg cpi r16, NETMSG_CMD_PING breq AppRouter_HandleMsg_handlePingMsg rjmp AppRouter_HandleMsg_clcRet AppRouter_HandleMsg_handleRebootMsg: push xl push xh rcall appRouterHandleRebootRequest pop xh pop xl ret AppRouter_HandleMsg_handlePingMsg: push xl push xh rcall appRouterHandlePingRequest pop xh pop xl ret AppRouter_HandleMsg_clcRet: clc ret ; @end ; --------------------------------------------------------------------------- ; @routine appRouterHandleRebootRequest ; ; @param X pointer to received message appRouterHandleRebootRequest: ld r16, X ; dest addr cpi r16, 0xff ; don't reboot for broadcast address breq appRouterHandleRebootRequest_end rcall NETMSG_RebootRequestRead brcc appRouterHandleRebootRequest_end ; reboot cli bigjmp BOOTLOADER_ADDR appRouterHandleRebootRequest_end: ret ; @end appRouterHandlePingRequest: adiw xh:xl, NETMSG_OFFS_SRCADDR ld r17, X push r17 bigcall NET_Buffer_Alloc ; (R16, R17, X) pop r17 brcc appRouterHandlePingRequest_end ; jmp on error push r16 ; buffer num mov r16, r17 ; DEST addr adiw xh:xl, 1 ldi yl, LOW(netInterfaceData) ldi yh, HIGH(netInterfaceData) bigcall NETMSG_Pong_Write ; (R16, R17, R18, R19, R20, X) sbiw xh:xl, 1 pop r16 ; buffer num bigcall NET_Interface_AddOrReleaseOutMsg ; (R16, R17, R18, X) appRouterHandlePingRequest_end: ret ; --------------------------------------------------------------------------- ; @routine appRouterCheckRecvdMsg ; ; Read messages from either interface and forward to the other one. appRouterCheckRecvdMsg: rcall NET_PeekNextIncomingMsgNum ; check read queue (bufNum->r16) brcc appRouterCheckRecvdMsg_end ; no msg, jmp rcall NET_Buffer_Locate ; (R17) ; let system handle incoming messages push r16 adiw xh:xl, 1 rcall appRouterLetSysHandleMsg sbiw xh:xl, 1 pop r16 ; forward to other interface ld r17, X andi r17, (1<