#
# Copyright (C) 2024 IOPSYS Software Solutions AB
#

include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/kernel.mk

PKG_NAME:=ebtables-extensions
PKG_VERSION:=2.0.5
PKG_LICENSE:=GPL-2.0

LOCAL_DEV:=0
ifneq ($(LOCAL_DEV),1)
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://dev.iopsys.eu/network/ebtables-extensions.git
PKG_SOURCE_VERSION:=7357622d806833d93d317164dc6673fbf5fd1629
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
PKG_MIRROR_HASH:=skip
endif

include $(INCLUDE_DIR)/package.mk

define KernelPackage/ebt-vlantranslation
  SUBMENU:=Other modules
  TITLE:=Kernel module for ebtables VLAN translation
  FILES:=$(PKG_BUILD_DIR)/src/ebt_vlantranslation.ko
  DEPENDS+=+kmod-ebtables
  AUTOLOAD:=$(call AutoLoad,30,ebt_vlantranslation)
  KCONFIG:=
endef

define KernelPackage/ebt-dscp2pbit
  SUBMENU:=Other modules
  TITLE:=Kernel module for DSCP-to-Pbit mapping
  DEPENDS+=+kmod-ebtables
  FILES:=$(PKG_BUILD_DIR)/src/ebt_dscp2pbit.ko
  AUTOLOAD:=$(call AutoLoad,30,ebt_dscp2pbit)
  KCONFIG:=
endef

define KernelPackage/ebt-dhcp
  SUBMENU:=Other modules
  TITLE:=Kernel module for ebtables DHCP snooping
  FILES:=$(PKG_BUILD_DIR)/src/ebt_dhcp.ko
  DEPENDS+=+kmod-ebtables
  AUTOLOAD:=$(call AutoLoad,30,ebt_dhcp)
  KCONFIG:=
endef

define KernelPackage/ebt-dhcpv6
  SUBMENU:=Other modules
  TITLE:=Kernel module for ebtables DHCPv6 snooping
  FILES:=$(PKG_BUILD_DIR)/src/ebt_dhcpv6.ko
  DEPENDS+=+kmod-ebtables
  AUTOLOAD:=$(call AutoLoad,30,ebt_dhcpv6)
  KCONFIG:=
endef

define KernelPackage/ebt-ra
  SUBMENU:=Other modules
  TITLE:=Kernel module for ebtables NDP/RA snooping
  FILES:=$(PKG_BUILD_DIR)/src/ebt_ra.ko
  DEPENDS+=+kmod-ebtables
  AUTOLOAD:=$(call AutoLoad,30,ebt_ra)
  KCONFIG:=
endef

define KernelPackage/ebt-dns
  SUBMENU:=Other modules
  TITLE:=Kernel module for ebtables DNS manipulation
  FILES:=$(PKG_BUILD_DIR)/src/ebt_dns.ko
  DEPENDS+=+kmod-ebtables
  AUTOLOAD:=$(call AutoLoad,30,ebt_dns)
  KCONFIG:=
endef

define KernelPackage/ebt-pppoe_disc
  SUBMENU:=Other modules
  TITLE:=Kernel module for ebtables PPPoE manipulation
  FILES:=$(PKG_BUILD_DIR)/src/ebt_pppoe_disc.ko
  DEPENDS+=+kmod-ebtables
  AUTOLOAD:=$(call AutoLoad,30,ebt_pppoe_disc)
  KCONFIG:=
endef

define KernelPackage/ebt-l2pt
  SUBMENU:=Other modules
  TITLE:=Kernel module for ebtables L2CP tunneling
  FILES:=$(PKG_BUILD_DIR)/src/ebt_l2pt.ko
  DEPENDS+=@TARGET_airoha +kmod-ebtables
  AUTOLOAD:=$(call AutoLoad,30,ebt_l2pt)
  KCONFIG:=
endef

define KernelPackage/ebt-xtarp
  SUBMENU:=Other modules
  TITLE:=Kernel module for ebtables extended ARP matching
  FILES:=$(PKG_BUILD_DIR)/src/ebt_xtarp.ko
  DEPENDS+=+kmod-ebtables
  AUTOLOAD:=$(call AutoLoad,30,ebt_xtarp)
  KCONFIG:=
endef

define KernelPackage/ebt-xtip
  SUBMENU:=Other modules
  TITLE:=Kernel module for ebtables extended IPv4 matching
  FILES:=$(PKG_BUILD_DIR)/src/ebt_xtip.ko
  DEPENDS+=+kmod-ebtables
  AUTOLOAD:=$(call AutoLoad,30,ebt_xtip)
  KCONFIG:=
endef

define KernelPackage/ebt-xtip6
  SUBMENU:=Other modules
  TITLE:=Kernel module for ebtables extended IPv6 matching
  FILES:=$(PKG_BUILD_DIR)/src/ebt_xtip6.ko
  DEPENDS+=+kmod-ebtables
  AUTOLOAD:=$(call AutoLoad,30,ebt_xtip6)
  KCONFIG:=
endef

define KernelPackage/ebt-igmpsnooping
  SUBMENU:=Other modules
  TITLE:=Kernel module for ebtables IGMP snooping
  FILES:=$(PKG_BUILD_DIR)/src/ebt_igmpsnooping.ko
  DEPENDS+=+kmod-ebtables
  # AUTOLOAD:=$(call AutoLoad,30,ebt_igmpsnooping) - Will be loaded on demand
  KCONFIG:=
endef

define KernelPackage/ebt-mldsnooping
  SUBMENU:=Other modules
  TITLE:=Kernel module for ebtables MLD snooping
  FILES:=$(PKG_BUILD_DIR)/src/ebt_mldsnooping.ko
  DEPENDS+=+kmod-ebtables
  # AUTOLOAD:=$(call AutoLoad,30,ebt_mldsnooping) - Will be loaded on demand
  KCONFIG:=
endef

define KernelPackage/ebt-dhcp/description
	Kernel module to enable DHCP snooping for ebtables
endef

define KernelPackage/ebt-dhcpv6/description
	Kernel module to enable DHCPv6 snooping for ebtables
endef

define KernelPackage/ebt-ra/description
	Kernel module to enable NDP/RA snooping for ebtables
endef

define KernelPackage/ebt-dns/description
	Kernel module to enable DNS manipulation for ebtables
endef

define KernelPackage/ebt-pppoe_disc/description
	Kernel module to enable PPPoE manipulation for ebtables
endef

define KernelPackage/ebt-l2pt/description
	Kernel module to enable L2CP tunneling for ebtables
endef

define KernelPackage/ebt-xtarp/description
	Kernel module to enable extended ARP matching for ebtables
endef

define KernelPackage/ebt-xtip/description
	Kernel module to enable extended IPv4 matching for ebtables
endef

define KernelPackage/ebt-xtip6/description
	Kernel module to enable extended IPv6 matching for ebtables
endef

define KernelPackage/ebt-vlantranslation/description
	Kernel module to enable VLAN translation for ebtables
endef

define KernelPackage/ebt-dscp2pbit/description
	Kernel module to enable DSCP-to-Pbit mapping for ebtables
endef

define KernelPackage/ebt-igmpsnooping/description
	Kernel module to enable IGMP snooping for ebtables
endef

define KernelPackage/ebt-mldsnooping/description
	Kernel module to enable MLD snooping for ebtables
endef

-include ../../broadcom/bcmkernel/bcm-kernel-toolchain.mk

define Build/Prepare

ifeq ($(LOCAL_DEV),1)
	$(CP) -rf ./ebtables-extensions/* $(PKG_BUILD_DIR)/
else
	$(Build/Prepare/Default)
endif
	$(CP) $(PKG_BUILD_DIR)/src/ebt_vlantranslation.h $(LINUX_DIR)/include/uapi/linux/netfilter_bridge/
	$(CP) $(PKG_BUILD_DIR)/src/ebt_dscp2pbit.h $(LINUX_DIR)/include/uapi/linux/netfilter_bridge/
	$(CP) $(PKG_BUILD_DIR)/src/ebt_dhcp.h $(LINUX_DIR)/include/uapi/linux/netfilter_bridge/
	$(CP) $(PKG_BUILD_DIR)/src/ebt_dhcpv6.h $(LINUX_DIR)/include/uapi/linux/netfilter_bridge/
	$(CP) $(PKG_BUILD_DIR)/src/ebt_ra.h $(LINUX_DIR)/include/uapi/linux/netfilter_bridge/
	$(CP) $(PKG_BUILD_DIR)/src/ebt_dns.h $(LINUX_DIR)/include/uapi/linux/netfilter_bridge/
	$(CP) $(PKG_BUILD_DIR)/src/ebt_pppoe_disc.h $(LINUX_DIR)/include/uapi/linux/netfilter_bridge/
ifeq ($(CONFIG_TARGET_airoha),y)
	$(CP) $(PKG_BUILD_DIR)/src/ebt_l2pt.h $(LINUX_DIR)/include/uapi/linux/netfilter_bridge/
endif
	$(CP) $(PKG_BUILD_DIR)/src/ebt_xtarp.h $(LINUX_DIR)/include/uapi/linux/netfilter_bridge/
	$(CP) $(PKG_BUILD_DIR)/src/ebt_xtip.h $(LINUX_DIR)/include/uapi/linux/netfilter_bridge/
	$(CP) $(PKG_BUILD_DIR)/src/ebt_xtip6.h $(LINUX_DIR)/include/uapi/linux/netfilter_bridge/
	$(CP) $(PKG_BUILD_DIR)/src/ebt_igmpsnooping.h $(LINUX_DIR)/include/uapi/linux/netfilter_bridge/
	$(CP) $(PKG_BUILD_DIR)/src/ebt_mldsnooping.h $(LINUX_DIR)/include/uapi/linux/netfilter_bridge/
endef

define Build/InstallDev
	$(INSTALL_DIR) $(1)/include/uapi/linux/netfilter_bridge/
	$(CP) $(PKG_BUILD_DIR)/src/ebt_vlantranslation.h $(1)/include/uapi/linux/netfilter_bridge/
	$(CP) $(PKG_BUILD_DIR)/src/ebt_dscp2pbit.h $(1)/include/uapi/linux/netfilter_bridge/
	$(CP) $(PKG_BUILD_DIR)/src/ebt_dhcp.h $(1)/include/uapi/linux/netfilter_bridge/
	$(CP) $(PKG_BUILD_DIR)/src/ebt_dhcpv6.h $(1)/include/uapi/linux/netfilter_bridge/
	$(CP) $(PKG_BUILD_DIR)/src/ebt_ra.h $(1)/include/uapi/linux/netfilter_bridge/
	$(CP) $(PKG_BUILD_DIR)/src/ebt_dns.h $(1)/include/uapi/linux/netfilter_bridge/
	$(CP) $(PKG_BUILD_DIR)/src/ebt_pppoe_disc.h $(1)/include/uapi/linux/netfilter_bridge/
ifeq ($(CONFIG_TARGET_airoha),y)
	$(CP) $(PKG_BUILD_DIR)/src/ebt_l2pt.h $(1)/include/uapi/linux/netfilter_bridge/
endif
	$(CP) $(PKG_BUILD_DIR)/src/ebt_xtarp.h $(1)/include/uapi/linux/netfilter_bridge/
	$(CP) $(PKG_BUILD_DIR)/src/ebt_xtip.h $(1)/include/uapi/linux/netfilter_bridge/
	$(CP) $(PKG_BUILD_DIR)/src/ebt_xtip6.h $(1)/include/uapi/linux/netfilter_bridge/
	$(CP) $(PKG_BUILD_DIR)/src/ebt_igmpsnooping.h $(1)/include/uapi/linux/netfilter_bridge/
	$(CP) $(PKG_BUILD_DIR)/src/ebt_mldsnooping.h $(1)/include/uapi/linux/netfilter_bridge/
endef

ifeq ($(CONFIG_TARGET_airoha),y)
  KERNEL_MAKE_FLAGS += PLATFORM="ECONET"
endif

define Build/Compile
	$(KERNEL_MAKE) M="$(PKG_BUILD_DIR)/src" modules
endef

$(eval $(call KernelPackage,ebt-vlantranslation))
$(eval $(call KernelPackage,ebt-dscp2pbit))
$(eval $(call KernelPackage,ebt-dhcp))
$(eval $(call KernelPackage,ebt-dhcpv6))
$(eval $(call KernelPackage,ebt-ra))
$(eval $(call KernelPackage,ebt-dns))
$(eval $(call KernelPackage,ebt-pppoe_disc))
$(eval $(call KernelPackage,ebt-l2pt))
$(eval $(call KernelPackage,ebt-xtarp))
$(eval $(call KernelPackage,ebt-xtip))
$(eval $(call KernelPackage,ebt-xtip6))
$(eval $(call KernelPackage,ebt-igmpsnooping))
$(eval $(call KernelPackage,ebt-mldsnooping))
