mirror of
https://github.com/kernelkit/infix.git
synced 2026-07-23 01:23:00 +02:00
Compare commits
@@ -1,16 +1,20 @@
|
||||
# To enable this workflow of your Infix fork, set the repoistory or
|
||||
# organisation variable (not secret):
|
||||
#
|
||||
# LATEST_BUILD = true
|
||||
#
|
||||
# https://docs.github.com/en/actions/learn-github-actions/variables#creating-configuration-variables-for-a-repository
|
||||
name: Bob the Builder
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
types:
|
||||
- closed
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
if: ${{github.ref_name == 'main' && github.event_name == 'push'}} || github.event_name == 'workflow_dispatch'
|
||||
if: ${{ vars.LATEST_BUILD == 'true' }}
|
||||
name: Build ${{ matrix.platform }} ${{ matrix.variant }}
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
@@ -81,7 +85,7 @@ jobs:
|
||||
- uses: pyTooling/Actions/releaser@main
|
||||
with:
|
||||
tag: latest
|
||||
rm: true
|
||||
rm: false
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
files: artifact/*
|
||||
- name: Summary
|
||||
|
||||
@@ -1,3 +1,9 @@
|
||||
# To enable this workflow of your Infix fork, set the repoistory or
|
||||
# organisation variable (not secret):
|
||||
#
|
||||
# REGRESSION_TEST = true
|
||||
#
|
||||
# https://docs.github.com/en/actions/learn-github-actions/variables#creating-configuration-variables-for-a-repository
|
||||
name: Reggie Regression
|
||||
|
||||
on:
|
||||
@@ -15,6 +21,7 @@ concurrency:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
if: ${{ vars.REGRESSION_TEST == 'true' }}
|
||||
name: Regression Testing
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
@@ -61,9 +68,11 @@ jobs:
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
path: output/${{ steps.vars.outputs.tgz }}
|
||||
|
||||
- name: Regression Test
|
||||
run: |
|
||||
rc=true
|
||||
make test-qeneth || rc=false
|
||||
cat test/.log/last/result.md >> $GITHUB_STEP_SUMMARY
|
||||
eval $rc
|
||||
run: make test-qeneth
|
||||
|
||||
- name: Publish Test Result
|
||||
# Ensure this runs even if Regression Test fails
|
||||
if: always()
|
||||
run: cat test/.log/last/result-gh.md >> $GITHUB_STEP_SUMMARY
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# To enable automatic sync of your Infix fork every day, or on dispatch,
|
||||
# set the repoistory or organisation variable (not secret):
|
||||
#
|
||||
# SYNC_FORK = 'true'
|
||||
# SYNC_FORK = true
|
||||
#
|
||||
# You also need a GH_SYNC_REPO token allowed to update workflows. For
|
||||
# more information on variables and secrets, see the GitHub docs.
|
||||
|
||||
+1
-1
Submodule 9pm updated: f494f6b052...d80f8cfc7d
@@ -1,3 +1,108 @@
|
||||
menu "Branding"
|
||||
|
||||
config INFIX_VENDOR
|
||||
string "Vendor name"
|
||||
default "KernelKit"
|
||||
help
|
||||
The name of the operating system vendor. This is the name of the
|
||||
organization or company which produces the OS.
|
||||
|
||||
This name is intended to be exposed in "About this system" UIs or
|
||||
software update UIs when needed to distinguish the OS vendor from
|
||||
the OS itself. It is intended to be human readable.
|
||||
|
||||
Used for VENDOR_NAME in /etc/os-release and GNS3 appliance files.
|
||||
|
||||
config INFIX_VENDOR_HOME
|
||||
string "Vendor URL"
|
||||
help
|
||||
The homepage of the OS vendor. The value should be in RFC3986
|
||||
format, and should be "http:" or "https:" URLs. Only one URL shall
|
||||
be listed in the setting.
|
||||
|
||||
Optional, used for VENDOR_HOME in /etc/os-release
|
||||
|
||||
config INFIX_NAME
|
||||
string "Operating system name"
|
||||
default "Infix"
|
||||
help
|
||||
Mandatory. Used for identifying the OS as NAME in /etc/os-release
|
||||
and product_name in GNS3 appliance files.
|
||||
|
||||
config INFIX_ID
|
||||
string "Operating system identifier"
|
||||
default "infix"
|
||||
help
|
||||
A lower-case string (no spaces or other characters outside of 0–9,
|
||||
a–z, '.', '_' and '-') identifying the operating system, excluding
|
||||
any version information and suitable for processing by scripts or
|
||||
usage in generated filenames.
|
||||
|
||||
Mandatory. Used for identifying the OS as ID in /etc/os-release and
|
||||
in the generated image name: ID-ARCH-VERSION.img
|
||||
|
||||
config INFIX_IMAGE_ID
|
||||
string "Operating system image name"
|
||||
default "${INFIX_ID}-${BR2_ARCH}"
|
||||
help
|
||||
A lower-case string (no spaces or other characters outside of 0–9,
|
||||
a–z, ".", "_" and "-"), for naming critical image files, directories
|
||||
and archives containting the operating system.
|
||||
|
||||
Mandatory. When INFIX_RELEASE is set, this string is appended to
|
||||
the IMAGE_ID with a '-' separator.
|
||||
|
||||
config INFIX_TAGLINE
|
||||
string "Operating system tagline"
|
||||
default "Infix — a Network Operating System"
|
||||
help
|
||||
Mandatory. Used for identifying the OS, e.g. as PRETTY_NAME in
|
||||
/etc/os-release and description in the GNS3 appliance.
|
||||
|
||||
This is also show at boot when the system init process starts.
|
||||
|
||||
config INFIX_DESC
|
||||
string "Operating system description"
|
||||
help
|
||||
Optional. Used for long description texts about the OS. E.g.,
|
||||
the GNS3 appliance file description field. Saved in the file
|
||||
/etc/os-release as INFIX_DESC.
|
||||
|
||||
config INFIX_HOME
|
||||
string "Operating system URL"
|
||||
help
|
||||
Used for identifying the OS, e.g. as HOME_URL in /etc/os-release
|
||||
|
||||
config INFIX_DOC
|
||||
string "Operating system docs"
|
||||
help
|
||||
Optional. Main documentation URL, will be shown in /etc/os-release
|
||||
as DOCUMENTATION_URL.
|
||||
|
||||
config INFIX_SUPPORT
|
||||
string "Operating system support"
|
||||
help
|
||||
Main support page for the operating system, if there is any. This
|
||||
is primarily intended for operating systems which vendors provide
|
||||
support for. May be a http:, https:, or mailto: URI.
|
||||
|
||||
Optional. Shown, e.g., as SUPPORT_URL in /etc/os-release or
|
||||
maintainer_email in .gns3a.
|
||||
|
||||
config INFIX_OEM_PATH
|
||||
string "Path to OEM br2-external"
|
||||
help
|
||||
A br2-external using Infix will likely want to version the branded
|
||||
OS using their own GIT tags. Set this variable to point to the base
|
||||
directory (absolute path) and the Infix post-build.sh will call `git
|
||||
describe -C $INFIX_OEM_PATH`.
|
||||
|
||||
Note: for release builds the global variable INFIX_RELEASE overrides
|
||||
the version information derived from `git describe`. However, the
|
||||
GIT version is always saved as the BUILD_ID in /etc/os-releases.
|
||||
|
||||
endmenu
|
||||
|
||||
# For /etc/os-release, uses CondtionArchitechture= from systemd.unit(5)
|
||||
config INFIX_ARCH
|
||||
string
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
#ifndef _ALDER_MPP_H
|
||||
#define _ALDER_MPP_H
|
||||
|
||||
#define CP_SMI_MDIO(X) X( "mpp0", none, 0, 0)
|
||||
#define CP_SMI_MDC(X) X( "mpp1", none, 0, 0)
|
||||
#define CP_XSMI_MDIO(X) X( "mpp2", none, 0, 0)
|
||||
#define CP_XSMI_MDC(X) X( "mpp3", none, 0, 0)
|
||||
/* mpp4: Unused */
|
||||
/* mpp5: Unused */
|
||||
/* mpp6: Unused */
|
||||
#define SFP9_TX_FAULT(X) X( "mpp7", cp0_gpio1, 7, GPIO_ACTIVE_HIGH)
|
||||
#define SFP9_TX_DISABLE(X) X( "mpp8", cp0_gpio1, 8, GPIO_ACTIVE_HIGH)
|
||||
#define SFP9_MOD_ABS(X) X( "mpp9", cp0_gpio1, 9, GPIO_ACTIVE_LOW)
|
||||
#define SW_RESETn(X) X("mpp10", cp0_gpio1, 10, GPIO_ACTIVE_LOW)
|
||||
#define SFP9_RS0(X) X("mpp11", cp0_gpio1, 11, GPIO_ACTIVE_HIGH)
|
||||
/* mpp12: Unused */
|
||||
#define CP_SPI1_MISO(X) X("mpp13", none, 0, 0)
|
||||
#define CP_SPI1_CS0(X) X("mpp14", none, 0, 0)
|
||||
#define CP_SPI1_MOSI(X) X("mpp15", none, 0, 0)
|
||||
#define CP_SPI1_SCK(X) X("mpp16", none, 0, 0)
|
||||
#define WDT_TICKLE(X) X("mpp17", cp0_gpio1, 17, GPIO_ACTIVE_HIGH)
|
||||
/* mpp18: Unused */
|
||||
/* mpp19: Unused */
|
||||
/* mpp20: Unused */
|
||||
/* mpp21: Unused */
|
||||
/* mpp22: Unused */
|
||||
/* mpp23: Unused */
|
||||
#define SFP9_RX_LOS(X) X("mpp24", cp0_gpio1, 24, GPIO_ACTIVE_HIGH)
|
||||
#define ETH9_RESETn(X) X("mpp25", cp0_gpio1, 25, GPIO_ACTIVE_LOW)
|
||||
#define SW_INTn(X) X("mpp26", cp0_gpio1, 26, IRQ_TYPE_LEVEL_LOW)
|
||||
#define SFP9_RS1(X) X("mpp27", cp0_gpio1, 27, GPIO_ACTIVE_HIGH)
|
||||
#define SFP10_TX_FAULT(X) X("mpp28", cp0_gpio1, 28, GPIO_ACTIVE_HIGH)
|
||||
#define CP_UA0_RXD(X) X("mpp29", none, 0, 0)
|
||||
#define CP_UA0_TXD(X) X("mpp30", none, 0, 0)
|
||||
#define SFP10_TX_DISABLE(X) X("mpp31", cp0_gpio1, 31, GPIO_ACTIVE_HIGH)
|
||||
#define SFP10_MOD_ABS(X) X("mpp32", cp0_gpio2, 0, GPIO_ACTIVE_LOW)
|
||||
#define I2C_IRQ(X) X("mpp33", cp0_gpio2, 1, GPIO_ACTIVE_HIGH)
|
||||
#define SFP10_RS0(X) X("mpp34", cp0_gpio2, 2, GPIO_ACTIVE_HIGH)
|
||||
#define CP_I2C1_SDA(X) X("mpp35", none, 0, 0)
|
||||
#define CP_I2C1_SCK(X) X("mpp36", none, 0, 0)
|
||||
#define CP_I2C0_SCK(X) X("mpp37", none, 0, 0)
|
||||
#define CP_I2C0_SDA(X) X("mpp38", none, 0, 0)
|
||||
#define SFP10_RX_LOS(X) X("mpp39", cp0_gpio2, 7, GPIO_ACTIVE_HIGH)
|
||||
#define SFP10_RS1(X) X("mpp40", cp0_gpio2, 8, GPIO_ACTIVE_HIGH)
|
||||
#define CP_SD_CRD_PWR_OFF(X) X("mpp41", none, 0, 0)
|
||||
#define CP_SD_HST_18_EN(X) X("mpp42", none, 0, 0)
|
||||
#define CP_SD_CRD_DT(X) X("mpp43", none, 0, 0)
|
||||
#define ETH9_INTn(X) X("mpp44", cp0_gpio2, 12, GPIO_ACTIVE_LOW)
|
||||
/* mpp45: Unused */
|
||||
#define ETH10_RESETn(X) X("mpp46", cp0_gpio2, 14, GPIO_ACTIVE_LOW)
|
||||
#define I2C_RESETn(X) X("mpp47", cp0_gpio2, 15, GPIO_ACTIVE_LOW)
|
||||
#define ETH10_INTn(X) X("mpp48", cp0_gpio2, 16, GPIO_ACTIVE_LOW)
|
||||
#define DEV_MODEn(X) X("mpp49", cp0_gpio2, 17, GPIO_ACTIVE_LOW)
|
||||
#define USB1_VBUS_ENABLE(X) X("mpp50", cp0_gpio2, 18, GPIO_ACTIVE_HIGH)
|
||||
#define USB1_VBUS_ERROR_OC(X) X("mpp51", cp0_gpio2, 19, GPIO_ACTIVE_HIGH)
|
||||
/* mpp52: Unused */
|
||||
/* mpp53: Unused */
|
||||
/* mpp54: Unused */
|
||||
#define CP_SD_LED(X) X("mpp55", none, 0, 0)
|
||||
#define CP_SD_CLK(X) X("mpp56", none, 0, 0)
|
||||
#define CP_SD_CMD(X) X("mpp57", none, 0, 0)
|
||||
#define CP_SD_D0(X) X("mpp58", none, 0, 0)
|
||||
#define CP_SD_D1(X) X("mpp59", none, 0, 0)
|
||||
#define CP_SD_D2(X) X("mpp60", none, 0, 0)
|
||||
#define CP_SD_D3(X) X("mpp61", none, 0, 0)
|
||||
#define DDR_TEN(X) X("mpp62", cp0_gpio2, 30 GPIO_ACTIVE_HIGH)
|
||||
|
||||
/* Macros to extract MPP info in different formats */
|
||||
#define MPP_ID(_mpp, _chip, _no, _flags) _mpp
|
||||
#define MPP_GPIO_CHIP(_mpp, _chip, _no, _flags) _chip
|
||||
|
||||
#define MPP_GPIO_REF(_mpp, _chip, _no, _flags) <&_chip _no _flags>
|
||||
#define MPP_GPIO_REF_NO_CHIP(_mpp, _chip, _no, _flags) <_no _flags>
|
||||
#define MPP_IRQ_REF(_mpp, _chip, _no, _flags) <&_chip _no _flags>
|
||||
|
||||
#endif /* _ALDER_MPP_H */
|
||||
@@ -0,0 +1,9 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
/*
|
||||
* Copyright (C) 2021 Marvell International Ltd.
|
||||
* Copyright (C) 2023 Addiva Elektronik AB
|
||||
*
|
||||
* Device tree for Alder board
|
||||
*/
|
||||
|
||||
#include "alder.dtsi"
|
||||
@@ -0,0 +1,611 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
/*
|
||||
* Copyright (C) 2021 Marvell International Ltd.
|
||||
* Copyright (C) 2023 Addiva Elektronik AB
|
||||
*
|
||||
* Device tree for Alder board
|
||||
*/
|
||||
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
#include <dt-bindings/leds/common.h>
|
||||
|
||||
#include "../marvell/cn9130-patched.dtsi"
|
||||
|
||||
#include "alder-mpp.h"
|
||||
|
||||
/ {
|
||||
model = "Alder";
|
||||
compatible = "alder,alder",
|
||||
"marvell,armada-ap807-quad",
|
||||
"marvell,armada-ap807";
|
||||
|
||||
chosen {
|
||||
stdout-path = "serial0:115200n8";
|
||||
};
|
||||
|
||||
memory@0 {
|
||||
device_type = "memory";
|
||||
reg = <0x0 0x0 0x0 0x80000000>;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
/* UART0 (Console) */
|
||||
|
||||
&cp0_pinctrl {
|
||||
cp0_uart0_pins: cp0-uart0-pins {
|
||||
marvell,pins = CP_UA0_RXD(MPP_ID), CP_UA0_TXD(MPP_ID);
|
||||
marvell,function = "uart0";
|
||||
};
|
||||
};
|
||||
|
||||
&uart0 {
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&cp0_uart0_pins>;
|
||||
};
|
||||
|
||||
|
||||
/* GPIO */
|
||||
|
||||
&cp0_gpio1 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&cp0_gpio2 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
|
||||
/* I2C0 (EEPROM) */
|
||||
|
||||
&cp0_pinctrl {
|
||||
cp0_i2c0_pins: cp0-i2c0-pins {
|
||||
marvell,pins = CP_I2C0_SCK(MPP_ID), CP_I2C0_SDA(MPP_ID);
|
||||
marvell,function = "i2c0";
|
||||
};
|
||||
};
|
||||
|
||||
&cp0_i2c0 {
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&cp0_i2c0_pins>;
|
||||
|
||||
eeprom@50 {
|
||||
// AT24C256C-MAHL-T
|
||||
compatible = "atmel,24c256";
|
||||
reg = <0x50>;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
/* I2C1 (Mux) */
|
||||
|
||||
&cp0_pinctrl {
|
||||
cp0_i2c1_pins: cp0-i2c1-pins {
|
||||
marvell,pins = CP_I2C1_SCK(MPP_ID), CP_I2C1_SDA(MPP_ID);
|
||||
marvell,function = "i2c1";
|
||||
};
|
||||
};
|
||||
|
||||
&cp0_i2c1 {
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&cp0_i2c1_pins>;
|
||||
|
||||
i2cmux@70 {
|
||||
compatible = "nxp,pca9548";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <0x70>;
|
||||
|
||||
reset-gpios = I2C_RESETn(MPP_GPIO_REF);
|
||||
|
||||
i2c_sysmgmt: i2c@0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <0>;
|
||||
};
|
||||
|
||||
i2c_pwr: i2c@1 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <1>;
|
||||
};
|
||||
|
||||
i2c_sw: i2c@2 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <2>;
|
||||
};
|
||||
|
||||
i2c_sfp9: i2c@3 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <3>;
|
||||
};
|
||||
|
||||
i2c_sfpa: i2c@4 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <4>;
|
||||
};
|
||||
|
||||
i2c@5 {
|
||||
status = "disabled";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <5>;
|
||||
};
|
||||
|
||||
i2c@6 {
|
||||
status = "disabled";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <6>;
|
||||
};
|
||||
|
||||
i2c@7 {
|
||||
status = "disabled";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <7>;
|
||||
};
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
/* System Management */
|
||||
|
||||
&i2c_sysmgmt {
|
||||
eeprom@b {
|
||||
label = "vpd";
|
||||
reg = <0x0b>;
|
||||
compatible = "atmel,24c02";
|
||||
read-only;
|
||||
|
||||
nvmem-layout {
|
||||
compatible = "onie,tlv-layout";
|
||||
|
||||
base_mac: mac-address {
|
||||
#nvmem-cell-cells = <1>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
/* AP SDHCI (eMMC) */
|
||||
|
||||
&ap_sdhci0 {
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
/* pinctrl-0 = <&ap_emmc_pins>; No pinctrl in Linux? */
|
||||
bus-width = <8>;
|
||||
mmc-ddr-1_8v;
|
||||
mmc-hs400-1_8v;
|
||||
};
|
||||
|
||||
|
||||
/* CP SDHCI (Micro-SD) */
|
||||
|
||||
/ {
|
||||
cp0_reg_sd_vccq: cp0_sd_vccq@0 {
|
||||
compatible = "regulator-gpio";
|
||||
regulator-name = "cp0_sd_vccq";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
/* gpios = <&CP_SD_HST_18_EN>; */
|
||||
states = <1800000 0x1
|
||||
3300000 0x0>;
|
||||
};
|
||||
|
||||
cp0_reg_sd_vcc: cp0_sd_vcc@0 {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "cp0_sd_vcc";
|
||||
regulator-min-microvolt = <3300000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
/* gpio = <&CP_SD_CRD_PWR_OFF>; */
|
||||
enable-active-high;
|
||||
regulator-always-on;
|
||||
};
|
||||
};
|
||||
|
||||
&cp0_pinctrl {
|
||||
cp0_sdhci_pins: cp0-sdhi-pins-0 {
|
||||
marvell,pins = \
|
||||
CP_SD_CRD_PWR_OFF(MPP_ID), CP_SD_HST_18_EN(MPP_ID), \
|
||||
CP_SD_CRD_DT(MPP_ID), CP_SD_LED(MPP_ID), \
|
||||
CP_SD_CLK(MPP_ID), CP_SD_CMD(MPP_ID), \
|
||||
CP_SD_D0(MPP_ID), CP_SD_D1(MPP_ID), \
|
||||
CP_SD_D2(MPP_ID), CP_SD_D3(MPP_ID);
|
||||
marvell,function = "sdio";
|
||||
};
|
||||
};
|
||||
|
||||
&cp0_sdhci0 {
|
||||
status = "disabled";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&cp0_sdhci_pins>;
|
||||
bus-width = <4>;
|
||||
/* cd-gpios = <&CP_SD_CRD_DT>; */
|
||||
vqmmc-supply = <&cp0_reg_sd_vccq>;
|
||||
vmmc-supply = <&cp0_reg_sd_vcc>;
|
||||
};
|
||||
|
||||
|
||||
/* SPI1 (Boot FLASH) */
|
||||
|
||||
&cp0_pinctrl {
|
||||
cp0_spi1_pins: cp0-spi-pins-0 {
|
||||
marvell,pins = \
|
||||
CP_SPI1_MISO(MPP_ID), CP_SPI1_CS0(MPP_ID), \
|
||||
CP_SPI1_MOSI(MPP_ID), CP_SPI1_SCK(MPP_ID);
|
||||
marvell,function = "spi1";
|
||||
};
|
||||
};
|
||||
|
||||
&cp0_spi1 {
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&cp0_spi1_pins>;
|
||||
|
||||
/* Boot flash */
|
||||
spi-flash@0 {
|
||||
#address-cells = <0x1>;
|
||||
#size-cells = <0x1>;
|
||||
compatible = "jedec,spi-nor", "spi-flash";
|
||||
reg = <0x0>;
|
||||
/* On-board MUX does not allow higher frequencies */
|
||||
spi-max-frequency = <40000000>;
|
||||
|
||||
partitions {
|
||||
compatible = "fixed-partitions";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
boot0@0 {
|
||||
label = "boot0";
|
||||
reg = <0x0 0x200000>;
|
||||
};
|
||||
|
||||
boot1@200000 {
|
||||
label = "boot1";
|
||||
reg = <0x200000 0x200000>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
/* USB1 */
|
||||
|
||||
/ {
|
||||
cp0_usb3_0_phy1: cp0_usb3_phy {
|
||||
compatible = "usb-nop-xceiv";
|
||||
vcc-supply = <®_cp0_usb3_vbus1>;
|
||||
};
|
||||
|
||||
reg_cp0_usb3_vbus1: reg_cp0_usb3_vbus1 {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "cp0-xhci1-vbus";
|
||||
regulator-min-microvolt = <5000000>;
|
||||
regulator-max-microvolt = <5000000>;
|
||||
enable-active-high;
|
||||
gpio = USB1_VBUS_ENABLE(MPP_GPIO_REF);
|
||||
};
|
||||
};
|
||||
|
||||
&cp0_utmi {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&cp0_utmi1 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&cp0_usb3_1 {
|
||||
status = "disabled";
|
||||
usb-phy = <&cp0_usb3_0_phy1>;
|
||||
phys = <&cp0_utmi1>, <&cp0_comphy3 1>;
|
||||
phy-names = "usb", "usb3";
|
||||
dr_mode = "host";
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
/* ETH0 (DSA connection to switch) */
|
||||
|
||||
&cp0_crypto {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&cp0_ethernet {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&cp0_eth0 {
|
||||
status = "okay";
|
||||
phy-mode = "10gbase-r";
|
||||
phys = <&cp0_comphy4 0>;
|
||||
managed = "in-band-status";
|
||||
|
||||
nvmem-cells = <&base_mac 0>;
|
||||
nvmem-cell-names = "mac-address";
|
||||
};
|
||||
|
||||
|
||||
/* MDIO (Switch) */
|
||||
|
||||
&cp0_pinctrl {
|
||||
cp0_mdio_pins: cp0-mdio-pins-0 {
|
||||
marvell,pins = CP_SMI_MDIO(MPP_ID), CP_SMI_MDC(MPP_ID);
|
||||
marvell,function = "ge";
|
||||
};
|
||||
};
|
||||
|
||||
&cp0_mdio {
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&cp0_mdio_pins>;
|
||||
|
||||
sw: switch@0 {
|
||||
compatible = "marvell,mv88e6190";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <0>;
|
||||
|
||||
reset-gpios = SW_RESETn(MPP_GPIO_REF);
|
||||
|
||||
interrupts-extended = SW_INTn(MPP_IRQ_REF);
|
||||
interrupt-controller;
|
||||
|
||||
dsa,member = <0 0>;
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
port@0 {
|
||||
reg = <0x0>;
|
||||
label = "cpu";
|
||||
ethernet = <&cp0_eth0>;
|
||||
phy-mode = "10gbase-r";
|
||||
fixed-link {
|
||||
speed = <10000>;
|
||||
full-duplex;
|
||||
};
|
||||
};
|
||||
|
||||
#define SWP(_n, _label, _mac_offs, _phymode, _phy) \
|
||||
port@_n { \
|
||||
reg = <0x ## _n>; \
|
||||
label = _label; \
|
||||
phy-mode = _phymode; \
|
||||
phy-handle = <&_phy>; \
|
||||
\
|
||||
nvmem-cells = <&base_mac _mac_offs>; \
|
||||
nvmem-cell-names = "mac-address"; \
|
||||
}
|
||||
|
||||
SWP(9, "x1", 1, "usxgmii", xphy9);
|
||||
SWP(a, "x2", 2, "usxgmii", xphya);
|
||||
|
||||
SWP(8, "x3", 3, "gmii", swphy8);
|
||||
SWP(7, "x4", 4, "gmii", swphy7);
|
||||
SWP(6, "x5", 5, "gmii", swphy6);
|
||||
SWP(5, "x6", 6, "gmii", swphy5);
|
||||
SWP(4, "x7", 7, "gmii", swphy4);
|
||||
SWP(3, "x8", 8, "gmii", swphy3);
|
||||
SWP(2, "x9", 9, "gmii", swphy2);
|
||||
SWP(1, "x10", 10, "gmii", swphy1);
|
||||
#undef SWP
|
||||
};
|
||||
|
||||
mdio {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
swphy1: ethernet-phy@1 { reg = <0x1>; };
|
||||
swphy2: ethernet-phy@2 { reg = <0x2>; };
|
||||
swphy3: ethernet-phy@3 { reg = <0x3>; };
|
||||
swphy4: ethernet-phy@4 { reg = <0x4>; };
|
||||
swphy5: ethernet-phy@5 { reg = <0x5>; };
|
||||
swphy6: ethernet-phy@6 { reg = <0x6>; };
|
||||
swphy7: ethernet-phy@7 { reg = <0x7>; };
|
||||
swphy8: ethernet-phy@8 { reg = <0x8>; };
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
/* XMDIO (88X3310P 10G PHYs) */
|
||||
|
||||
&cp0_pinctrl {
|
||||
cp0_xmdio_pins: cp0-xmdio-pins-0 {
|
||||
marvell,pins = CP_XSMI_MDIO(MPP_ID), CP_XSMI_MDC(MPP_ID);
|
||||
marvell,function = "xg";
|
||||
};
|
||||
};
|
||||
|
||||
Ð9_RESETn(MPP_GPIO_CHIP) {
|
||||
xphy9-reset-hog {
|
||||
gpio-hog;
|
||||
gpios = ETH9_RESETn(MPP_GPIO_REF_NO_CHIP);
|
||||
output-low;
|
||||
line-name = "x1-phy-reset";
|
||||
};
|
||||
};
|
||||
|
||||
Ð10_RESETn(MPP_GPIO_CHIP) {
|
||||
xphya-reset-hog {
|
||||
gpio-hog;
|
||||
gpios = ETH10_RESETn(MPP_GPIO_REF_NO_CHIP);
|
||||
output-low;
|
||||
line-name = "x2-phy-reset";
|
||||
};
|
||||
};
|
||||
|
||||
&cp0_xmdio {
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&cp0_xmdio_pins>;
|
||||
|
||||
/* 88X3310 specifices 35ns minimum MDC period (28.57 MHz). */
|
||||
clock-frequency = <28571428>;
|
||||
|
||||
xphy9: ethernet-phy@4 {
|
||||
compatible = "ethernet-phy-ieee802.3-c45";
|
||||
reg = <4>;
|
||||
sfp = <&sfp9>;
|
||||
};
|
||||
|
||||
xphya: ethernet-phy@5 {
|
||||
compatible = "ethernet-phy-ieee802.3-c45";
|
||||
reg = <5>;
|
||||
sfp = <&sfpa>;
|
||||
};
|
||||
};
|
||||
|
||||
/ {
|
||||
sfp9: sfp@9 {
|
||||
compatible = "sff,sfp";
|
||||
i2c-bus = <&i2c_sfp9>;
|
||||
mod-def0-gpios = SFP9_MOD_ABS(MPP_GPIO_REF);
|
||||
los-gpios = SFP9_RX_LOS(MPP_GPIO_REF);
|
||||
tx-disable-gpios = SFP9_TX_DISABLE(MPP_GPIO_REF);
|
||||
tx-fault-gpios = SFP9_TX_FAULT(MPP_GPIO_REF);
|
||||
rate-select0-gpios = SFP9_RS0(MPP_GPIO_REF);
|
||||
rate-select1-gpios = SFP9_RS1(MPP_GPIO_REF);
|
||||
maximum-power-milliwatt = <3000>;
|
||||
};
|
||||
|
||||
sfpa: sfp@a {
|
||||
compatible = "sff,sfp";
|
||||
i2c-bus = <&i2c_sfpa>;
|
||||
mod-def0-gpios = SFP10_MOD_ABS(MPP_GPIO_REF);
|
||||
los-gpios = SFP10_RX_LOS(MPP_GPIO_REF);
|
||||
tx-disable-gpios = SFP10_TX_DISABLE(MPP_GPIO_REF);
|
||||
tx-fault-gpios = SFP10_TX_FAULT(MPP_GPIO_REF);
|
||||
rate-select0-gpios = SFP10_RS0(MPP_GPIO_REF);
|
||||
rate-select1-gpios = SFP10_RS1(MPP_GPIO_REF);
|
||||
maximum-power-milliwatt = <3000>;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
/* Power Board */
|
||||
|
||||
&i2c_pwr {
|
||||
// Shared IRQ on I2C_IRQ
|
||||
|
||||
// 0x26 U13 PCF8574 GPIO I/O
|
||||
gpio_pwr1: gpio@26 {
|
||||
compatible = "nxp,pcf8574a";
|
||||
#gpio-cells = <2>;
|
||||
gpio-controller;
|
||||
reg = <0x26>;
|
||||
#define GPIO_PWR1_UNUSED0 gpio_pwr1 0 GPIO_ACTIVE_HIGH
|
||||
#define GPIO_PWR1_UNUSED1 gpio_pwr1 1 GPIO_ACTIVE_HIGH
|
||||
#define GPIO_POE_PGOOD gpio_pwr1 2 GPIO_ACTIVE_HIGH
|
||||
#define GPIO_RESET_BUTTON gpio_pwr1 3 GPIO_ACTIVE_LOW
|
||||
#define GPIO_VIN1_PGOOD gpio_pwr1 4 GPIO_ACTIVE_LOW
|
||||
#define GPIO_LED_VIN1_ALERT gpio_pwr1 5 GPIO_ACTIVE_LOW
|
||||
#define GPIO_VIN2_PGOOD gpio_pwr1 6 GPIO_ACTIVE_LOW
|
||||
#define GPIO_LED_VIN2_ALERT gpio_pwr1 7 GPIO_ACTIVE_LOW
|
||||
};
|
||||
|
||||
//0x27 U3 PCF8574 GPIO LED
|
||||
gpio_pwr2: gpio@27 {
|
||||
compatible = "nxp,pcf8574a";
|
||||
#gpio-cells = <2>;
|
||||
gpio-controller;
|
||||
reg = <0x27>;
|
||||
#define GPIO_LED2G gpio_pwr2 0 GPIO_ACTIVE_LOW
|
||||
#define GPIO_LED2R gpio_pwr2 1 GPIO_ACTIVE_LOW
|
||||
#define GPIO_LED1G gpio_pwr2 2 GPIO_ACTIVE_LOW
|
||||
#define GPIO_LED1R gpio_pwr2 3 GPIO_ACTIVE_LOW
|
||||
#define GPIO_LED4G gpio_pwr2 4 GPIO_ACTIVE_LOW
|
||||
#define GPIO_LED4R gpio_pwr2 5 GPIO_ACTIVE_LOW
|
||||
#define GPIO_LED3G gpio_pwr2 6 GPIO_ACTIVE_LOW
|
||||
#define GPIO_LED3R gpio_pwr2 7 GPIO_ACTIVE_LOW
|
||||
};
|
||||
|
||||
//0x28* U5 TPS23861PWR PoE Controller
|
||||
//0x30 U5 TPS23861PWR PoE Controller broadcast
|
||||
|
||||
//0x50 U15 AT24C256C EEPROM
|
||||
eeprom@50 {
|
||||
// AT24C256C-MAHL-T
|
||||
compatible = "atmel,24c256";
|
||||
reg = <0x50>;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
/* System LEDs */
|
||||
|
||||
/ {
|
||||
leds: leds {
|
||||
compatible = "gpio-leds";
|
||||
|
||||
led-statg {
|
||||
function = LED_FUNCTION_STATUS;
|
||||
color = <LED_COLOR_ID_GREEN>;
|
||||
gpios = <&GPIO_LED1G>;
|
||||
};
|
||||
|
||||
led-statr {
|
||||
function = LED_FUNCTION_STATUS;
|
||||
color = <LED_COLOR_ID_RED>;
|
||||
gpios = <&GPIO_LED1R>;
|
||||
};
|
||||
|
||||
led-faultg {
|
||||
function = LED_FUNCTION_FAULT;
|
||||
color = <LED_COLOR_ID_GREEN>;
|
||||
gpios = <&GPIO_LED2G>;
|
||||
};
|
||||
|
||||
led-faultr {
|
||||
function = LED_FUNCTION_FAULT;
|
||||
color = <LED_COLOR_ID_RED>;
|
||||
gpios = <&GPIO_LED2R>;
|
||||
};
|
||||
|
||||
led-lang {
|
||||
function = LED_FUNCTION_LAN;
|
||||
color = <LED_COLOR_ID_GREEN>;
|
||||
gpios = <&GPIO_LED3G>;
|
||||
};
|
||||
|
||||
led-lanr {
|
||||
function = LED_FUNCTION_LAN;
|
||||
color = <LED_COLOR_ID_RED>;
|
||||
gpios = <&GPIO_LED3R>;
|
||||
};
|
||||
|
||||
led-dbgg {
|
||||
function = LED_FUNCTION_DEBUG;
|
||||
color = <LED_COLOR_ID_GREEN>;
|
||||
gpios = <&GPIO_LED4G>;
|
||||
};
|
||||
|
||||
led-dbgr {
|
||||
function = LED_FUNCTION_DEBUG;
|
||||
color = <LED_COLOR_ID_RED>;
|
||||
gpios = <&GPIO_LED4R>;
|
||||
};
|
||||
|
||||
led-vin1_alert {
|
||||
function = "power-1";
|
||||
color = <LED_COLOR_ID_RED>;
|
||||
gpios = <&GPIO_LED_VIN1_ALERT>;
|
||||
};
|
||||
|
||||
led-vin2_alert {
|
||||
function = "power-2";
|
||||
color = <LED_COLOR_ID_RED>;
|
||||
gpios = <&GPIO_LED_VIN2_ALERT>;
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,8 @@
|
||||
#include "cn9130.dtsi"
|
||||
|
||||
&cp0_syscon0 {
|
||||
cp0_pinctrl: pinctrl {
|
||||
/* For some reason, this is missing from cn9130.dtsi */
|
||||
compatible = "marvell,cp115-standalone-pinctrl";
|
||||
};
|
||||
};
|
||||
@@ -5,7 +5,7 @@
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
#include "microchip/sparx5_pcb135_emmc.dts"
|
||||
#include "sparx5_pcb135_emmc.dts"
|
||||
|
||||
&cpu0 {
|
||||
enable-method = "spin-table";
|
||||
|
||||
@@ -262,7 +262,7 @@ CONFIG_VETH=m
|
||||
CONFIG_VIRTIO_NET=y
|
||||
CONFIG_NLMON=y
|
||||
CONFIG_NET_VRF=y
|
||||
CONFIG_NET_DSA_MV88E6XXX=y
|
||||
CONFIG_NET_DSA_MV88E6XXX=m
|
||||
CONFIG_NET_DSA_MV88E6XXX_PTP=y
|
||||
# CONFIG_NET_VENDOR_3COM is not set
|
||||
# CONFIG_NET_VENDOR_ADAPTEC is not set
|
||||
@@ -287,8 +287,8 @@ CONFIG_NET_DSA_MV88E6XXX_PTP=y
|
||||
# CONFIG_NET_VENDOR_GOOGLE is not set
|
||||
# CONFIG_NET_VENDOR_HISILICON is not set
|
||||
# CONFIG_NET_VENDOR_HUAWEI is not set
|
||||
CONFIG_MVNETA=y
|
||||
CONFIG_MVPP2=y
|
||||
CONFIG_MVNETA=m
|
||||
CONFIG_MVPP2=m
|
||||
# CONFIG_NET_VENDOR_MELLANOX is not set
|
||||
# CONFIG_NET_VENDOR_MICREL is not set
|
||||
CONFIG_SPARX5_SWITCH=y
|
||||
@@ -326,15 +326,16 @@ CONFIG_8139CP=y
|
||||
# CONFIG_NET_VENDOR_XILINX is not set
|
||||
CONFIG_SFP=y
|
||||
CONFIG_MARVELL_PHY=y
|
||||
CONFIG_MARVELL_10G_PHY=y
|
||||
CONFIG_MARVELL_10G_PHY=m
|
||||
CONFIG_MICREL_PHY=y
|
||||
CONFIG_MICROCHIP_PHY=y
|
||||
CONFIG_MICROCHIP_T1_PHY=y
|
||||
CONFIG_MICROSEMI_PHY=y
|
||||
CONFIG_MICROSEMI_PHY=m
|
||||
CONFIG_MDIO_BITBANG=y
|
||||
CONFIG_MDIO_MVUSB=y
|
||||
CONFIG_MDIO_MSCC_MIIM=y
|
||||
CONFIG_MDIO_BUS_MUX_MMIOREG=y
|
||||
CONFIG_USB_RTL8152=y
|
||||
CONFIG_USB_USBNET=y
|
||||
CONFIG_USB_NET_CDC_EEM=y
|
||||
# CONFIG_USB_NET_CDC_NCM is not set
|
||||
@@ -371,6 +372,7 @@ CONFIG_I2C_SLAVE=y
|
||||
CONFIG_SPI=y
|
||||
CONFIG_SPI_ARMADA_3700=y
|
||||
CONFIG_SPI_NXP_FLEXSPI=y
|
||||
CONFIG_SPI_ORION=y
|
||||
CONFIG_SPI_PL022=y
|
||||
CONFIG_SPI_MUX=y
|
||||
CONFIG_SPI_SPIDEV=m
|
||||
@@ -458,6 +460,7 @@ CONFIG_MMC_SPI=y
|
||||
CONFIG_MMC_DW=y
|
||||
CONFIG_MMC_DW_EXYNOS=y
|
||||
CONFIG_MMC_DW_K3=y
|
||||
CONFIG_MMC_CQHCI=y
|
||||
CONFIG_MMC_SDHCI_XENON=y
|
||||
CONFIG_SCSI_UFSHCD=y
|
||||
CONFIG_SCSI_UFSHCD_PLATFORM=y
|
||||
@@ -498,7 +501,9 @@ CONFIG_TI_ADC081C=y
|
||||
CONFIG_PWM=y
|
||||
CONFIG_PHY_XGENE=y
|
||||
CONFIG_PHY_MVEBU_CP110_COMPHY=y
|
||||
CONFIG_PHY_MVEBU_CP110_UTMI=y
|
||||
CONFIG_PHY_SAMSUNG_USB2=y
|
||||
CONFIG_NVMEM_LAYOUT_ONIE_TLV=y
|
||||
CONFIG_MUX_MMIO=y
|
||||
CONFIG_EXT2_FS=y
|
||||
CONFIG_EXT3_FS=y
|
||||
@@ -533,6 +538,7 @@ CONFIG_IRQ_POLL=y
|
||||
CONFIG_PRINTK_TIME=y
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y
|
||||
CONFIG_DEBUG_FS=y
|
||||
CONFIG_DETECT_HUNG_TASK=y
|
||||
# CONFIG_SCHED_DEBUG is not set
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
x33x0fw_0_3_11_0_11832.hdr
|
||||
Binary file not shown.
@@ -415,17 +415,11 @@ a printer can publish IPP records with meta data on the printer type and model
|
||||
or donwload URL for drivers. Switches and routers usually publish how they
|
||||
can be reached: HTTP/HTTPS and SSH.
|
||||
|
||||
Note: there are other mechanisms for device discovery. Microsoft have been
|
||||
slow to adopt mDNS, having relied on their own SSDP protocol. For the
|
||||
full experince Apple's "Bonjour" can be installed in Windows.
|
||||
|
||||
mDNS is supported in this product and should be enabled by default. To
|
||||
verify it works, open the Windows File Explorer (Win+E) and scroll to
|
||||
Network in the left-hand menu. An icon with a matching hostname can be
|
||||
found there which, when clicked, opens up the device's Web Interface.
|
||||
macOS users have mDNS fully integrated by default. Linux users can use
|
||||
'mdns-scan' or Avahi, as shown above. The latter two can also just set
|
||||
their web browsers to https://hostname-01-02-03.local
|
||||
mDNS is supported in this product and should be enabled by default. To
|
||||
verify that it works, in Windows, macOS, or Linux, open your web browser
|
||||
and point it to <https://hostname-01-02-03.local>. This is the hostname
|
||||
and three last octets of the device's base MAC address. You can also use
|
||||
mDNS browsers or command line tools like mdns-scan
|
||||
|
||||
|
||||
$(h2 "VLAN Interfaces")
|
||||
|
||||
@@ -100,7 +100,7 @@ config DISK_IMAGE_RELEASE_URL
|
||||
menuconfig GNS3_APPLIANCE
|
||||
bool "GNS3 Appliance"
|
||||
select DISK_IMAGE
|
||||
default y if BR2_x86_64
|
||||
default y
|
||||
help
|
||||
Create a GNS3 appliance description that, together with the
|
||||
disk image, can be imported into GNS3.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Busybox version: 1.36.0
|
||||
# Fri Jul 7 17:59:34 2023
|
||||
# Tue Oct 3 18:00:40 2023
|
||||
#
|
||||
CONFIG_HAVE_DOT_CONFIG=y
|
||||
|
||||
@@ -538,7 +538,7 @@ CONFIG_LAST_ID=60000
|
||||
CONFIG_FIRST_SYSTEM_ID=100
|
||||
CONFIG_LAST_SYSTEM_ID=999
|
||||
# CONFIG_CHPASSWD is not set
|
||||
CONFIG_FEATURE_DEFAULT_PASSWD_ALGO="md5"
|
||||
CONFIG_FEATURE_DEFAULT_PASSWD_ALGO="sha512"
|
||||
CONFIG_CRYPTPW=y
|
||||
CONFIG_MKPASSWD=y
|
||||
CONFIG_DELUSER=y
|
||||
@@ -556,7 +556,7 @@ CONFIG_SU=y
|
||||
CONFIG_FEATURE_SU_SYSLOG=y
|
||||
CONFIG_FEATURE_SU_CHECKS_SHELLS=y
|
||||
# CONFIG_FEATURE_SU_BLANK_PW_NEEDS_SECURE_TTY is not set
|
||||
CONFIG_SULOGIN=y
|
||||
# CONFIG_SULOGIN is not set
|
||||
CONFIG_VLOCK=y
|
||||
|
||||
#
|
||||
|
||||
@@ -30,7 +30,7 @@ image var.ext4 {
|
||||
}
|
||||
}
|
||||
|
||||
image disk.img {
|
||||
image @DISKIMG@ {
|
||||
size = @TOTALSIZE@
|
||||
hdimage {
|
||||
partition-table-type = "gpt"
|
||||
|
||||
+13
-4
@@ -9,11 +9,20 @@ die()
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Find all matching key=value assignments in output/.config
|
||||
# E.g., load_cfg DISK_IMAGE sets the following variables:
|
||||
#
|
||||
# DISK_IMAGE=y
|
||||
# DISK_IMAGE_SIZE="512"
|
||||
# etc.
|
||||
#
|
||||
# shellcheck disable=SC1090
|
||||
load_cfg()
|
||||
{
|
||||
local tmp=$(mktemp -p /tmp)
|
||||
tmp=$(mktemp -p /tmp)
|
||||
|
||||
grep "$1" $BR2_CONFIG >$tmp
|
||||
. $tmp
|
||||
rm $tmp
|
||||
grep -E "${1}.*=" "$BR2_CONFIG" >"$tmp"
|
||||
. "$tmp"
|
||||
|
||||
rm "$tmp"
|
||||
}
|
||||
|
||||
@@ -123,10 +123,11 @@ tmp=$BUILD_DIR/genimage.tmp
|
||||
total=$((512 << M))
|
||||
bootoffs=$((32 << K))
|
||||
bootdata=
|
||||
diskimg=disk.img
|
||||
bootimg=
|
||||
bootpart=
|
||||
|
||||
while getopts "a:b:B:s:" opt; do
|
||||
while getopts "a:b:B:n:s:" opt; do
|
||||
case ${opt} in
|
||||
a)
|
||||
arch=$OPTARG
|
||||
@@ -137,6 +138,9 @@ while getopts "a:b:B:s:" opt; do
|
||||
B)
|
||||
bootoffs=$(($OPTARG))
|
||||
;;
|
||||
n)
|
||||
diskimg=${OPTARG}
|
||||
;;
|
||||
s)
|
||||
total=$(size2int $OPTARG)
|
||||
;;
|
||||
@@ -158,6 +162,7 @@ awk \
|
||||
-vimgsize=$imgsize \
|
||||
-vcfgsize=$cfgsize \
|
||||
-vvarsize=$varsize \
|
||||
-vdiskimg=$diskimg \
|
||||
-vbootimg="$bootimg" -vbootpart="$bootpart" \
|
||||
'{
|
||||
sub(/@TOTALSIZE@/, total);
|
||||
@@ -166,7 +171,7 @@ awk \
|
||||
sub(/@IMGSIZE@/, imgsize);
|
||||
sub(/@CFGSIZE@/, cfgsize);
|
||||
sub(/@VARSIZE@/, varsize);
|
||||
|
||||
sub(/@DISKIMG@/, diskimg);
|
||||
sub(/@BOOTIMG@/, bootimg);
|
||||
sub(/@BOOTPART@/, bootpart);
|
||||
}1' \
|
||||
|
||||
+63
-20
@@ -1,26 +1,66 @@
|
||||
#!/bin/sh
|
||||
# shellcheck disable=SC1091
|
||||
. "$TARGET_DIR/etc/os-release"
|
||||
|
||||
if [ -n "$INFIX_RELEASE" ]; then
|
||||
rel="-${INFIX_RELEASE}"
|
||||
fi
|
||||
|
||||
NM="${1:-custom}${rel}"
|
||||
RAM=${2:-512}
|
||||
IFNUM=${3:-1}
|
||||
ARCH=$1
|
||||
NM="${2:-custom}${rel}"
|
||||
DISK=$3
|
||||
RAM=${4:-512}
|
||||
IFNUM=${5:-1}
|
||||
|
||||
# The aarch64 build currently has no "loader" but instead starts Linux
|
||||
# directly, so we need to add a basic cmdline.
|
||||
loader_args()
|
||||
{
|
||||
if [ "$ARCH" = "aarch64" ]; then
|
||||
cat <<EOF
|
||||
"kernel_command_line": "console=ttyAMA0 root=PARTLABEL=primary quiet",
|
||||
EOF
|
||||
fi
|
||||
}
|
||||
|
||||
loader_img()
|
||||
{
|
||||
if [ "$ARCH" = "x86_64" ]; then
|
||||
cat <<EOF
|
||||
"bios_image": "$loader",
|
||||
EOF
|
||||
else
|
||||
cat <<EOF
|
||||
"kernel_image": "$loader",
|
||||
EOF
|
||||
fi
|
||||
}
|
||||
|
||||
if [ "$ARCH" = "x86_64" ]; then
|
||||
loader=OVMF.fd
|
||||
accel=allow
|
||||
opts=
|
||||
else
|
||||
loader=Image
|
||||
accel=disable
|
||||
opts="-M virt -cpu cortex-a72"
|
||||
fi
|
||||
|
||||
echo ">> Disk image MD5: $(md5sum "$BINARIES_DIR/$DISK" | awk '{print $1}')"
|
||||
|
||||
cat <<EOF >"$BINARIES_DIR/${NM}.gns3a"
|
||||
{
|
||||
"name": "$NM",
|
||||
"category": "router",
|
||||
"description": "Infix is a Network Operating System based on Linux. It can be set up both as a switch, with offloading using switchdev, and a router with firewalling.",
|
||||
"vendor_name": "KernelKit",
|
||||
"vendor_url": "https://github.com/kernelkit/",
|
||||
"product_name": "Infix",
|
||||
"description": "$INFIX_DESC",
|
||||
"vendor_name": "$VENDOR_NAME",
|
||||
"vendor_url": "$VENDOR_HOME",
|
||||
"product_name": "$NAME",
|
||||
"registry_version": 6,
|
||||
"status": "stable",
|
||||
"maintainer": "KernelKit",
|
||||
"maintainer_email": "kernelkit@googlegroups.com",
|
||||
"usage": "Default console login is 'root', no password. For remote login, default user/pass: admin/admin also works.\n\nType 'help' for an overview of commands and relevant configuration files.\n\nThe /etc directory is writable, use the passwd tool after login as part of your set up.\nFor networking, classify interfaces as switchports with /etc/mactab, syntax: 'MAC-address eN', where N is the port number (1-MAX).\nTo set up bridging and management interfaces, use /etc/network/interfaces, and /etc/network/interfaces.d/",
|
||||
"maintainer": "$VENDOR_NAME",
|
||||
"maintainer_email": "${SUPPORT_URL#mailto:}",
|
||||
"usage": "Default login, user/pass: admin/admin\n\nType 'help' for an overview of commands and relevant configuration files.\n\nFor Classic builds the following applies: the /etc directory is writable, use the passwd tool after login as part of your set up.\nFor networking, classify interfaces as switchports with /etc/mactab, syntax: 'MAC-address eN', where N is the port number (1-MAX).\nTo set up bridging and management interfaces, use /etc/network/interfaces, and /etc/network/interfaces.d/",
|
||||
"port_name_format": "eth{0}",
|
||||
"linked_clone": true,
|
||||
"qemu": {
|
||||
@@ -29,21 +69,24 @@ cat <<EOF >"$BINARIES_DIR/${NM}.gns3a"
|
||||
"ram": ${RAM},
|
||||
"cpus": 1,
|
||||
"hda_disk_interface": "virtio",
|
||||
"arch": "x86_64",
|
||||
"arch": "$ARCH",
|
||||
"console_type": "telnet",
|
||||
"kvm": "allow"
|
||||
$(loader_img)
|
||||
$(loader_args)
|
||||
"kvm": "$accel",
|
||||
"options": "$opts"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "OVMF.fd",
|
||||
"filesize": $(stat --printf='%s' "$BINARIES_DIR/OVMF.fd"),
|
||||
"md5sum": "$(md5sum "$BINARIES_DIR/OVMF.fd" | awk '{print $1}')",
|
||||
"filename": "$loader",
|
||||
"filesize": $(stat --printf='%s' "$BINARIES_DIR/$loader"),
|
||||
"md5sum": "$(md5sum "$BINARIES_DIR/$loader" | awk '{print $1}')",
|
||||
"version": "0.0"
|
||||
},
|
||||
{
|
||||
"filename": "disk.img",
|
||||
"filesize": $(stat --printf='%s' "$BINARIES_DIR/disk.img"),
|
||||
"md5sum": "$(md5sum "$BINARIES_DIR/disk.img" | awk '{print $1}')",
|
||||
"filename": "$DISK",
|
||||
"filesize": $(stat --printf='%s' "$BINARIES_DIR/$DISK"),
|
||||
"md5sum": "$(md5sum "$BINARIES_DIR/$DISK" | awk '{print $1}')",
|
||||
"version": "0.0"
|
||||
}
|
||||
],
|
||||
@@ -51,8 +94,8 @@ cat <<EOF >"$BINARIES_DIR/${NM}.gns3a"
|
||||
{
|
||||
"name": "0.0",
|
||||
"images": {
|
||||
"bios_image": "OVMF.fd",
|
||||
"hda_disk_image": "disk.img"
|
||||
$(loader_img)
|
||||
"hda_disk_image": "$DISK"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
+44
-20
@@ -7,19 +7,39 @@ if [ -n "${ID_LIKE}" ]; then
|
||||
ID="${ID} ${ID_LIKE}"
|
||||
fi
|
||||
|
||||
GIT_VERSION=$(git -C "$BR2_EXTERNAL_INFIX_PATH" describe --always --dirty --tags)
|
||||
if [ -z "$GIT_VERSION" ]; then
|
||||
infix_path="$BR2_EXTERNAL_INFIX_PATH"
|
||||
if [ -n "$INFIX_OEM_PATH" ]; then
|
||||
# Use version from br2-external OEM:ing Infix
|
||||
infix_path="$INFIX_OEM_PATH"
|
||||
fi
|
||||
GIT_VERSION=$(git -C "$infix_path" describe --always --dirty --tags)
|
||||
fi
|
||||
|
||||
# Override VERSION in /etc/os-release and filenames for release builds
|
||||
if [ -n "$INFIX_RELEASE" ]; then
|
||||
VERSION="$INFIX_RELEASE"
|
||||
else
|
||||
VERSION=$GIT_VERSION
|
||||
fi
|
||||
|
||||
# This is a symlink to /usr/lib/os-release, so we remove this to keep
|
||||
# original Buildroot information.
|
||||
rm -f "$TARGET_DIR/etc/os-release"
|
||||
{
|
||||
echo "NAME=\"Infix\""
|
||||
echo "VERSION=${GIT_VERSION}"
|
||||
echo "ID=infix"
|
||||
echo "NAME=\"$INFIX_NAME\""
|
||||
echo "ID=$INFIX_ID"
|
||||
echo "PRETTY_NAME=\"$INFIX_TAGLINE\""
|
||||
echo "ID_LIKE=\"${ID}\""
|
||||
echo "VERSION_ID=${GIT_VERSION}"
|
||||
echo "BUILD_ID=\"${NAME} ${VERSION}\""
|
||||
echo "PRETTY_NAME=\"Infix by KernelKit\""
|
||||
echo "VERSION=\"${VERSION}\""
|
||||
echo "VERSION_ID=${VERSION}"
|
||||
echo "BUILD_ID=\"${GIT_VERSION}\""
|
||||
if [ -n "$INFIX_IMAGE_ID" ]; then
|
||||
echo "IMAGE_ID=\"$INFIX_IMAGE_ID\""
|
||||
fi
|
||||
if [ -n "$INFIX_RELEASE" ]; then
|
||||
echo "IMAGE_VERSION=\"$INFIX_RELEASE\""
|
||||
fi
|
||||
if [ "$INFIX_VARIANT_NETCONF" = "y" ]; then
|
||||
echo "VARIANT=\"Managed NETCONF\""
|
||||
echo "VARIANT_ID=netconf"
|
||||
@@ -28,11 +48,25 @@ rm -f "$TARGET_DIR/etc/os-release"
|
||||
echo "VARIANT_ID=classic"
|
||||
fi
|
||||
echo "ARCHITECTURE=\"${INFIX_ARCH}\""
|
||||
echo "HOME_URL=https://github.com/KernelKit"
|
||||
echo "HOME_URL=$INFIX_HOME"
|
||||
if [ -n "$INFIX_VENDOR" ]; then
|
||||
echo "VENDOR_NAME=\"$INFIX_VENDOR\""
|
||||
fi
|
||||
if [ -n "$INFIX_VENDOR_HOME" ]; then
|
||||
echo "VENDOR_HOME=\"$INFIX_VENDOR_HOME\""
|
||||
fi
|
||||
if [ -n "$INFIX_DOC" ]; then
|
||||
echo "DOCUMENTATION_URL=\"$INFIX_DOC\""
|
||||
fi
|
||||
if [ -n "$INFIX_SUPPORT" ]; then
|
||||
echo "SUPPORT_URL=\"$INFIX_SUPPORT\""
|
||||
fi
|
||||
if [ -n "$INFIX_DESC" ]; then
|
||||
echo "INFIX_DESC=\"$INFIX_DESC\""
|
||||
fi
|
||||
} > "$TARGET_DIR/etc/os-release"
|
||||
|
||||
|
||||
echo "Infix by KernelKit $GIT_VERSION -- $(date +"%b %e %H:%M %Z %Y")" > "$TARGET_DIR/etc/version"
|
||||
echo "$INFIX_TAGLINE $VERSION -- $(date +"%b %e %H:%M %Z %Y")" > "$TARGET_DIR/etc/version"
|
||||
|
||||
# Allow pdmenu (setup) and bash to be login shells, bash is added
|
||||
# automatically when selected in menuyconfig, but not when BusyBox
|
||||
@@ -46,13 +80,3 @@ grep -qsE '^/bin/true$$' "$TARGET_DIR/etc/shells" \
|
||||
|| echo "/bin/true" >> "$TARGET_DIR/etc/shells"
|
||||
grep -qsE '^/bin/false$$' "$TARGET_DIR/etc/shells" \
|
||||
|| echo "/bin/false" >> "$TARGET_DIR/etc/shells"
|
||||
|
||||
# Menuconfig support for modifying Qemu args in release tarballs
|
||||
cp "$BR2_EXTERNAL_INFIX_PATH/board/common/qemu/qemu.sh" "$BINARIES_DIR/"
|
||||
sed "s/default QEMU_aarch64/default QEMU_$BR2_ARCH/" \
|
||||
< "$BR2_EXTERNAL_INFIX_PATH/board/common/qemu/Config.in" \
|
||||
> "$BINARIES_DIR/Config.in"
|
||||
rm -f "$BINARIES_DIR/qemu.cfg"
|
||||
CONFIG_="CONFIG_" BR2_CONFIG="$BINARIES_DIR/qemu.cfg" \
|
||||
"$O/build/buildroot-config/conf" --olddefconfig "$BINARIES_DIR/Config.in"
|
||||
rm -f "$BINARIES_DIR/qemu.cfg.old" "$BINARIES_DIR/.config.old"
|
||||
|
||||
@@ -1,12 +1,23 @@
|
||||
#!/bin/sh
|
||||
common=$(dirname "$(readlink -f "$0")")
|
||||
. $common/lib.sh
|
||||
# shellcheck disable=SC2086
|
||||
|
||||
common=$(dirname "$(readlink -f "$0")")
|
||||
. "$common/lib.sh"
|
||||
|
||||
# shellcheck disable=SC1091
|
||||
. "$TARGET_DIR/etc/os-release"
|
||||
|
||||
load_cfg INFIX_ID
|
||||
load_cfg BR2_ARCH
|
||||
load_cfg BR2_DEFCONFIG
|
||||
load_cfg BR2_EXTERNAL_INFIX_PATH
|
||||
load_cfg BR2_TARGET_ROOTFS
|
||||
NAME=infix-$(basename "$BR2_DEFCONFIG" _defconfig | tr _ - | sed 's/x86-64/x86_64/')
|
||||
if [ -n "$IMAGE_ID" ]; then
|
||||
NAME="$IMAGE_ID"
|
||||
else
|
||||
NAME="$INFIX_ID"-$(echo "$BR2_ARCH" | tr _ - | sed 's/x86-64/x86_64/')
|
||||
fi
|
||||
diskimg=disk.img
|
||||
|
||||
ver()
|
||||
{
|
||||
@@ -31,7 +42,7 @@ fi
|
||||
load_cfg DISK_IMAGE
|
||||
if [ "$DISK_IMAGE" = "y" ]; then
|
||||
ixmsg "Creating Disk Image"
|
||||
|
||||
diskimg="${NAME}-disk.img"
|
||||
bootcfg=
|
||||
if [ "$DISK_IMAGE_BOOT_DATA" ]; then
|
||||
bootcfg="-b $DISK_IMAGE_BOOT_DATA -B $DISK_IMAGE_BOOT_OFFSET"
|
||||
@@ -44,16 +55,15 @@ if [ "$DISK_IMAGE" = "y" ]; then
|
||||
[ -f "$archive" ] || wget -O"$archive" "$DISK_IMAGE_RELEASE_URL"
|
||||
tar -xa --strip-components=1 -C "$BINARIES_DIR" -f "$archive"
|
||||
fi
|
||||
|
||||
$common/mkrauc-status.sh "$BINARIES_DIR/${NAME}.pkg" >"$BINARIES_DIR/rauc.status"
|
||||
$common/mkdisk.sh -a $BR2_ARCH -s $DISK_IMAGE_SIZE $bootcfg
|
||||
$common/mkdisk.sh -a $BR2_ARCH -n $diskimg -s $DISK_IMAGE_SIZE $bootcfg
|
||||
fi
|
||||
|
||||
load_cfg GNS3_APPLIANCE
|
||||
if [ "$GNS3_APPLIANCE" = "y" ]; then
|
||||
load_cfg GNS3_APPLIANCE_RAM
|
||||
load_cfg GNS3_APPLIANCE_IFNUM
|
||||
ixmsg "Creating GNS3 Appliance, $GNS3_APPLIANCE_RAM MiB with $GNS3_APPLIANCE_IFNUM ports"
|
||||
$common/mkgns3a.sh $NAME $GNS3_APPLIANCE_RAM $GNS3_APPLIANCE_IFNUM
|
||||
$common/mkgns3a.sh $BR2_ARCH $NAME $diskimg $GNS3_APPLIANCE_RAM $GNS3_APPLIANCE_IFNUM
|
||||
fi
|
||||
|
||||
load_cfg FIT_IMAGE
|
||||
@@ -73,3 +83,14 @@ if [ "$BR2_TARGET_ROOTFS_SQUASHFS" = "y" ]; then
|
||||
ln -sf "$BINARIES_DIR/${NAME}${rel}.img" "$BINARIES_DIR/${NAME}.img"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Menuconfig support for modifying Qemu args in release tarballs
|
||||
cp "$BR2_EXTERNAL_INFIX_PATH/board/common/qemu/qemu.sh" "$BINARIES_DIR/"
|
||||
sed -e "s/@ARCH@/QEMU_$BR2_ARCH/" \
|
||||
-e "s/@DISK_IMG@/$diskimg/" \
|
||||
< "$BR2_EXTERNAL_INFIX_PATH/board/common/qemu/Config.in.in" \
|
||||
> "$BINARIES_DIR/Config.in"
|
||||
rm -f "$BINARIES_DIR/qemu.cfg"
|
||||
CONFIG_="CONFIG_" BR2_CONFIG="$BINARIES_DIR/qemu.cfg" \
|
||||
"$O/build/buildroot-config/conf" --olddefconfig "$BINARIES_DIR/Config.in"
|
||||
rm -f "$BINARIES_DIR/qemu.cfg.old" "$BINARIES_DIR/.config.old"
|
||||
|
||||
@@ -2,7 +2,7 @@ mainmenu "QEMU Virtualization"
|
||||
|
||||
choice
|
||||
prompt "Target Architecture"
|
||||
default QEMU_aarch64
|
||||
default @ARCH@
|
||||
|
||||
config QEMU_x86_64
|
||||
bool "x86_64"
|
||||
@@ -64,7 +64,7 @@ endchoice
|
||||
config QEMU_MACHINE
|
||||
string
|
||||
default "qemu-system-aarch64 -M virt -cpu cortex-a72 -m 256M" if QEMU_aarch64
|
||||
default "qemu-system-x86_64 -M q35,accel=kvm -cpu host -m 512M" if QEMU_x86_64
|
||||
default "qemu-system-x86_64 -M q35,accel=kvm -cpu host -m 256M" if QEMU_x86_64
|
||||
|
||||
config QEMU_KERNEL
|
||||
string
|
||||
@@ -80,7 +80,7 @@ config QEMU_BIOS
|
||||
|
||||
config QEMU_ROOTFS
|
||||
string
|
||||
default "disk.img" if !QEMU_ROOTFS_INITRD
|
||||
default "@DISK_IMG@" if !QEMU_ROOTFS_INITRD
|
||||
default "rootfs.squashfs" if QEMU_ROOTFS_INITRD
|
||||
|
||||
config QEMU_DTB_EXTEND
|
||||
@@ -1,2 +1,3 @@
|
||||
run [S] /lib/infix/sysctl-sync-ip-conf --
|
||||
run [S] /lib/infix/nameif -- Probing network interfaces
|
||||
run [S] /lib/infix/probe -- Probing system information
|
||||
run [S] <pid/syslogd> /lib/infix/sysctl-sync-ip-conf --
|
||||
run [S] <pid/syslogd> /lib/infix/nameif -- Probing network interfaces
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
task [S] /lib/infix/ssh-hostkeys --
|
||||
service [2345789] <usr/ssh-hostkeys> /usr/sbin/sshd -D -- OpenSSH daemon
|
||||
@@ -0,0 +1,5 @@
|
||||
# Override Finit plugin
|
||||
service cgroup.system name:dbus pid:!/run/messagebus.pid <pid/syslogd> \
|
||||
[S123456789] /usr/bin/dbus-daemon --nofork --system --syslog-only \
|
||||
-- D-Bus message bus daemon
|
||||
|
||||
@@ -11,6 +11,7 @@ alias view='vi -R'
|
||||
alias emacs='mg'
|
||||
alias sensible-editor=edit
|
||||
alias sensible-pager=pager
|
||||
alias hd="hexdump -C"
|
||||
|
||||
alias ip='ip --color=auto'
|
||||
alias ipb='ip -br'
|
||||
@@ -18,4 +19,6 @@ alias ipaddr='ip addr'
|
||||
alias iplink='ip link'
|
||||
alias bridge='bridge --color=auto'
|
||||
|
||||
alias llping='ping -L ff02::1 -I'
|
||||
|
||||
alias docker=podman
|
||||
|
||||
@@ -30,7 +30,9 @@ for netif in /sys/class/net/*; do
|
||||
done
|
||||
|
||||
# Find and mark all switch ports
|
||||
ports=$(devlink port 2>/dev/null | awk '/flavour physical/{print $5}')
|
||||
ports=$(devlink -j port | jq -r '.port[]
|
||||
| select(.flavour == "physical")
|
||||
| .netdev')
|
||||
for iface in $ports; do
|
||||
ip link set "$iface" group port
|
||||
done
|
||||
|
||||
Executable
+6
@@ -0,0 +1,6 @@
|
||||
#!/bin/sh
|
||||
# Probe for various types of harware features
|
||||
|
||||
if dmesg |grep -q QEMU || test -d /sys/module/qemu_fw_cfg; then
|
||||
initctl cond set qemu
|
||||
fi
|
||||
@@ -1,9 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
for type in ecdsa ed25519 rsa; do
|
||||
[ -f /var/lib/ssh/ssh_host_${type}_key ] \
|
||||
|| ssh-keygen -N "" -t $type -f /var/lib/ssh/ssh_host_${type}_key \
|
||||
|| exit 1
|
||||
done
|
||||
|
||||
initctl cond set ssh-hostkeys
|
||||
@@ -1,35 +0,0 @@
|
||||
#!/bin/sh
|
||||
set -e
|
||||
|
||||
PATH=/lib/infix/factory:$PATH
|
||||
|
||||
[ "$FACTORY_D" ] || FACTORY_D=/etc/auto-factory.d
|
||||
[ "$CFG_D" ] || CFG_D=/cfg
|
||||
[ "$GENCFG_D" ] || GENCFG_D=/cfg/factory.d
|
||||
mkdir -p $GENCFG_D
|
||||
|
||||
gen-hostname >$FACTORY_D/20-auto-hostname.json
|
||||
gen-interfaces >$FACTORY_D/20-auto-interfaces.json
|
||||
|
||||
[ -s $GENCFG_D/20-auto-hostkey.json ] || gen-hostkeys >$GENCFG_D/20-auto-hostkey.json
|
||||
|
||||
# Allow regenerating default factory-config, but keep it read-ony
|
||||
# to prevent it from being overwritten by mistake by users.
|
||||
rm -f $CFG_D/auto-factory-config.cfg
|
||||
# shellcheck disable=SC2046
|
||||
jq -s 'reduce .[] as $item ({}; . * $item)' \
|
||||
$(find $FACTORY_D -name '*.json') \
|
||||
$(find $GENCFG_D -name '*.json') \
|
||||
>$CFG_D/auto-factory-config.cfg
|
||||
chmod 444 $CFG_D/auto-factory-config.cfg
|
||||
|
||||
# TODO: Look for statically defined factory-config, based on the
|
||||
# system's product ID.
|
||||
|
||||
# If we haven't found a better one, settle for auto-factory-config as
|
||||
# the system's factory-config.
|
||||
[ -h $CFG_D/factory-config.cfg ] || \
|
||||
ln -sf auto-factory-config.cfg $CFG_D/factory-config.cfg
|
||||
|
||||
# Bootstrap sysrepo db with all modules required by confd
|
||||
/usr/libexec/confd/confd-bootstrap.sh $CFG_D/factory-config.cfg $CFG_D/startup-config.cfg
|
||||
@@ -95,8 +95,8 @@ class Iface:
|
||||
|
||||
def pr_proto_eth(self):
|
||||
row = f"{'ethernet':<{Pad.proto}}"
|
||||
dec = Decore.green if self.data['oper-status'] == "up" else Decore.red
|
||||
row += dec(f"{self.data['oper-status'].upper():<{Pad.state}}")
|
||||
dec = Decore.green if self.oper_status == "up" else Decore.red
|
||||
row += dec(f"{self.oper_status.upper():<{Pad.state}}")
|
||||
row += f"{self.data['phys-address']:<{Pad.data}}"
|
||||
print(row)
|
||||
|
||||
|
||||
@@ -1,43 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
gen_interface()
|
||||
{
|
||||
cat <<EOF
|
||||
,{
|
||||
"name": "$1",
|
||||
"type": "infix-if-type:ethernet",
|
||||
"ietf-ip:ipv6": {
|
||||
"enabled": true
|
||||
}
|
||||
}
|
||||
EOF
|
||||
}
|
||||
|
||||
phys_ifaces=$(ip -d -j link show | jq -r '
|
||||
.[] |
|
||||
select(.link_type == "ether") |
|
||||
select(.group != "internal") |
|
||||
select(has("parentbus")) |
|
||||
.ifname')
|
||||
|
||||
cat <<EOF
|
||||
{
|
||||
"ietf-interfaces:interfaces": {
|
||||
"interface": [
|
||||
{
|
||||
"name": "lo",
|
||||
"type": "infix-if-type:loopback",
|
||||
"ietf-ip:ipv4": {
|
||||
"address": [{ "ip": "127.0.0.1", "prefix-length": 8 }]
|
||||
},
|
||||
"ietf-ip:ipv6": {
|
||||
"address": [{ "ip": "::1", "prefix-length": 128 }]
|
||||
}
|
||||
}
|
||||
$(for iface in $phys_ifaces; do gen_interface $iface; done)
|
||||
]
|
||||
}
|
||||
}
|
||||
EOF
|
||||
+1
-1
Submodule buildroot updated: 87d737a123...b7cdb9b4b8
@@ -21,14 +21,19 @@ BR2_ROOTFS_OVERLAY="${BR2_EXTERNAL_INFIX_PATH}/board/common/rootfs ${BR2_EXTERNA
|
||||
BR2_ROOTFS_POST_BUILD_SCRIPT="${BR2_EXTERNAL_INFIX_PATH}/board/common/post-build.sh ${BR2_EXTERNAL_INFIX_PATH}/board/classic/post-build.sh"
|
||||
BR2_ROOTFS_POST_IMAGE_SCRIPT="${BR2_EXTERNAL_INFIX_PATH}/board/common/post-image.sh"
|
||||
BR2_LINUX_KERNEL=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.5.6"
|
||||
BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="${BR2_EXTERNAL_INFIX_PATH}/board/aarch64/linux_defconfig"
|
||||
BR2_LINUX_KERNEL_DTS_SUPPORT=y
|
||||
BR2_LINUX_KERNEL_INTREE_DTS_NAME="marvell/armada-3720-espressobin marvell/armada-3720-espressobin-emmc marvell/armada-3720-espressobin-v7 marvell/armada-3720-espressobin-v7-emmc marvell/armada-3720-espressobin-ultra marvell/cn9130-crb-A marvell/cn9130-crb-B sparx5_pcb135_emmc_no_psci"
|
||||
BR2_LINUX_KERNEL_CUSTOM_DTS_PATH="${BR2_EXTERNAL_INFIX_PATH}/board/aarch64/dts/microchip/sparx5_pcb135_emmc_no_psci.dts"
|
||||
BR2_LINUX_KERNEL_INTREE_DTS_NAME="alder/alder marvell/armada-3720-espressobin marvell/armada-3720-espressobin-emmc marvell/armada-3720-espressobin-v7 marvell/armada-3720-espressobin-v7-emmc marvell/armada-3720-espressobin-ultra marvell/cn9130-crb-A marvell/cn9130-crb-B microchip/sparx5_pcb135_emmc_no_psci"
|
||||
BR2_LINUX_KERNEL_CUSTOM_DTS_OVERLAY="${BR2_EXTERNAL_INFIX_PATH}/board/aarch64/dts"
|
||||
BR2_LINUX_KERNEL_DTB_KEEP_DIRNAME=y
|
||||
BR2_LINUX_KERNEL_INSTALL_TARGET=y
|
||||
BR2_PACKAGE_BUSYBOX_CONFIG="${BR2_EXTERNAL_INFIX_PATH}/board/common/busybox_defconfig"
|
||||
BR2_PACKAGE_BUSYBOX_SHOW_OTHERS=y
|
||||
BR2_PACKAGE_STRACE=y
|
||||
BR2_PACKAGE_STRESS_NG=y
|
||||
BR2_PACKAGE_JQ=y
|
||||
BR2_PACKAGE_MDIO_TOOLS=y
|
||||
BR2_PACKAGE_RNG_TOOLS=y
|
||||
@@ -44,6 +49,7 @@ BR2_PACKAGE_AVAHI=y
|
||||
# BR2_PACKAGE_AVAHI_AUTOIPD is not set
|
||||
BR2_PACKAGE_AVAHI_DAEMON=y
|
||||
BR2_PACKAGE_AVAHI_DEFAULT_SERVICES=y
|
||||
BR2_PACKAGE_CHRONY=y
|
||||
BR2_PACKAGE_DHCPCD=y
|
||||
BR2_PACKAGE_DNSMASQ=y
|
||||
BR2_PACKAGE_DROPBEAR=y
|
||||
@@ -67,7 +73,6 @@ BR2_PACKAGE_NMAP_NMAP=y
|
||||
BR2_PACKAGE_NMAP_NPING=y
|
||||
BR2_PACKAGE_OPENRESOLV=y
|
||||
BR2_PACKAGE_SOCAT=y
|
||||
BR2_PACKAGE_SSDP_RESPONDER=y
|
||||
BR2_PACKAGE_TCPDUMP=y
|
||||
BR2_PACKAGE_TRACEROUTE=y
|
||||
BR2_PACKAGE_DIALOG=y
|
||||
@@ -94,6 +99,10 @@ BR2_PACKAGE_HOST_RAUC=y
|
||||
BR2_PACKAGE_HOST_UBOOT_TOOLS=y
|
||||
BR2_PACKAGE_HOST_UBOOT_TOOLS_FIT_SUPPORT=y
|
||||
BR2_PACKAGE_HOST_UBOOT_TOOLS_FIT_SIGNATURE_SUPPORT=y
|
||||
INFIX_VENDOR_HOME="https://github.com/kernelkit"
|
||||
INFIX_DESC="Infix is a Network Operating System based on Linux. It can be set up both as a switch, with offloading using switchdev, and a router with firewalling."
|
||||
INFIX_HOME="https://github.com/kernelkit/infix/"
|
||||
INFIX_DOC="https://github.com/kernelkit/infix/tree/main/doc"
|
||||
INFIX_VARIANT_CLASSIC=y
|
||||
BR2_PACKAGE_FACTORY=y
|
||||
BR2_PACKAGE_FINIT_SULOGIN=y
|
||||
|
||||
@@ -13,7 +13,6 @@ BR2_TARGET_GENERIC_ISSUE="Infix by KernelKit"
|
||||
BR2_INIT_FINIT=y
|
||||
BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_EUDEV=y
|
||||
BR2_ROOTFS_DEVICE_TABLE="system/device_table.txt ${BR2_EXTERNAL_INFIX_PATH}/board/common/xattrs ${BR2_EXTERNAL_INFIX_PATH}/board/netconf/xattrs"
|
||||
BR2_SYSTEM_BIN_SH_BASH=y
|
||||
BR2_TARGET_GENERIC_GETTY_TERM="xterm"
|
||||
BR2_SYSTEM_DHCP="eth0"
|
||||
BR2_ENABLE_LOCALE_WHITELIST="C en_US en_CA"
|
||||
@@ -23,11 +22,13 @@ BR2_ROOTFS_OVERLAY="${BR2_EXTERNAL_INFIX_PATH}/board/common/rootfs ${BR2_EXTERNA
|
||||
BR2_ROOTFS_POST_BUILD_SCRIPT="${BR2_EXTERNAL_INFIX_PATH}/board/common/post-build.sh ${BR2_EXTERNAL_INFIX_PATH}/board/netconf/post-build.sh"
|
||||
BR2_ROOTFS_POST_IMAGE_SCRIPT="${BR2_EXTERNAL_INFIX_PATH}/board/common/post-image.sh"
|
||||
BR2_LINUX_KERNEL=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.5.6"
|
||||
BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="${BR2_EXTERNAL_INFIX_PATH}/board/aarch64/linux_defconfig"
|
||||
BR2_LINUX_KERNEL_DTS_SUPPORT=y
|
||||
BR2_LINUX_KERNEL_INTREE_DTS_NAME="marvell/armada-3720-espressobin marvell/armada-3720-espressobin-emmc marvell/armada-3720-espressobin-v7 marvell/armada-3720-espressobin-v7-emmc marvell/armada-3720-espressobin-ultra marvell/cn9130-crb-A marvell/cn9130-crb-B sparx5_pcb135_emmc_no_psci"
|
||||
BR2_LINUX_KERNEL_CUSTOM_DTS_PATH="${BR2_EXTERNAL_INFIX_PATH}/board/aarch64/dts/microchip/sparx5_pcb135_emmc_no_psci.dts"
|
||||
BR2_LINUX_KERNEL_INTREE_DTS_NAME="alder/alder marvell/armada-3720-espressobin marvell/armada-3720-espressobin-emmc marvell/armada-3720-espressobin-v7 marvell/armada-3720-espressobin-v7-emmc marvell/armada-3720-espressobin-ultra marvell/cn9130-crb-A marvell/cn9130-crb-B microchip/sparx5_pcb135_emmc_no_psci"
|
||||
BR2_LINUX_KERNEL_CUSTOM_DTS_OVERLAY="${BR2_EXTERNAL_INFIX_PATH}/board/aarch64/dts"
|
||||
BR2_LINUX_KERNEL_DTB_KEEP_DIRNAME=y
|
||||
BR2_LINUX_KERNEL_INSTALL_TARGET=y
|
||||
BR2_PACKAGE_BUSYBOX_CONFIG="${BR2_EXTERNAL_INFIX_PATH}/board/common/busybox_defconfig"
|
||||
@@ -35,17 +36,18 @@ BR2_PACKAGE_BUSYBOX_SHOW_OTHERS=y
|
||||
BR2_PACKAGE_STRACE=y
|
||||
BR2_PACKAGE_STRESS_NG=y
|
||||
BR2_PACKAGE_JQ=y
|
||||
BR2_PACKAGE_MDIO_TOOLS=y
|
||||
BR2_PACKAGE_DBUS_CXX=y
|
||||
BR2_PACKAGE_DBUS_GLIB=y
|
||||
BR2_PACKAGE_DBUS_TRIGGERD=y
|
||||
BR2_PACKAGE_EUDEV_RULES_GEN=y
|
||||
# BR2_PACKAGE_EUDEV_ENABLE_HWDB is not set
|
||||
BR2_PACKAGE_MDIO_TOOLS=y
|
||||
BR2_PACKAGE_RNG_TOOLS=y
|
||||
BR2_PACKAGE_UBOOT_TOOLS=y
|
||||
BR2_PACKAGE_UBOOT_TOOLS_FIT_SUPPORT=y
|
||||
BR2_PACKAGE_UBOOT_TOOLS_FIT_SIGNATURE_SUPPORT=y
|
||||
BR2_PACKAGE_UBOOT_TOOLS_FIT_CHECK_SIGN=y
|
||||
BR2_PACKAGE_PYTHON3=y
|
||||
BR2_PACKAGE_CA_CERTIFICATES=y
|
||||
BR2_PACKAGE_LIBOPENSSL_BIN=y
|
||||
BR2_PACKAGE_LIBCURL_CURL=y
|
||||
@@ -76,7 +78,6 @@ BR2_PACKAGE_NMAP_NPING=y
|
||||
BR2_PACKAGE_OPENRESOLV=y
|
||||
BR2_PACKAGE_OPENSSH=y
|
||||
BR2_PACKAGE_SOCAT=y
|
||||
BR2_PACKAGE_SSDP_RESPONDER=y
|
||||
BR2_PACKAGE_TCPDUMP=y
|
||||
BR2_PACKAGE_TRACEROUTE=y
|
||||
BR2_PACKAGE_ULOGD=y
|
||||
@@ -104,23 +105,25 @@ BR2_PACKAGE_HOST_RAUC=y
|
||||
BR2_PACKAGE_HOST_UBOOT_TOOLS=y
|
||||
BR2_PACKAGE_HOST_UBOOT_TOOLS_FIT_SUPPORT=y
|
||||
BR2_PACKAGE_HOST_UBOOT_TOOLS_FIT_SIGNATURE_SUPPORT=y
|
||||
INFIX_VENDOR_HOME="https://github.com/kernelkit"
|
||||
INFIX_DESC="Infix is a Network Operating System based on Linux. It can be set up both as a switch, with offloading using switchdev, and a router with firewalling."
|
||||
INFIX_HOME="https://github.com/kernelkit/infix"
|
||||
INFIX_DOC="https://github.com/kernelkit/infix/tree/main/doc"
|
||||
INFIX_SUPPORT="mailto:kernelkit@googlegroups.com"
|
||||
BR2_PACKAGE_CONFD=y
|
||||
BR2_PACKAGE_STATD=y
|
||||
BR2_PACKAGE_FACTORY=y
|
||||
BR2_PACKAGE_FINIT_SULOGIN=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_HOTPLUG=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_HOOK_SCRIPTS=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_MODULES_LOAD=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_MODPROBE=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_RTC=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_TTY=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_URANDOM=y
|
||||
BR2_PACKAGE_KLISH_PLUGIN_INFIX=y
|
||||
BR2_PACKAGE_LOWDOWN=y
|
||||
BR2_PACKAGE_NET=y
|
||||
BR2_PACKAGE_PYTHON3=y
|
||||
BR2_PACKAGE_PYTHON3_PYC_ONLY=y
|
||||
BR2_PACKAGE_TETRIS=y
|
||||
BR2_PACKAGE_QUERIERD=y
|
||||
DISK_IMAGE_BOOT_BIN=y
|
||||
GNS3_APPLIANCE_RAM=512
|
||||
GNS3_APPLIANCE_IFNUM=10
|
||||
|
||||
@@ -20,6 +20,8 @@ BR2_ROOTFS_OVERLAY="${BR2_EXTERNAL_INFIX_PATH}/board/common/rootfs ${BR2_EXTERNA
|
||||
BR2_ROOTFS_POST_BUILD_SCRIPT="board/qemu/x86_64/post-build.sh ${BR2_EXTERNAL_INFIX_PATH}/board/common/post-build.sh ${BR2_EXTERNAL_INFIX_PATH}/board/common/post-build.sh ${BR2_EXTERNAL_INFIX_PATH}/board/classic/post-build.sh"
|
||||
BR2_ROOTFS_POST_IMAGE_SCRIPT="${BR2_EXTERNAL_INFIX_PATH}/board/common/post-image.sh"
|
||||
BR2_LINUX_KERNEL=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.5.6"
|
||||
BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="${BR2_EXTERNAL_INFIX_PATH}/board/x86_64/linux_defconfig"
|
||||
BR2_LINUX_KERNEL_INSTALL_TARGET=y
|
||||
@@ -63,7 +65,6 @@ BR2_PACKAGE_NMAP_NMAP=y
|
||||
BR2_PACKAGE_NMAP_NPING=y
|
||||
BR2_PACKAGE_OPENRESOLV=y
|
||||
BR2_PACKAGE_SOCAT=y
|
||||
BR2_PACKAGE_SSDP_RESPONDER=y
|
||||
BR2_PACKAGE_TCPDUMP=y
|
||||
BR2_PACKAGE_TRACEROUTE=y
|
||||
BR2_PACKAGE_DIALOG=y
|
||||
@@ -98,6 +99,10 @@ BR2_PACKAGE_HOST_RAUC=y
|
||||
BR2_PACKAGE_HOST_UBOOT_TOOLS=y
|
||||
BR2_PACKAGE_HOST_UBOOT_TOOLS_FIT_SUPPORT=y
|
||||
BR2_PACKAGE_HOST_UBOOT_TOOLS_FIT_SIGNATURE_SUPPORT=y
|
||||
INFIX_VENDOR_HOME="https://github.com/kernelkit"
|
||||
INFIX_DESC="Infix is a Network Operating System based on Linux. It can be set up both as a switch, with offloading using switchdev, and a router with firewalling."
|
||||
INFIX_HOME="https://github.com/kernelkit/infix/"
|
||||
INFIX_DOC="https://github.com/kernelkit/infix/tree/main/doc"
|
||||
INFIX_VARIANT_CLASSIC=y
|
||||
BR2_PACKAGE_FACTORY=y
|
||||
BR2_PACKAGE_FINIT_SULOGIN=y
|
||||
@@ -110,3 +115,4 @@ BR2_PACKAGE_FINIT_PLUGIN_TTY=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_URANDOM=y
|
||||
BR2_PACKAGE_IFUPDOWN_NG=y
|
||||
BR2_PACKAGE_TETRIS=y
|
||||
DISK_IMAGE_BOOT_BIN=y
|
||||
@@ -12,7 +12,6 @@ BR2_TARGET_GENERIC_ISSUE="Infix by KernelKit"
|
||||
BR2_INIT_FINIT=y
|
||||
BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_EUDEV=y
|
||||
BR2_ROOTFS_DEVICE_TABLE="system/device_table.txt ${BR2_EXTERNAL_INFIX_PATH}/board/common/xattrs ${BR2_EXTERNAL_INFIX_PATH}/board/netconf/xattrs"
|
||||
BR2_SYSTEM_BIN_SH_BASH=y
|
||||
BR2_TARGET_GENERIC_GETTY_TERM="xterm"
|
||||
BR2_SYSTEM_DHCP="eth0"
|
||||
BR2_ENABLE_LOCALE_WHITELIST="C en_US en_CA"
|
||||
@@ -22,6 +21,8 @@ BR2_ROOTFS_OVERLAY="${BR2_EXTERNAL_INFIX_PATH}/board/common/rootfs ${BR2_EXTERNA
|
||||
BR2_ROOTFS_POST_BUILD_SCRIPT="board/qemu/x86_64/post-build.sh ${BR2_EXTERNAL_INFIX_PATH}/board/common/post-build.sh ${BR2_EXTERNAL_INFIX_PATH}/board/netconf/post-build.sh"
|
||||
BR2_ROOTFS_POST_IMAGE_SCRIPT="${BR2_EXTERNAL_INFIX_PATH}/board/common/post-image.sh"
|
||||
BR2_LINUX_KERNEL=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.5.6"
|
||||
BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="${BR2_EXTERNAL_INFIX_PATH}/board/x86_64/linux_defconfig"
|
||||
BR2_LINUX_KERNEL_INSTALL_TARGET=y
|
||||
@@ -42,6 +43,7 @@ BR2_PACKAGE_UBOOT_TOOLS=y
|
||||
BR2_PACKAGE_UBOOT_TOOLS_FIT_SUPPORT=y
|
||||
BR2_PACKAGE_UBOOT_TOOLS_FIT_SIGNATURE_SUPPORT=y
|
||||
BR2_PACKAGE_UBOOT_TOOLS_FIT_CHECK_SIGN=y
|
||||
BR2_PACKAGE_PYTHON3=y
|
||||
BR2_PACKAGE_CA_CERTIFICATES=y
|
||||
BR2_PACKAGE_LIBOPENSSL_BIN=y
|
||||
BR2_PACKAGE_LIBCURL_CURL=y
|
||||
@@ -72,7 +74,6 @@ BR2_PACKAGE_NMAP_NPING=y
|
||||
BR2_PACKAGE_OPENRESOLV=y
|
||||
BR2_PACKAGE_OPENSSH=y
|
||||
BR2_PACKAGE_SOCAT=y
|
||||
BR2_PACKAGE_SSDP_RESPONDER=y
|
||||
BR2_PACKAGE_TCPDUMP=y
|
||||
BR2_PACKAGE_TRACEROUTE=y
|
||||
BR2_PACKAGE_ULOGD=y
|
||||
@@ -108,22 +109,23 @@ BR2_PACKAGE_HOST_RAUC=y
|
||||
BR2_PACKAGE_HOST_UBOOT_TOOLS=y
|
||||
BR2_PACKAGE_HOST_UBOOT_TOOLS_FIT_SUPPORT=y
|
||||
BR2_PACKAGE_HOST_UBOOT_TOOLS_FIT_SIGNATURE_SUPPORT=y
|
||||
INFIX_VENDOR_HOME="https://github.com/kernelkit"
|
||||
INFIX_DESC="Infix is a Network Operating System based on Linux. It can be set up both as a switch, with offloading using switchdev, and a router with firewalling."
|
||||
INFIX_HOME="https://github.com/kernelkit/infix/"
|
||||
INFIX_DOC="https://github.com/kernelkit/infix/tree/main/doc"
|
||||
INFIX_SUPPORT="mailto:kernelkit@googlegroups.com"
|
||||
BR2_PACKAGE_CONFD=y
|
||||
BR2_PACKAGE_STATD=y
|
||||
BR2_PACKAGE_FACTORY=y
|
||||
BR2_PACKAGE_FINIT_SULOGIN=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_HOTPLUG=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_HOOK_SCRIPTS=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_MODULES_LOAD=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_MODPROBE=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_RTC=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_TTY=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_URANDOM=y
|
||||
BR2_PACKAGE_KLISH_PLUGIN_INFIX=y
|
||||
BR2_PACKAGE_LOWDOWN=y
|
||||
BR2_PACKAGE_NET=y
|
||||
BR2_PACKAGE_PYTHON3=y
|
||||
BR2_PACKAGE_PYTHON3_PYC_ONLY=y
|
||||
BR2_PACKAGE_TETRIS=y
|
||||
BR2_PACKAGE_QUERIERD=y
|
||||
GNS3_APPLIANCE_RAM=512
|
||||
|
||||
@@ -12,7 +12,6 @@ BR2_TARGET_GENERIC_ISSUE="Minfix by KernelKit"
|
||||
BR2_INIT_FINIT=y
|
||||
BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_EUDEV=y
|
||||
BR2_ROOTFS_DEVICE_TABLE="system/device_table.txt ${BR2_EXTERNAL_INFIX_PATH}/board/common/xattrs ${BR2_EXTERNAL_INFIX_PATH}/board/netconf/xattrs"
|
||||
BR2_SYSTEM_BIN_SH_BASH=y
|
||||
BR2_TARGET_GENERIC_GETTY_TERM="xterm"
|
||||
BR2_SYSTEM_DHCP="eth0"
|
||||
BR2_ENABLE_LOCALE_WHITELIST="C en_US en_CA"
|
||||
@@ -22,6 +21,8 @@ BR2_ROOTFS_OVERLAY="${BR2_EXTERNAL_INFIX_PATH}/board/common/rootfs ${BR2_EXTERNA
|
||||
BR2_ROOTFS_POST_BUILD_SCRIPT="board/qemu/x86_64/post-build.sh ${BR2_EXTERNAL_INFIX_PATH}/board/common/post-build.sh ${BR2_EXTERNAL_INFIX_PATH}/board/netconf/post-build.sh"
|
||||
BR2_ROOTFS_POST_IMAGE_SCRIPT="${BR2_EXTERNAL_INFIX_PATH}/board/common/post-image.sh"
|
||||
BR2_LINUX_KERNEL=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.5.6"
|
||||
BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="${BR2_EXTERNAL_INFIX_PATH}/board/x86_64/linux_defconfig"
|
||||
BR2_LINUX_KERNEL_INSTALL_TARGET=y
|
||||
@@ -49,11 +50,13 @@ BR2_PACKAGE_ETHTOOL=y
|
||||
BR2_PACKAGE_LLDPD=y
|
||||
BR2_PACKAGE_OPENRESOLV=y
|
||||
BR2_PACKAGE_OPENSSH=y
|
||||
BR2_PACKAGE_SSDP_RESPONDER=y
|
||||
BR2_PACKAGE_TCPDUMP=y
|
||||
BR2_PACKAGE_KMOD_TOOLS=y
|
||||
BR2_PACKAGE_BASH_COMPLETION=y
|
||||
BR2_PACKAGE_PWGEN=y
|
||||
BR2_PACKAGE_SYSKLOGD=y
|
||||
BR2_PACKAGE_SYSKLOGD_LOGGER=y
|
||||
BR2_PACKAGE_LESS=y
|
||||
BR2_TARGET_ROOTFS_SQUASHFS=y
|
||||
# BR2_TARGET_ROOTFS_TAR is not set
|
||||
BR2_PACKAGE_CONFD=y
|
||||
@@ -63,11 +66,12 @@ BR2_PACKAGE_FINIT_SULOGIN=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_HOTPLUG=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_HOOK_SCRIPTS=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_MODULES_LOAD=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_MODPROBE=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_RTC=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_TTY=y
|
||||
BR2_PACKAGE_FINIT_PLUGIN_URANDOM=y
|
||||
BR2_PACKAGE_KLISH_PLUGIN_INFIX=y
|
||||
BR2_PACKAGE_NET=y
|
||||
BR2_PACKAGE_PYTHON3=y
|
||||
BR2_PACKAGE_PYTHON3_PYC_ONLY=y
|
||||
# SIGN_ENABLED is not set
|
||||
# GNS3_APPLIANCE is not set
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
* TODO doc: User Guide
|
||||
|
||||
- Feature set and scope, e.g.
|
||||
- Device discovery: SSDP, LLDP, mDNS-SD how do they work, interfacing with Windows/macOS/Linux
|
||||
- Device discovery: LLDP, mDNS-SD how do they work, interfacing with Windows/macOS/Linux
|
||||
- Network redundancy protocols: STP/RSTP, MRP
|
||||
- Configuring the system; using ifupdown2, enabling/disabling services
|
||||
- Diagnosing the system; using rmon, port mirroring, debugging services, searching logs
|
||||
|
||||
+124
@@ -0,0 +1,124 @@
|
||||
Branding & Releases
|
||||
===================
|
||||
|
||||
This document is for projects using Infix as a br2-external, i.e., OEMs.
|
||||
|
||||
|
||||
Branding
|
||||
--------
|
||||
|
||||
Branding is done in menuconfig, there are several settings affecting
|
||||
it, most are in the Infix external subsection called "Branding", but
|
||||
there is also `BR2_TARGET_GENERIC_HOSTNAME`, which deserves a
|
||||
special mention.
|
||||
|
||||
The hostname is used for the system default `/etc/hostname`, which
|
||||
is the base name for the "unique:ified" hostname + the last three
|
||||
octets of the base MAC[^1] address, e.g., `infix-c0-ff-ee`. This in
|
||||
turn is the hostname that is set at first boot and also advertised
|
||||
by device discovery protocols like mDNS-SD and LLDP.
|
||||
|
||||
See the help texts for the *Infix Branding* settings to understand
|
||||
which ones are mandatory and which are optional, menuconfig does not
|
||||
check this for you and you may end up with odd results.
|
||||
|
||||
Verify the result after a build by inspecting:
|
||||
|
||||
- `output/images/*`: names, missing prefix, etc.
|
||||
- `output/target/etc/os-release`: this file is sourced by
|
||||
other build scripts, e.g., `mkgns3a.sh`. For reference, see
|
||||
https://www.freedesktop.org/software/systemd/man/os-release.html
|
||||
|
||||
> **Note:** to get proper GIT revision (hash) from your composed OS,
|
||||
> remember in menuconfig to set `INFIX_OEM_PATH`. When unset the
|
||||
> Infix `post-build.sh` script defaults to the Infix base path. The
|
||||
> revision is stored in the file `/etc/os-release` as BUILD_ID and
|
||||
> is also in the file `/etc/version`. See below for more info.
|
||||
|
||||
[^1]: The base MAC address is defined in the device's Vital Product
|
||||
Data (VPD) EEPROM, or similar, which is used by the kernel to
|
||||
create the system interfaces. This MAC address is usually also
|
||||
printed on a label on the device.
|
||||
|
||||
|
||||
Integration
|
||||
-----------
|
||||
|
||||
When integrating your software stack with Infix there may be protocols
|
||||
that want to change system settings like hostname and dynamically set
|
||||
IP address and default gateway, e.g. PROFINET. This section detail a
|
||||
few recommendations for maintaining co-existence in this scenario of
|
||||
the multiple producers problem.
|
||||
|
||||
First, there's a clear difference between "singleton" like hostsname
|
||||
and an interface IP address. Consider the case of a static IP and a
|
||||
DHCP assigned IP, these can co-exist because of the `proto NUM` field
|
||||
available in iproute2. This is used in Infix so that static addresses
|
||||
can be flushed independently of DHCP addresses. The same can be done
|
||||
by other "address providers", e.g., PROFINET.
|
||||
|
||||
Changing properties like hostname should be done by injecting a change
|
||||
into Infix, by for example calling `sysrepocfg -Ediff.xml`. Here is an
|
||||
example of how to get the current hostname and apply an XML diff:
|
||||
|
||||
```
|
||||
root@infix-00-00-00:~# sysrepocfg -X -x "/system/hostname" > hostnm.xml
|
||||
root@infix-00-00-00:~# cat hostnm.xml
|
||||
<system xmlns="urn:ietf:params:xml:ns:yang:ietf-system">
|
||||
<hostname>infix-00-00-00</hostname>
|
||||
</system>
|
||||
root@infix-00-00-00:~# edit hostnm.xml
|
||||
root@infix-00-00-00:~# sysrepocfg -Ehostnm.xml
|
||||
root@example:~#
|
||||
```
|
||||
|
||||
Second, perform all changes on `running-config`, the running datastore.
|
||||
That way you have a clear state to return to if your application needs
|
||||
to do a factory reset. E.g., in PROFINET a type 1/2 factory reset will
|
||||
reset only the PROFINET specific settings. That way you can actually
|
||||
have your system `startup-config` disable all physical ports and the
|
||||
PROFINET application enables only ports that are not deactivated. (On
|
||||
factory reset it will not know of any ports to deactivate so it will
|
||||
activate all.)
|
||||
|
||||
You can consider the system composed of two entities:
|
||||
|
||||
- NETCONF starts up the system using `startup-config`, then
|
||||
- Hands over control to your application at runtime
|
||||
|
||||
Infix is prepared for this by already having two "runlevels" for these
|
||||
two states. The `startup-config` is applied in runlevel S (bootstrap)
|
||||
and the system then enters runlevel 2 for normal operation.
|
||||
|
||||
This allow you to keep a set of functionality that is provided by the
|
||||
underlying system, and another managed by your application. You can
|
||||
of course in your br2-external provide a sysrepo plugin that block
|
||||
operations on certain datastores when your application is enabled.
|
||||
E.g., to prevent changes to startup after initial deployment. In
|
||||
that case a proper factory reset would be needed to get back to a
|
||||
"pre-deployment" state where you can reconfigure your baseline.
|
||||
|
||||
|
||||
Releases
|
||||
--------
|
||||
|
||||
A release build requires the global variable `INFIX_RELEASE` to be set.
|
||||
It can be derived from GIT, if the source tree is kept in GIT VCS.
|
||||
|
||||
### `INFIX_RELEASE`
|
||||
|
||||
This global variable **must be** a lower-case string (no spaces or
|
||||
other characters outside of 0–9, a–z, '.', '_' and '-') identifying
|
||||
the operating system version, excluding any OS name information or
|
||||
release code name, and suitable for processing by scripts or usage
|
||||
in generated filenames.
|
||||
|
||||
Used for `VERSION` and `VERSION_ID` in `/etc/os-release` and
|
||||
generated file names like disk images, etc.
|
||||
|
||||
**Default:** generated using `git describe --always --dirty --tags`,
|
||||
with an additional `-C $infix_path`. This variable defaults to the
|
||||
Infix tree and can be changed by setting the menuconfig branding
|
||||
variable `INFIX_OEM_PATH` to that of the br2-external. It is also
|
||||
possible to set the `GIT_VERSION` variable in your `post-build.sh`
|
||||
script to change how the VCS version is extracted.
|
||||
+3
-28
@@ -41,8 +41,9 @@ admin@infix-00-00-00:~$
|
||||
|
||||
## Discovery mechanisms available in Infix
|
||||
|
||||
Infix advertises its presence via the [mDNS](#mdns) and [SSDP](#ssdp) discovery
|
||||
protocols in addition to [LLDP](#lldp).
|
||||
Infix advertises its presence via the [mDNS](#mdns) and [LLDP](#lldp)
|
||||
discovery protocols.
|
||||
|
||||
|
||||
### LLDP
|
||||
|
||||
@@ -173,29 +174,3 @@ linux-pc:#
|
||||
[^2]: [mdns-scan](http://0pointer.de/lennart/projects/mdns-scan/): a
|
||||
tool for scanning for mDNS/DNS-SD published services on the local
|
||||
network
|
||||
|
||||
### SSDP
|
||||
|
||||
For Windows clients, Infix advertises itself via the SSDP
|
||||
protocol. The Infix unit will appear as a *Network Infrastructure*
|
||||
equipment icon in the *Network* tab of Windows Explorer.
|
||||
|
||||
In Linux, the *ssdp-scan*[^3] tool can be used to find Infix units via
|
||||
SSDP.
|
||||
|
||||
```
|
||||
linux-pc:# ssdp-scan tap0
|
||||
+ infix-00-00-00 http://10.0.1.1
|
||||
linux-pc:#
|
||||
```
|
||||
|
||||
> Note 1: Infix presents itself with a HTTP URL, however, currently no
|
||||
> Web server is running. Still, the IP address 10.0.1.1 is discovered
|
||||
> and can be used for SSH access, etc.
|
||||
|
||||
> Note 2: SSDP is limited to IPv4. Thus, it is only valid as discovery
|
||||
> mechanism when Infix as well as the client PC has an IPv4 address
|
||||
> assigned.
|
||||
|
||||
[^3]: [SSDP Responder for
|
||||
Linux/UNIX](https://github.com/troglobit/ssdp-responder)
|
||||
|
||||
+54
-60
@@ -118,14 +118,14 @@ identifier.
|
||||
|
||||

|
||||
|
||||
root@infix-00-00-00:/> show interfaces
|
||||
admin@example:/> show interfaces
|
||||
INTERFACE PROTOCOL STATE DATA
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
ipv6 fe80::ff:fe00:0/64 (link-layer)
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
root@infix-00-00-00:/>
|
||||
admin@example:/>
|
||||
|
||||
To illustrate IP address configuration, the examples below uses a
|
||||
switch with a single Ethernet interface (eth0) and a loopback
|
||||
@@ -137,11 +137,11 @@ default.
|
||||
|
||||

|
||||
|
||||
root@example:/> configure
|
||||
root@example:/config/> edit interfaces interface eth0 ipv4
|
||||
root@example:/config/interfaces/interface/eth0/ipv4/> set address 10.0.1.1 prefix-length 24
|
||||
root@example:/config/interfaces/interface/eth0/ipv4/> set autoconf enabled true
|
||||
root@infix-example:/config/interfaces/interface/eth0/ipv4/> diff
|
||||
admin@example:/> configure
|
||||
admin@example:/config/> edit interfaces interface eth0 ipv4
|
||||
admin@example:/config/interfaces/interface/eth0/ipv4/> set address 10.0.1.1 prefix-length 24
|
||||
admin@example:/config/interfaces/interface/eth0/ipv4/> set autoconf enabled true
|
||||
admin@example:/config/interfaces/interface/eth0/ipv4/> diff
|
||||
+interfaces {
|
||||
+ interface eth0 {
|
||||
+ ipv4 {
|
||||
@@ -154,16 +154,8 @@ default.
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
root@infix-example:/config/interfaces/interface/eth0/ipv4/> leave
|
||||
root@infix-example:/> show interfaces
|
||||
INTERFACE PROTOCOL STATE DATA
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
ipv4 10.0.1.1/24 (static)
|
||||
ipv6 fe80::ff:fe00:0/64 (link-layer)
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
root@infix-example:/> show interfaces
|
||||
admin@example:/config/interfaces/interface/eth0/ipv4/> leave
|
||||
admin@example:/> show interfaces
|
||||
INTERFACE PROTOCOL STATE DATA
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
ipv4 169.254.1.3/16 (random)
|
||||
@@ -172,7 +164,7 @@ default.
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
root@infix-example:/>
|
||||
admin@example:/>
|
||||
|
||||
As shown, the link-local IPv4 address is configured with `set autconf
|
||||
enabled true`. The resulting address (169.254.1.3/16) is of type
|
||||
@@ -182,12 +174,12 @@ enabled true`. The resulting address (169.254.1.3/16) is of type
|
||||
|
||||

|
||||
|
||||
root@example:/> configure
|
||||
root@example:/config/> edit dhcp-client
|
||||
root@example:/config/dhcp-client/> set client-if eth0
|
||||
root@example:/config/dhcp-client/> set enabled true
|
||||
root@example:/config/dhcp-client/> leave
|
||||
root@example:/> show interfaces
|
||||
admin@example:/> configure
|
||||
admin@example:/config/> edit dhcp-client
|
||||
admin@example:/config/dhcp-client/> set client-if eth0
|
||||
admin@example:/config/dhcp-client/> set enabled true
|
||||
admin@example:/config/dhcp-client/> leave
|
||||
admin@example:/> show interfaces
|
||||
INTERFACE PROTOCOL STATE DATA
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
ipv4 10.1.2.100/24 (dhcp)
|
||||
@@ -195,8 +187,7 @@ enabled true`. The resulting address (169.254.1.3/16) is of type
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
|
||||
root@example:/>
|
||||
admin@example:/>
|
||||
|
||||
The resulting address (10.1.2.100/24) is of type *dhcp*.
|
||||
|
||||
@@ -206,28 +197,28 @@ The resulting address (10.1.2.100/24) is of type *dhcp*.
|
||||
The (only) way to disable IPv6 link-local addresses is by disabling IPv6 on the interface.
|
||||
|
||||
```(disabling
|
||||
root@example:/> configure
|
||||
root@example:/config/> edit interfaces interface eth0 ipv6
|
||||
root@example:/config/interfaces/interface/eth0/ipv6/> set enabled false
|
||||
root@example:/config/interfaces/interface/eth0/ipv6/> leave
|
||||
root@example:/> show interfaces
|
||||
admin@example:/> configure
|
||||
admin@example:/config/> edit interfaces interface eth0 ipv6
|
||||
admin@example:/config/interfaces/interface/eth0/ipv6/> set enabled false
|
||||
admin@example:/config/interfaces/interface/eth0/ipv6/> leave
|
||||
admin@example:/> show interfaces
|
||||
INTERFACE PROTOCOL STATE DATA
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
root@example:/>
|
||||
admin@example:/>
|
||||
```
|
||||
|
||||
#### Static IPv6 address
|
||||
|
||||

|
||||
|
||||
root@example:/> configure
|
||||
root@example:/config/> edit interfaces interface eth0 ipv6
|
||||
root@example:/config/interfaces/interface/eth0/ipv6/> set address 2001:db8::1 prefix-length 64
|
||||
root@example:/config/interfaces/interface/eth0/ipv6/> leave
|
||||
root@example:/> show interfaces
|
||||
admin@example:/> configure
|
||||
admin@example:/config/> edit interfaces interface eth0 ipv6
|
||||
admin@example:/config/interfaces/interface/eth0/ipv6/> set address 2001:db8::1 prefix-length 64
|
||||
admin@example:/config/interfaces/interface/eth0/ipv6/> leave
|
||||
admin@example:/> show interfaces
|
||||
INTERFACE PROTOCOL STATE DATA
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
ipv6 2001:db8::1/64 (static)
|
||||
@@ -235,7 +226,7 @@ root@example:/>
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
root@example:/>
|
||||
admin@example:/>
|
||||
|
||||
#### Stateless Auto-configuration of Global IPv6 Address
|
||||
|
||||
@@ -244,33 +235,35 @@ root@example:/>
|
||||
Stateless address auto-configuration of global addresses is enabled by
|
||||
default. The address is formed by concatenating the network prefix
|
||||
advertised by the router (here 2001:db8:0:1::0/64) and the interface
|
||||
identifier. The resulting address is of type *other*.
|
||||
identifier. The resulting address is of type *link-layer*, as it
|
||||
is formed based on the interface identifier ([IETF
|
||||
ip-yang][ietf-ip-yang]).
|
||||
|
||||
root@infix-example:/> show interfaces
|
||||
admin@example:/> show interfaces
|
||||
INTERFACE PROTOCOL STATE DATA
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
ipv6 2001:db8:0:1:0:ff:fe00:0/64 (other)
|
||||
ipv6 2001:db8:0:1:0:ff:fe00:0/64 (link-layer)
|
||||
ipv6 fe80::ff:fe00:0/64 (link-layer)
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
root@infix-example:/>
|
||||
admin@example:/>
|
||||
|
||||
Disabling auto-configuration of global IPv6 addresses can be done as shown
|
||||
below.
|
||||
|
||||
root@infix-00-00-00:/> configure
|
||||
root@infix-00-00-00:/config/> edit interfaces interface eth0 ipv6
|
||||
root@infix-00-00-00:/config/interfaces/interface/eth0/ipv6/> set autoconf create-global-addresses false
|
||||
root@infix-00-00-00:/config/interfaces/interface/eth0/ipv6/> leave
|
||||
root@infix-00-00-00:/> show interfaces
|
||||
admin@example:/> configure
|
||||
admin@example:/config/> edit interfaces interface eth0 ipv6
|
||||
admin@example:/config/interfaces/interface/eth0/ipv6/> set autoconf create-global-addresses false
|
||||
admin@example:/config/interfaces/interface/eth0/ipv6/> leave
|
||||
admin@example:/> show interfaces
|
||||
INTERFACE PROTOCOL STATE DATA
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
ipv6 fe80::ff:fe00:0/64 (link-layer)
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
root@infix-00-00-00:/>
|
||||
admin@example:/>
|
||||
|
||||
#### Random Link Identifiers for IPv6 Stateless Autoconfiguration
|
||||
|
||||
@@ -279,34 +272,35 @@ below.
|
||||
By default, the auto-configured link-local and global IPv6 addresses
|
||||
are formed from a link-identifier based on the MAC address.
|
||||
|
||||
root@infix-example:/> show interfaces
|
||||
admin@example:/> show interfaces
|
||||
INTERFACE PROTOCOL STATE DATA
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
ipv6 2001:db8:0:1:0:ff:fe00:0/64 (other)
|
||||
ipv6 2001:db8:0:1:0:ff:fe00:0/64 (link-layer)
|
||||
ipv6 fe80::ff:fe00:0/64 (link-layer)
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
root@infix-example:/>
|
||||
admin@example:/>
|
||||
|
||||
To avoid revealing identity information in the IPv6 address, it is
|
||||
possible to specify use of a random identifier ([ietf-ip][ietf-ip-yang] YANG and [RFC8981][ietf-ipv6-privacy]).
|
||||
|
||||
root@infix-example:/> configure
|
||||
root@infix-example:/config/> edit interfaces interface eth0 ipv6
|
||||
root@infix-example:/config/interfaces/interface/eth0/ipv6/> set autoconf create-temporary-addresses true
|
||||
root@infix-example:/config/interfaces/interface/eth0/ipv6/> leave
|
||||
root@infix-example:/> show interfaces
|
||||
admin@example:/> configure
|
||||
admin@example:/config/> edit interfaces interface eth0 ipv6
|
||||
admin@example:/config/interfaces/interface/eth0/ipv6/> set autoconf create-temporary-addresses true
|
||||
admin@example:/config/interfaces/interface/eth0/ipv6/> leave
|
||||
admin@example:/> show interfaces
|
||||
INTERFACE PROTOCOL STATE DATA
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
ipv6 2001:db8:0:1:fba2:f413:dd22:13ad/64 (other)
|
||||
ipv6 fe80::b886:6849:18dc:19ef/64 (random)
|
||||
ipv6 2001:db8:0:1:b705:8374:638e:74a8/64 (random)
|
||||
ipv6 fe80::ad3d:b274:885a:9ffb/64 (random)
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
root@infix-example:/>
|
||||
admin@example:/>
|
||||
|
||||
The link-local address has changed type to *random*.
|
||||
Both the link-local address (fe80::) and the global address (2001:)
|
||||
have changed type to *random*.
|
||||
|
||||
[ietf-ip-yang]: https://www.rfc-editor.org/rfc/rfc8344.html
|
||||
[ietf-ipv6-privacy]: https://www.rfc-editor.org/rfc/rfc8981.html
|
||||
|
||||
@@ -16,3 +16,4 @@ source "$BR2_EXTERNAL_INFIX_PATH/package/podman/Config.in"
|
||||
source "$BR2_EXTERNAL_INFIX_PATH/package/skeleton-init-finit/Config.in"
|
||||
source "$BR2_EXTERNAL_INFIX_PATH/package/tetris/Config.in"
|
||||
source "$BR2_EXTERNAL_INFIX_PATH/package/querierd/Config.in"
|
||||
source "$BR2_EXTERNAL_INFIX_PATH/package/greenpak-programmer/Config.in"
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
#set DEBUG=1
|
||||
|
||||
run name:bootstrap log:prio:user.notice norestart <pid/syslogd> \
|
||||
[S] /usr/libexec/confd/bootstrap \
|
||||
-- Bootstrapping YANG datastore
|
||||
|
||||
run name:error :1 log:console norestart if:<run/bootstrap/failure> \
|
||||
[S] /usr/libexec/confd/error --
|
||||
|
||||
service name:confd log <run/bootstrap/success> \
|
||||
[S12345789] sysrepo-plugind -f -p /run/confd.pid -n -v3 -- Configuration daemon
|
||||
|
||||
# Bootstrap system with startup-config
|
||||
run name:startup log:prio:user.notice norestart \
|
||||
[S] <pid/confd> /usr/libexec/confd/load -b startup-config \
|
||||
-- Loading startup-config
|
||||
|
||||
# Run if loading startup-config fails for some reason
|
||||
run name:failure log:prio:user.critical norestart if:<run/startup/failure> \
|
||||
[S] <pid/confd> /usr/libexec/confd/load failure-config \
|
||||
-- Loading failure-config
|
||||
|
||||
run name:error :2 log:console norestart if:<run/failure/failure> \
|
||||
[S] /usr/libexec/confd/error --
|
||||
|
||||
service name:netopeer log \
|
||||
[12345789] <pid/confd> netopeer2-server -F -t 60 \
|
||||
-- NETCONF server
|
||||
|
||||
# Create initial /etc/resolv.conf after successful bootstrap
|
||||
task name:resolv :conf norestart if:<run/startup/success> \
|
||||
[S] <pid/dnsmasq> resolvconf -u -- Update DNS configuration
|
||||
@@ -14,8 +14,8 @@ CONFD_DEPENDENCIES = augeas jansson libite sysrepo libsrx
|
||||
CONFD_AUTORECONF = YES
|
||||
|
||||
define CONFD_INSTALL_EXTRA
|
||||
cp $(CONFD_PKGDIR)/sysrepo.conf $(FINIT_D)/available/
|
||||
ln -sf ../available/sysrepo.conf $(FINIT_D)/enabled/sysrepo.conf
|
||||
cp $(CONFD_PKGDIR)/confd.conf $(FINIT_D)/available/
|
||||
ln -sf ../available/confd.conf $(FINIT_D)/enabled/confd.conf
|
||||
cp $(CONFD_PKGDIR)/tmpfiles.conf $(TARGET_DIR)/etc/tmpfiles.d/confd.conf
|
||||
endef
|
||||
CONFD_POST_INSTALL_TARGET_HOOKS += CONFD_INSTALL_EXTRA
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
run name:bootstrap log:prio:user.notice \
|
||||
[S] /lib/infix/cfg-bootstrap -- Bootstrapping YANG models
|
||||
service name:sysrepo log \
|
||||
[S12345789] sysrepo-plugind -f -p /run/sysrepo.pid -n -- Configuration daemon
|
||||
run name:startup log:prio:user.notice \
|
||||
[S] <pid/sysrepo> sysrepocfg -I/cfg/startup-config.cfg -f json \
|
||||
-- Loading startup-config
|
||||
service name:netopeer log \
|
||||
[12345789] <pid/sysrepo> netopeer2-server -F -t 60 \
|
||||
-- NETCONF server
|
||||
|
||||
# XXX: This is a hack, talk to Joachim
|
||||
task [12345789] resolvconf -u -- Update DNS configuration
|
||||
@@ -1,5 +1,5 @@
|
||||
# From https://github.com/troglobit/finit/releases/
|
||||
sha256 af89d4048415a8be7d49e397bc45f838fe72f93e1087d7bc6bc0db085c7c2621 finit-4.4.tar.gz
|
||||
sha256 904af0b0d7b22bcbe7772ea5851a0496445bfb3cff5c9a65935fd74745dcba75 finit-4.5-rc5.tar.gz
|
||||
|
||||
# Locally calculated
|
||||
sha256 3a2b964c1772d03ab17b73a389ecce9151e0b190a9247817a2c009b16d356422 LICENSE
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
#
|
||||
################################################################################
|
||||
|
||||
FINIT_VERSION = 4.4
|
||||
FINIT_VERSION = 4.5-rc5
|
||||
FINIT_SITE = https://github.com/troglobit/finit/releases/download/$(FINIT_VERSION)
|
||||
FINIT_LICENSE = MIT
|
||||
FINIT_LICENSE_FILES = LICENSE
|
||||
@@ -30,6 +30,7 @@ FINIT_CONF_OPTS = \
|
||||
--exec-prefix= \
|
||||
--disable-doc \
|
||||
--disable-contrib \
|
||||
--disable-rescue \
|
||||
--disable-silent-rules \
|
||||
--with-group=$(BR2_PACKAGE_FINIT_INITCTL_GROUP)
|
||||
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
config BR2_PACKAGE_GREENPAK_PROGRAMMER
|
||||
bool "greenpak-programmer"
|
||||
select BR2_PACKAGE_I2C_TOOLS
|
||||
help
|
||||
Tool for programming GreenPAK chips in-circuit using I2C
|
||||
|
||||
https://github.com/addiva-elektronik/greenpak-programmer/
|
||||
@@ -0,0 +1,5 @@
|
||||
# From https://github.com/addiva-elektronik/greenpak-programmer/releases/download/v1.1/greenpak-programmer-1.1.tar.gz.sha256
|
||||
sha256 960521714312e3b519a238b6c527826c3aacf6af93252f9ceb2fa2a22e341449 greenpak-programmer-1.1.tar.gz
|
||||
|
||||
# Locally generated
|
||||
sha256 c1673b6eecedfe5f461ee719291ff81b57d31f64f36cad3d00fb97b14dffc025 LICENSE.txt
|
||||
@@ -0,0 +1,22 @@
|
||||
################################################################################
|
||||
#
|
||||
# greenpak-programmer
|
||||
#
|
||||
################################################################################
|
||||
|
||||
GREENPAK_PROGRAMMER_VERSION = 1.1
|
||||
GREENPAK_PROGRAMMER_SITE = https://github.com/addiva-elektronik/greenpak-programmer/releases/download/v$(GREENPAK_PROGRAMMER_VERSION)
|
||||
GREENPAK_PROGRAMMER_LICENSE = MIT
|
||||
GREENPAK_PROGRAMMER_LICENSE_FILES = LICENSE.txt
|
||||
GREENPAK_PROGRAMMER_INSTALL_STAGING = YES
|
||||
GREENPAK_PROGRAMMER_DEPENDENCIES = i2c-tools
|
||||
|
||||
define GREENPAK_PROGRAMMER_BUILD_CMDS
|
||||
$(TARGET_CONFIGURE_OPTS) $(MAKE) -C $(@D) all
|
||||
endef
|
||||
|
||||
define GREENPAK_PROGRAMMER_INSTALL_TARGET_CMDS
|
||||
$(INSTALL) -D -m 0755 $(@D)/greenpak-programmer $(TARGET_DIR)/usr/bin/greenpak-programmer
|
||||
endef
|
||||
|
||||
$(eval $(generic-package))
|
||||
@@ -1 +1 @@
|
||||
service [S12345789] dnsmasq -k -u root -- DHCP/DNS proxy
|
||||
service [S12345789] <pid/syslogd> dnsmasq -k -u root -- DHCP/DNS proxy
|
||||
|
||||
@@ -1,2 +1,4 @@
|
||||
task [S] /usr/bin/ssh-genhostkeys --
|
||||
service [2345789] <usr/ssh-hostkeys> env:-/etc/default/sshd /usr/sbin/sshd -D $SSHD_OPTS -- OpenSSH daemon
|
||||
task <pid/syslogd> \
|
||||
[S] /usr/bin/ssh-hostkeys -- Verifying SSH host keys
|
||||
service <task/ssh-hostkeys/success> env:-/etc/default/sshd \
|
||||
[2345789] /usr/sbin/sshd -D $SSHD_OPTS -- OpenSSH daemon
|
||||
|
||||
@@ -1 +1,2 @@
|
||||
service name:sysklogd [S0123456789] env:-/etc/default/sysklogd syslogd -F $SYSLOGD_ARGS -- System log daemon
|
||||
service name:syslogd env:-/etc/default/sysklogd <run/udevadm:5/success> \
|
||||
[S0123456789] syslogd -F $SYSLOGD_ARGS -- System log daemon
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
if sshd -t; then
|
||||
initctl cond set ssh-hostkeys
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if sshd -t 2>&1 |grep hostkeys; then
|
||||
ssh-keygen -A
|
||||
initctl cond set ssh-hostkeys
|
||||
else
|
||||
logger -t sshd "invadlid sshd_config, check with: sshd -t"
|
||||
fi
|
||||
|
||||
exit 0
|
||||
@@ -0,0 +1,49 @@
|
||||
#!/bin/sh
|
||||
tmp=$(mktemp)
|
||||
dir=$(dirname "$(grep -r '^HostKey' /etc/ssh/* |tail -1 | awk '{print $2}')")
|
||||
|
||||
log()
|
||||
{
|
||||
prio=notice
|
||||
if [ "$1" = "-p" ]; then
|
||||
prio=$2
|
||||
shift 2
|
||||
fi
|
||||
logger -sik -p "security.$prio" -t sshd "$@"
|
||||
}
|
||||
|
||||
check()
|
||||
{
|
||||
if sshd -t >"$tmp" 2>&1; then
|
||||
log "SSH hostkeys OK, setting ssh-hostkeys condition"
|
||||
return 0
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
rc=0
|
||||
if ! check; then
|
||||
files=$(awk '/invalid format/{print $6}' "$tmp" | sed 's/.*"\(.*\)".*/\1/')
|
||||
for file in $files; do
|
||||
log -p warn "Removing $file: invalid format!"
|
||||
invalid=yes
|
||||
rm "$file"
|
||||
done
|
||||
|
||||
if [ -n "$invalid" ]; then
|
||||
log "Invalid hostkeys detected, regenerating all SSH hostkeys ..."
|
||||
else
|
||||
log "Generating SSH hostkeys ..."
|
||||
fi
|
||||
|
||||
if ssh-keygen -A; then
|
||||
mv /etc/ssh/ssh_host_* "$dir/"
|
||||
fi
|
||||
if ! check; then
|
||||
log -p err "Failed generating SSH hostkeys!"
|
||||
rc=1
|
||||
fi
|
||||
fi
|
||||
|
||||
rm "$tmp"
|
||||
exit $rc
|
||||
@@ -1 +1 @@
|
||||
service name:statd log [S12345789] <pid/sysrepo> statd -f -p /run/statd.pid -n -- Status daemon
|
||||
service name:statd log [S12345789] <pid/confd> statd -f -p /run/statd.pid -n -- Status daemon
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
From 99e3fc4a7c6d31f5d0fdc7bb5c409c776c19012c Mon Sep 17 00:00:00 2001
|
||||
From: Tobias Waldekranz <tobias@waldekranz.com>
|
||||
Date: Thu, 5 Oct 2023 16:09:25 +0200
|
||||
Subject: [PATCH 1/9] eth: fwnode: Fall back to NVMEM provided MAC address from
|
||||
OF
|
||||
|
||||
In the cases where the fwnode is an OF node, make use of any NVMEM
|
||||
source of the interface's MAC address that might have been specified
|
||||
in the device tree.
|
||||
|
||||
Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com>
|
||||
---
|
||||
net/ethernet/eth.c | 6 ++++++
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
diff --git a/net/ethernet/eth.c b/net/ethernet/eth.c
|
||||
index 2edc8b796a4e..04900a41fab3 100644
|
||||
--- a/net/ethernet/eth.c
|
||||
+++ b/net/ethernet/eth.c
|
||||
@@ -609,11 +609,17 @@ static int fwnode_get_mac_addr(struct fwnode_handle *fwnode,
|
||||
*/
|
||||
int fwnode_get_mac_address(struct fwnode_handle *fwnode, char *addr)
|
||||
{
|
||||
+ struct device_node *np;
|
||||
+
|
||||
if (!fwnode_get_mac_addr(fwnode, "mac-address", addr) ||
|
||||
!fwnode_get_mac_addr(fwnode, "local-mac-address", addr) ||
|
||||
!fwnode_get_mac_addr(fwnode, "address", addr))
|
||||
return 0;
|
||||
|
||||
+ np = to_of_node(fwnode);
|
||||
+ if (np)
|
||||
+ return of_get_mac_address_nvmem(np, addr);
|
||||
+
|
||||
return -ENOENT;
|
||||
}
|
||||
EXPORT_SYMBOL(fwnode_get_mac_address);
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,472 @@
|
||||
From 5ddc784a4c8803aff2c3fa3c6595e9d32933d4aa Mon Sep 17 00:00:00 2001
|
||||
From: Tobias Waldekranz <tobias@waldekranz.com>
|
||||
Date: Tue, 5 Sep 2023 13:08:29 +0200
|
||||
Subject: [PATCH 2/9] net: dsa: mv88e6xxx: Create API to read a single stat
|
||||
counter
|
||||
|
||||
This change contains no functional change. We simply push the hardware
|
||||
specific stats logic to a function reading a single counter, rather
|
||||
than the whole set.
|
||||
|
||||
This is a preparatory change for the upcoming standard ethtool
|
||||
statistics support (i.e. "eth-mac", "eth-ctrl" etc.).
|
||||
|
||||
Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com>
|
||||
---
|
||||
drivers/net/dsa/mv88e6xxx/chip.c | 160 ++++++++++++++++++-------------
|
||||
drivers/net/dsa/mv88e6xxx/chip.h | 27 +++---
|
||||
2 files changed, 105 insertions(+), 82 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c
|
||||
index 7af2f08a62f1..1e944cf08233 100644
|
||||
--- a/drivers/net/dsa/mv88e6xxx/chip.c
|
||||
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
|
||||
@@ -1082,7 +1082,7 @@ static struct mv88e6xxx_hw_stat mv88e6xxx_hw_stats[] = {
|
||||
};
|
||||
|
||||
static uint64_t _mv88e6xxx_get_ethtool_stat(struct mv88e6xxx_chip *chip,
|
||||
- struct mv88e6xxx_hw_stat *s,
|
||||
+ const struct mv88e6xxx_hw_stat *s,
|
||||
int port, u16 bank1_select,
|
||||
u16 histogram)
|
||||
{
|
||||
@@ -1265,59 +1265,82 @@ static int mv88e6xxx_get_sset_count(struct dsa_switch *ds, int port, int sset)
|
||||
return count;
|
||||
}
|
||||
|
||||
-static int mv88e6xxx_stats_get_stats(struct mv88e6xxx_chip *chip, int port,
|
||||
- uint64_t *data, int types,
|
||||
- u16 bank1_select, u16 histogram)
|
||||
+static int mv88e6095_stats_get_stat(struct mv88e6xxx_chip *chip, int port,
|
||||
+ const struct mv88e6xxx_hw_stat *stat,
|
||||
+ uint64_t *data)
|
||||
{
|
||||
- struct mv88e6xxx_hw_stat *stat;
|
||||
- int i, j;
|
||||
+ if (!(stat->type & (STATS_TYPE_BANK0 | STATS_TYPE_PORT)))
|
||||
+ return 0;
|
||||
|
||||
- for (i = 0, j = 0; i < ARRAY_SIZE(mv88e6xxx_hw_stats); i++) {
|
||||
- stat = &mv88e6xxx_hw_stats[i];
|
||||
- if (stat->type & types) {
|
||||
- mv88e6xxx_reg_lock(chip);
|
||||
- data[j] = _mv88e6xxx_get_ethtool_stat(chip, stat, port,
|
||||
- bank1_select,
|
||||
- histogram);
|
||||
- mv88e6xxx_reg_unlock(chip);
|
||||
+ *data = _mv88e6xxx_get_ethtool_stat(chip, stat, port, 0,
|
||||
+ MV88E6XXX_G1_STATS_OP_HIST_RX_TX);
|
||||
+ return 1;
|
||||
+}
|
||||
|
||||
- j++;
|
||||
- }
|
||||
- }
|
||||
- return j;
|
||||
+static int mv88e6250_stats_get_stat(struct mv88e6xxx_chip *chip, int port,
|
||||
+ const struct mv88e6xxx_hw_stat *stat,
|
||||
+ uint64_t *data)
|
||||
+{
|
||||
+ if (!(stat->type & STATS_TYPE_BANK0))
|
||||
+ return 0;
|
||||
+
|
||||
+ *data = _mv88e6xxx_get_ethtool_stat(chip, stat, port, 0,
|
||||
+ MV88E6XXX_G1_STATS_OP_HIST_RX_TX);
|
||||
+ return 1;
|
||||
}
|
||||
|
||||
-static int mv88e6095_stats_get_stats(struct mv88e6xxx_chip *chip, int port,
|
||||
- uint64_t *data)
|
||||
+static int mv88e6320_stats_get_stat(struct mv88e6xxx_chip *chip, int port,
|
||||
+ const struct mv88e6xxx_hw_stat *stat,
|
||||
+ uint64_t *data)
|
||||
{
|
||||
- return mv88e6xxx_stats_get_stats(chip, port, data,
|
||||
- STATS_TYPE_BANK0 | STATS_TYPE_PORT,
|
||||
- 0, MV88E6XXX_G1_STATS_OP_HIST_RX_TX);
|
||||
+ if (!(stat->type & (STATS_TYPE_BANK0 | STATS_TYPE_BANK1)))
|
||||
+ return 0;
|
||||
+
|
||||
+ *data = _mv88e6xxx_get_ethtool_stat(chip, stat, port,
|
||||
+ MV88E6XXX_G1_STATS_OP_BANK_1_BIT_9,
|
||||
+ MV88E6XXX_G1_STATS_OP_HIST_RX_TX);
|
||||
+ return 1;
|
||||
}
|
||||
|
||||
-static int mv88e6250_stats_get_stats(struct mv88e6xxx_chip *chip, int port,
|
||||
- uint64_t *data)
|
||||
+static int mv88e6390_stats_get_stat(struct mv88e6xxx_chip *chip, int port,
|
||||
+ const struct mv88e6xxx_hw_stat *stat,
|
||||
+ uint64_t *data)
|
||||
{
|
||||
- return mv88e6xxx_stats_get_stats(chip, port, data, STATS_TYPE_BANK0,
|
||||
- 0, MV88E6XXX_G1_STATS_OP_HIST_RX_TX);
|
||||
+ if (!(stat->type & (STATS_TYPE_BANK0 | STATS_TYPE_BANK1)))
|
||||
+ return 0;
|
||||
+
|
||||
+ *data = _mv88e6xxx_get_ethtool_stat(chip, stat, port,
|
||||
+ MV88E6XXX_G1_STATS_OP_BANK_1_BIT_10,
|
||||
+ 0);
|
||||
+ return 1;
|
||||
}
|
||||
|
||||
-static int mv88e6320_stats_get_stats(struct mv88e6xxx_chip *chip, int port,
|
||||
- uint64_t *data)
|
||||
+static int mv88e6xxx_stats_get_stat(struct mv88e6xxx_chip *chip, int port,
|
||||
+ const struct mv88e6xxx_hw_stat *stat,
|
||||
+ uint64_t *data)
|
||||
{
|
||||
- return mv88e6xxx_stats_get_stats(chip, port, data,
|
||||
- STATS_TYPE_BANK0 | STATS_TYPE_BANK1,
|
||||
- MV88E6XXX_G1_STATS_OP_BANK_1_BIT_9,
|
||||
- MV88E6XXX_G1_STATS_OP_HIST_RX_TX);
|
||||
+ int ret = 0;
|
||||
+
|
||||
+ if (chip->info->ops->stats_get_stat) {
|
||||
+ mv88e6xxx_reg_lock(chip);
|
||||
+ ret = chip->info->ops->stats_get_stat(chip, port, stat, data);
|
||||
+ mv88e6xxx_reg_unlock(chip);
|
||||
+ }
|
||||
+
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
-static int mv88e6390_stats_get_stats(struct mv88e6xxx_chip *chip, int port,
|
||||
+static int mv88e6xxx_stats_get_stats(struct mv88e6xxx_chip *chip, int port,
|
||||
uint64_t *data)
|
||||
{
|
||||
- return mv88e6xxx_stats_get_stats(chip, port, data,
|
||||
- STATS_TYPE_BANK0 | STATS_TYPE_BANK1,
|
||||
- MV88E6XXX_G1_STATS_OP_BANK_1_BIT_10,
|
||||
- 0);
|
||||
+ struct mv88e6xxx_hw_stat *stat;
|
||||
+ int i, j;
|
||||
+
|
||||
+ for (i = 0, j = 0; i < ARRAY_SIZE(mv88e6xxx_hw_stats); i++) {
|
||||
+ stat = &mv88e6xxx_hw_stats[i];
|
||||
+ j += mv88e6xxx_stats_get_stat(chip, port, stat, &data[j]);
|
||||
+ }
|
||||
+ return j;
|
||||
}
|
||||
|
||||
static void mv88e6xxx_atu_vtu_get_stats(struct mv88e6xxx_chip *chip, int port,
|
||||
@@ -1333,10 +1356,9 @@ static void mv88e6xxx_atu_vtu_get_stats(struct mv88e6xxx_chip *chip, int port,
|
||||
static void mv88e6xxx_get_stats(struct mv88e6xxx_chip *chip, int port,
|
||||
uint64_t *data)
|
||||
{
|
||||
- int count = 0;
|
||||
+ int count;
|
||||
|
||||
- if (chip->info->ops->stats_get_stats)
|
||||
- count = chip->info->ops->stats_get_stats(chip, port, data);
|
||||
+ count = mv88e6xxx_stats_get_stats(chip, port, data);
|
||||
|
||||
mv88e6xxx_reg_lock(chip);
|
||||
if (chip->info->ops->serdes_get_stats) {
|
||||
@@ -4196,7 +4218,7 @@ static const struct mv88e6xxx_ops mv88e6085_ops = {
|
||||
.stats_set_histogram = mv88e6095_g1_stats_set_histogram,
|
||||
.stats_get_sset_count = mv88e6095_stats_get_sset_count,
|
||||
.stats_get_strings = mv88e6095_stats_get_strings,
|
||||
- .stats_get_stats = mv88e6095_stats_get_stats,
|
||||
+ .stats_get_stat = mv88e6095_stats_get_stat,
|
||||
.set_cpu_port = mv88e6095_g1_set_cpu_port,
|
||||
.set_egress_port = mv88e6095_g1_set_egress_port,
|
||||
.watchdog_ops = &mv88e6097_watchdog_ops,
|
||||
@@ -4234,7 +4256,7 @@ static const struct mv88e6xxx_ops mv88e6095_ops = {
|
||||
.stats_set_histogram = mv88e6095_g1_stats_set_histogram,
|
||||
.stats_get_sset_count = mv88e6095_stats_get_sset_count,
|
||||
.stats_get_strings = mv88e6095_stats_get_strings,
|
||||
- .stats_get_stats = mv88e6095_stats_get_stats,
|
||||
+ .stats_get_stat = mv88e6095_stats_get_stat,
|
||||
.mgmt_rsvd2cpu = mv88e6185_g2_mgmt_rsvd2cpu,
|
||||
.serdes_power = mv88e6185_serdes_power,
|
||||
.serdes_get_lane = mv88e6185_serdes_get_lane,
|
||||
@@ -4277,7 +4299,7 @@ static const struct mv88e6xxx_ops mv88e6097_ops = {
|
||||
.stats_set_histogram = mv88e6095_g1_stats_set_histogram,
|
||||
.stats_get_sset_count = mv88e6095_stats_get_sset_count,
|
||||
.stats_get_strings = mv88e6095_stats_get_strings,
|
||||
- .stats_get_stats = mv88e6095_stats_get_stats,
|
||||
+ .stats_get_stat = mv88e6095_stats_get_stat,
|
||||
.set_cpu_port = mv88e6095_g1_set_cpu_port,
|
||||
.set_egress_port = mv88e6095_g1_set_egress_port,
|
||||
.watchdog_ops = &mv88e6097_watchdog_ops,
|
||||
@@ -4323,7 +4345,7 @@ static const struct mv88e6xxx_ops mv88e6123_ops = {
|
||||
.stats_set_histogram = mv88e6095_g1_stats_set_histogram,
|
||||
.stats_get_sset_count = mv88e6095_stats_get_sset_count,
|
||||
.stats_get_strings = mv88e6095_stats_get_strings,
|
||||
- .stats_get_stats = mv88e6095_stats_get_stats,
|
||||
+ .stats_get_stat = mv88e6095_stats_get_stat,
|
||||
.set_cpu_port = mv88e6095_g1_set_cpu_port,
|
||||
.set_egress_port = mv88e6095_g1_set_egress_port,
|
||||
.watchdog_ops = &mv88e6097_watchdog_ops,
|
||||
@@ -4366,7 +4388,7 @@ static const struct mv88e6xxx_ops mv88e6131_ops = {
|
||||
.stats_set_histogram = mv88e6095_g1_stats_set_histogram,
|
||||
.stats_get_sset_count = mv88e6095_stats_get_sset_count,
|
||||
.stats_get_strings = mv88e6095_stats_get_strings,
|
||||
- .stats_get_stats = mv88e6095_stats_get_stats,
|
||||
+ .stats_get_stat = mv88e6095_stats_get_stat,
|
||||
.set_cpu_port = mv88e6095_g1_set_cpu_port,
|
||||
.set_egress_port = mv88e6095_g1_set_egress_port,
|
||||
.watchdog_ops = &mv88e6097_watchdog_ops,
|
||||
@@ -4415,7 +4437,7 @@ static const struct mv88e6xxx_ops mv88e6141_ops = {
|
||||
.stats_set_histogram = mv88e6390_g1_stats_set_histogram,
|
||||
.stats_get_sset_count = mv88e6320_stats_get_sset_count,
|
||||
.stats_get_strings = mv88e6320_stats_get_strings,
|
||||
- .stats_get_stats = mv88e6390_stats_get_stats,
|
||||
+ .stats_get_stat = mv88e6390_stats_get_stat,
|
||||
.set_cpu_port = mv88e6390_g1_set_cpu_port,
|
||||
.set_egress_port = mv88e6390_g1_set_egress_port,
|
||||
.watchdog_ops = &mv88e6390_watchdog_ops,
|
||||
@@ -4477,7 +4499,7 @@ static const struct mv88e6xxx_ops mv88e6161_ops = {
|
||||
.stats_set_histogram = mv88e6095_g1_stats_set_histogram,
|
||||
.stats_get_sset_count = mv88e6095_stats_get_sset_count,
|
||||
.stats_get_strings = mv88e6095_stats_get_strings,
|
||||
- .stats_get_stats = mv88e6095_stats_get_stats,
|
||||
+ .stats_get_stat = mv88e6095_stats_get_stat,
|
||||
.set_cpu_port = mv88e6095_g1_set_cpu_port,
|
||||
.set_egress_port = mv88e6095_g1_set_egress_port,
|
||||
.watchdog_ops = &mv88e6097_watchdog_ops,
|
||||
@@ -4515,7 +4537,7 @@ static const struct mv88e6xxx_ops mv88e6165_ops = {
|
||||
.stats_set_histogram = mv88e6095_g1_stats_set_histogram,
|
||||
.stats_get_sset_count = mv88e6095_stats_get_sset_count,
|
||||
.stats_get_strings = mv88e6095_stats_get_strings,
|
||||
- .stats_get_stats = mv88e6095_stats_get_stats,
|
||||
+ .stats_get_stat = mv88e6095_stats_get_stat,
|
||||
.set_cpu_port = mv88e6095_g1_set_cpu_port,
|
||||
.set_egress_port = mv88e6095_g1_set_egress_port,
|
||||
.watchdog_ops = &mv88e6097_watchdog_ops,
|
||||
@@ -4563,7 +4585,7 @@ static const struct mv88e6xxx_ops mv88e6171_ops = {
|
||||
.stats_set_histogram = mv88e6095_g1_stats_set_histogram,
|
||||
.stats_get_sset_count = mv88e6095_stats_get_sset_count,
|
||||
.stats_get_strings = mv88e6095_stats_get_strings,
|
||||
- .stats_get_stats = mv88e6095_stats_get_stats,
|
||||
+ .stats_get_stat = mv88e6095_stats_get_stat,
|
||||
.set_cpu_port = mv88e6095_g1_set_cpu_port,
|
||||
.set_egress_port = mv88e6095_g1_set_egress_port,
|
||||
.watchdog_ops = &mv88e6097_watchdog_ops,
|
||||
@@ -4612,7 +4634,7 @@ static const struct mv88e6xxx_ops mv88e6172_ops = {
|
||||
.stats_set_histogram = mv88e6095_g1_stats_set_histogram,
|
||||
.stats_get_sset_count = mv88e6095_stats_get_sset_count,
|
||||
.stats_get_strings = mv88e6095_stats_get_strings,
|
||||
- .stats_get_stats = mv88e6095_stats_get_stats,
|
||||
+ .stats_get_stat = mv88e6095_stats_get_stat,
|
||||
.set_cpu_port = mv88e6095_g1_set_cpu_port,
|
||||
.set_egress_port = mv88e6095_g1_set_egress_port,
|
||||
.watchdog_ops = &mv88e6097_watchdog_ops,
|
||||
@@ -4668,7 +4690,7 @@ static const struct mv88e6xxx_ops mv88e6175_ops = {
|
||||
.stats_set_histogram = mv88e6095_g1_stats_set_histogram,
|
||||
.stats_get_sset_count = mv88e6095_stats_get_sset_count,
|
||||
.stats_get_strings = mv88e6095_stats_get_strings,
|
||||
- .stats_get_stats = mv88e6095_stats_get_stats,
|
||||
+ .stats_get_stat = mv88e6095_stats_get_stat,
|
||||
.set_cpu_port = mv88e6095_g1_set_cpu_port,
|
||||
.set_egress_port = mv88e6095_g1_set_egress_port,
|
||||
.watchdog_ops = &mv88e6097_watchdog_ops,
|
||||
@@ -4717,7 +4739,7 @@ static const struct mv88e6xxx_ops mv88e6176_ops = {
|
||||
.stats_set_histogram = mv88e6095_g1_stats_set_histogram,
|
||||
.stats_get_sset_count = mv88e6095_stats_get_sset_count,
|
||||
.stats_get_strings = mv88e6095_stats_get_strings,
|
||||
- .stats_get_stats = mv88e6095_stats_get_stats,
|
||||
+ .stats_get_stat = mv88e6095_stats_get_stat,
|
||||
.set_cpu_port = mv88e6095_g1_set_cpu_port,
|
||||
.set_egress_port = mv88e6095_g1_set_egress_port,
|
||||
.watchdog_ops = &mv88e6097_watchdog_ops,
|
||||
@@ -4769,7 +4791,7 @@ static const struct mv88e6xxx_ops mv88e6185_ops = {
|
||||
.stats_set_histogram = mv88e6095_g1_stats_set_histogram,
|
||||
.stats_get_sset_count = mv88e6095_stats_get_sset_count,
|
||||
.stats_get_strings = mv88e6095_stats_get_strings,
|
||||
- .stats_get_stats = mv88e6095_stats_get_stats,
|
||||
+ .stats_get_stat = mv88e6095_stats_get_stat,
|
||||
.set_cpu_port = mv88e6095_g1_set_cpu_port,
|
||||
.set_egress_port = mv88e6095_g1_set_egress_port,
|
||||
.watchdog_ops = &mv88e6097_watchdog_ops,
|
||||
@@ -4820,7 +4842,7 @@ static const struct mv88e6xxx_ops mv88e6190_ops = {
|
||||
.stats_set_histogram = mv88e6390_g1_stats_set_histogram,
|
||||
.stats_get_sset_count = mv88e6320_stats_get_sset_count,
|
||||
.stats_get_strings = mv88e6320_stats_get_strings,
|
||||
- .stats_get_stats = mv88e6390_stats_get_stats,
|
||||
+ .stats_get_stat = mv88e6390_stats_get_stat,
|
||||
.set_cpu_port = mv88e6390_g1_set_cpu_port,
|
||||
.set_egress_port = mv88e6390_g1_set_egress_port,
|
||||
.watchdog_ops = &mv88e6390_watchdog_ops,
|
||||
@@ -4885,7 +4907,7 @@ static const struct mv88e6xxx_ops mv88e6190x_ops = {
|
||||
.stats_set_histogram = mv88e6390_g1_stats_set_histogram,
|
||||
.stats_get_sset_count = mv88e6320_stats_get_sset_count,
|
||||
.stats_get_strings = mv88e6320_stats_get_strings,
|
||||
- .stats_get_stats = mv88e6390_stats_get_stats,
|
||||
+ .stats_get_stat = mv88e6390_stats_get_stat,
|
||||
.set_cpu_port = mv88e6390_g1_set_cpu_port,
|
||||
.set_egress_port = mv88e6390_g1_set_egress_port,
|
||||
.watchdog_ops = &mv88e6390_watchdog_ops,
|
||||
@@ -4948,7 +4970,7 @@ static const struct mv88e6xxx_ops mv88e6191_ops = {
|
||||
.stats_set_histogram = mv88e6390_g1_stats_set_histogram,
|
||||
.stats_get_sset_count = mv88e6320_stats_get_sset_count,
|
||||
.stats_get_strings = mv88e6320_stats_get_strings,
|
||||
- .stats_get_stats = mv88e6390_stats_get_stats,
|
||||
+ .stats_get_stat = mv88e6390_stats_get_stat,
|
||||
.set_cpu_port = mv88e6390_g1_set_cpu_port,
|
||||
.set_egress_port = mv88e6390_g1_set_egress_port,
|
||||
.watchdog_ops = &mv88e6390_watchdog_ops,
|
||||
@@ -5014,7 +5036,7 @@ static const struct mv88e6xxx_ops mv88e6240_ops = {
|
||||
.stats_set_histogram = mv88e6095_g1_stats_set_histogram,
|
||||
.stats_get_sset_count = mv88e6095_stats_get_sset_count,
|
||||
.stats_get_strings = mv88e6095_stats_get_strings,
|
||||
- .stats_get_stats = mv88e6095_stats_get_stats,
|
||||
+ .stats_get_stat = mv88e6095_stats_get_stat,
|
||||
.set_cpu_port = mv88e6095_g1_set_cpu_port,
|
||||
.set_egress_port = mv88e6095_g1_set_egress_port,
|
||||
.watchdog_ops = &mv88e6097_watchdog_ops,
|
||||
@@ -5074,7 +5096,7 @@ static const struct mv88e6xxx_ops mv88e6250_ops = {
|
||||
.stats_set_histogram = mv88e6095_g1_stats_set_histogram,
|
||||
.stats_get_sset_count = mv88e6250_stats_get_sset_count,
|
||||
.stats_get_strings = mv88e6250_stats_get_strings,
|
||||
- .stats_get_stats = mv88e6250_stats_get_stats,
|
||||
+ .stats_get_stat = mv88e6250_stats_get_stat,
|
||||
.set_cpu_port = mv88e6095_g1_set_cpu_port,
|
||||
.set_egress_port = mv88e6095_g1_set_egress_port,
|
||||
.watchdog_ops = &mv88e6250_watchdog_ops,
|
||||
@@ -5121,7 +5143,7 @@ static const struct mv88e6xxx_ops mv88e6290_ops = {
|
||||
.stats_set_histogram = mv88e6390_g1_stats_set_histogram,
|
||||
.stats_get_sset_count = mv88e6320_stats_get_sset_count,
|
||||
.stats_get_strings = mv88e6320_stats_get_strings,
|
||||
- .stats_get_stats = mv88e6390_stats_get_stats,
|
||||
+ .stats_get_stat = mv88e6390_stats_get_stat,
|
||||
.set_cpu_port = mv88e6390_g1_set_cpu_port,
|
||||
.set_egress_port = mv88e6390_g1_set_egress_port,
|
||||
.watchdog_ops = &mv88e6390_watchdog_ops,
|
||||
@@ -5187,7 +5209,7 @@ static const struct mv88e6xxx_ops mv88e6320_ops = {
|
||||
.stats_set_histogram = mv88e6095_g1_stats_set_histogram,
|
||||
.stats_get_sset_count = mv88e6320_stats_get_sset_count,
|
||||
.stats_get_strings = mv88e6320_stats_get_strings,
|
||||
- .stats_get_stats = mv88e6320_stats_get_stats,
|
||||
+ .stats_get_stat = mv88e6320_stats_get_stat,
|
||||
.set_cpu_port = mv88e6095_g1_set_cpu_port,
|
||||
.set_egress_port = mv88e6095_g1_set_egress_port,
|
||||
.watchdog_ops = &mv88e6390_watchdog_ops,
|
||||
@@ -5234,7 +5256,7 @@ static const struct mv88e6xxx_ops mv88e6321_ops = {
|
||||
.stats_set_histogram = mv88e6095_g1_stats_set_histogram,
|
||||
.stats_get_sset_count = mv88e6320_stats_get_sset_count,
|
||||
.stats_get_strings = mv88e6320_stats_get_strings,
|
||||
- .stats_get_stats = mv88e6320_stats_get_stats,
|
||||
+ .stats_get_stat = mv88e6320_stats_get_stat,
|
||||
.set_cpu_port = mv88e6095_g1_set_cpu_port,
|
||||
.set_egress_port = mv88e6095_g1_set_egress_port,
|
||||
.watchdog_ops = &mv88e6390_watchdog_ops,
|
||||
@@ -5283,7 +5305,7 @@ static const struct mv88e6xxx_ops mv88e6341_ops = {
|
||||
.stats_set_histogram = mv88e6390_g1_stats_set_histogram,
|
||||
.stats_get_sset_count = mv88e6320_stats_get_sset_count,
|
||||
.stats_get_strings = mv88e6320_stats_get_strings,
|
||||
- .stats_get_stats = mv88e6390_stats_get_stats,
|
||||
+ .stats_get_stat = mv88e6390_stats_get_stat,
|
||||
.set_cpu_port = mv88e6390_g1_set_cpu_port,
|
||||
.set_egress_port = mv88e6390_g1_set_egress_port,
|
||||
.watchdog_ops = &mv88e6390_watchdog_ops,
|
||||
@@ -5348,7 +5370,7 @@ static const struct mv88e6xxx_ops mv88e6350_ops = {
|
||||
.stats_set_histogram = mv88e6095_g1_stats_set_histogram,
|
||||
.stats_get_sset_count = mv88e6095_stats_get_sset_count,
|
||||
.stats_get_strings = mv88e6095_stats_get_strings,
|
||||
- .stats_get_stats = mv88e6095_stats_get_stats,
|
||||
+ .stats_get_stat = mv88e6095_stats_get_stat,
|
||||
.set_cpu_port = mv88e6095_g1_set_cpu_port,
|
||||
.set_egress_port = mv88e6095_g1_set_egress_port,
|
||||
.watchdog_ops = &mv88e6097_watchdog_ops,
|
||||
@@ -5394,7 +5416,7 @@ static const struct mv88e6xxx_ops mv88e6351_ops = {
|
||||
.stats_set_histogram = mv88e6095_g1_stats_set_histogram,
|
||||
.stats_get_sset_count = mv88e6095_stats_get_sset_count,
|
||||
.stats_get_strings = mv88e6095_stats_get_strings,
|
||||
- .stats_get_stats = mv88e6095_stats_get_stats,
|
||||
+ .stats_get_stat = mv88e6095_stats_get_stat,
|
||||
.set_cpu_port = mv88e6095_g1_set_cpu_port,
|
||||
.set_egress_port = mv88e6095_g1_set_egress_port,
|
||||
.watchdog_ops = &mv88e6097_watchdog_ops,
|
||||
@@ -5445,7 +5467,7 @@ static const struct mv88e6xxx_ops mv88e6352_ops = {
|
||||
.stats_set_histogram = mv88e6095_g1_stats_set_histogram,
|
||||
.stats_get_sset_count = mv88e6095_stats_get_sset_count,
|
||||
.stats_get_strings = mv88e6095_stats_get_strings,
|
||||
- .stats_get_stats = mv88e6095_stats_get_stats,
|
||||
+ .stats_get_stat = mv88e6095_stats_get_stat,
|
||||
.set_cpu_port = mv88e6095_g1_set_cpu_port,
|
||||
.set_egress_port = mv88e6095_g1_set_egress_port,
|
||||
.watchdog_ops = &mv88e6097_watchdog_ops,
|
||||
@@ -5514,7 +5536,7 @@ static const struct mv88e6xxx_ops mv88e6390_ops = {
|
||||
.stats_set_histogram = mv88e6390_g1_stats_set_histogram,
|
||||
.stats_get_sset_count = mv88e6320_stats_get_sset_count,
|
||||
.stats_get_strings = mv88e6320_stats_get_strings,
|
||||
- .stats_get_stats = mv88e6390_stats_get_stats,
|
||||
+ .stats_get_stat = mv88e6390_stats_get_stat,
|
||||
.set_cpu_port = mv88e6390_g1_set_cpu_port,
|
||||
.set_egress_port = mv88e6390_g1_set_egress_port,
|
||||
.watchdog_ops = &mv88e6390_watchdog_ops,
|
||||
@@ -5583,7 +5605,7 @@ static const struct mv88e6xxx_ops mv88e6390x_ops = {
|
||||
.stats_set_histogram = mv88e6390_g1_stats_set_histogram,
|
||||
.stats_get_sset_count = mv88e6320_stats_get_sset_count,
|
||||
.stats_get_strings = mv88e6320_stats_get_strings,
|
||||
- .stats_get_stats = mv88e6390_stats_get_stats,
|
||||
+ .stats_get_stat = mv88e6390_stats_get_stat,
|
||||
.set_cpu_port = mv88e6390_g1_set_cpu_port,
|
||||
.set_egress_port = mv88e6390_g1_set_egress_port,
|
||||
.watchdog_ops = &mv88e6390_watchdog_ops,
|
||||
@@ -5652,7 +5674,7 @@ static const struct mv88e6xxx_ops mv88e6393x_ops = {
|
||||
.stats_set_histogram = mv88e6390_g1_stats_set_histogram,
|
||||
.stats_get_sset_count = mv88e6320_stats_get_sset_count,
|
||||
.stats_get_strings = mv88e6320_stats_get_strings,
|
||||
- .stats_get_stats = mv88e6390_stats_get_stats,
|
||||
+ .stats_get_stat = mv88e6390_stats_get_stat,
|
||||
/* .set_cpu_port is missing because this family does not support a global
|
||||
* CPU port, only per port CPU port which is set via
|
||||
* .port_set_upstream_port method.
|
||||
diff --git a/drivers/net/dsa/mv88e6xxx/chip.h b/drivers/net/dsa/mv88e6xxx/chip.h
|
||||
index 0ad34b2d8913..268c97cde8d8 100644
|
||||
--- a/drivers/net/dsa/mv88e6xxx/chip.h
|
||||
+++ b/drivers/net/dsa/mv88e6xxx/chip.h
|
||||
@@ -318,6 +318,17 @@ struct mv88e6xxx_mst {
|
||||
struct mv88e6xxx_stu_entry stu;
|
||||
};
|
||||
|
||||
+#define STATS_TYPE_PORT BIT(0)
|
||||
+#define STATS_TYPE_BANK0 BIT(1)
|
||||
+#define STATS_TYPE_BANK1 BIT(2)
|
||||
+
|
||||
+struct mv88e6xxx_hw_stat {
|
||||
+ char string[ETH_GSTRING_LEN];
|
||||
+ size_t size;
|
||||
+ int reg;
|
||||
+ int type;
|
||||
+};
|
||||
+
|
||||
struct mv88e6xxx_chip {
|
||||
const struct mv88e6xxx_info *info;
|
||||
|
||||
@@ -574,8 +585,9 @@ struct mv88e6xxx_ops {
|
||||
/* Return the number of strings describing statistics */
|
||||
int (*stats_get_sset_count)(struct mv88e6xxx_chip *chip);
|
||||
int (*stats_get_strings)(struct mv88e6xxx_chip *chip, uint8_t *data);
|
||||
- int (*stats_get_stats)(struct mv88e6xxx_chip *chip, int port,
|
||||
- uint64_t *data);
|
||||
+ int (*stats_get_stat)(struct mv88e6xxx_chip *chip, int port,
|
||||
+ const struct mv88e6xxx_hw_stat *stat,
|
||||
+ uint64_t *data);
|
||||
int (*set_cpu_port)(struct mv88e6xxx_chip *chip, int port);
|
||||
int (*set_egress_port)(struct mv88e6xxx_chip *chip,
|
||||
enum mv88e6xxx_egress_direction direction,
|
||||
@@ -736,17 +748,6 @@ struct mv88e6xxx_ptp_ops {
|
||||
u32 cc_mult_dem;
|
||||
};
|
||||
|
||||
-#define STATS_TYPE_PORT BIT(0)
|
||||
-#define STATS_TYPE_BANK0 BIT(1)
|
||||
-#define STATS_TYPE_BANK1 BIT(2)
|
||||
-
|
||||
-struct mv88e6xxx_hw_stat {
|
||||
- char string[ETH_GSTRING_LEN];
|
||||
- size_t size;
|
||||
- int reg;
|
||||
- int type;
|
||||
-};
|
||||
-
|
||||
static inline bool mv88e6xxx_has_stu(struct mv88e6xxx_chip *chip)
|
||||
{
|
||||
return chip->info->max_sid > 0 &&
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,196 @@
|
||||
From 63c14938bdaa1891386989aa46bee4571c1c0777 Mon Sep 17 00:00:00 2001
|
||||
From: Tobias Waldekranz <tobias@waldekranz.com>
|
||||
Date: Tue, 5 Sep 2023 21:10:15 +0200
|
||||
Subject: [PATCH 3/9] net: dsa: mv88e6xxx: Give each hw stat an ID
|
||||
|
||||
With the upcoming standard counter group support, we are no longer
|
||||
reading out the whole set of counters, but rather mapping a subset to
|
||||
the requested group.
|
||||
|
||||
Therefore, create an enum with an ID for each stat, such that
|
||||
mv88e6xxx_hw_stats[] can be subscripted with a human-readable ID
|
||||
corresponding to the counters name.
|
||||
|
||||
Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com>
|
||||
---
|
||||
drivers/net/dsa/mv88e6xxx/chip.c | 141 +++++++++++++++++--------------
|
||||
1 file changed, 78 insertions(+), 63 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c
|
||||
index 1e944cf08233..ea4fb0d3e628 100644
|
||||
--- a/drivers/net/dsa/mv88e6xxx/chip.c
|
||||
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
|
||||
@@ -1019,68 +1019,83 @@ static int mv88e6xxx_stats_snapshot(struct mv88e6xxx_chip *chip, int port)
|
||||
return chip->info->ops->stats_snapshot(chip, port);
|
||||
}
|
||||
|
||||
-static struct mv88e6xxx_hw_stat mv88e6xxx_hw_stats[] = {
|
||||
- { "in_good_octets", 8, 0x00, STATS_TYPE_BANK0, },
|
||||
- { "in_bad_octets", 4, 0x02, STATS_TYPE_BANK0, },
|
||||
- { "in_unicast", 4, 0x04, STATS_TYPE_BANK0, },
|
||||
- { "in_broadcasts", 4, 0x06, STATS_TYPE_BANK0, },
|
||||
- { "in_multicasts", 4, 0x07, STATS_TYPE_BANK0, },
|
||||
- { "in_pause", 4, 0x16, STATS_TYPE_BANK0, },
|
||||
- { "in_undersize", 4, 0x18, STATS_TYPE_BANK0, },
|
||||
- { "in_fragments", 4, 0x19, STATS_TYPE_BANK0, },
|
||||
- { "in_oversize", 4, 0x1a, STATS_TYPE_BANK0, },
|
||||
- { "in_jabber", 4, 0x1b, STATS_TYPE_BANK0, },
|
||||
- { "in_rx_error", 4, 0x1c, STATS_TYPE_BANK0, },
|
||||
- { "in_fcs_error", 4, 0x1d, STATS_TYPE_BANK0, },
|
||||
- { "out_octets", 8, 0x0e, STATS_TYPE_BANK0, },
|
||||
- { "out_unicast", 4, 0x10, STATS_TYPE_BANK0, },
|
||||
- { "out_broadcasts", 4, 0x13, STATS_TYPE_BANK0, },
|
||||
- { "out_multicasts", 4, 0x12, STATS_TYPE_BANK0, },
|
||||
- { "out_pause", 4, 0x15, STATS_TYPE_BANK0, },
|
||||
- { "excessive", 4, 0x11, STATS_TYPE_BANK0, },
|
||||
- { "collisions", 4, 0x1e, STATS_TYPE_BANK0, },
|
||||
- { "deferred", 4, 0x05, STATS_TYPE_BANK0, },
|
||||
- { "single", 4, 0x14, STATS_TYPE_BANK0, },
|
||||
- { "multiple", 4, 0x17, STATS_TYPE_BANK0, },
|
||||
- { "out_fcs_error", 4, 0x03, STATS_TYPE_BANK0, },
|
||||
- { "late", 4, 0x1f, STATS_TYPE_BANK0, },
|
||||
- { "hist_64bytes", 4, 0x08, STATS_TYPE_BANK0, },
|
||||
- { "hist_65_127bytes", 4, 0x09, STATS_TYPE_BANK0, },
|
||||
- { "hist_128_255bytes", 4, 0x0a, STATS_TYPE_BANK0, },
|
||||
- { "hist_256_511bytes", 4, 0x0b, STATS_TYPE_BANK0, },
|
||||
- { "hist_512_1023bytes", 4, 0x0c, STATS_TYPE_BANK0, },
|
||||
- { "hist_1024_max_bytes", 4, 0x0d, STATS_TYPE_BANK0, },
|
||||
- { "sw_in_discards", 4, 0x10, STATS_TYPE_PORT, },
|
||||
- { "sw_in_filtered", 2, 0x12, STATS_TYPE_PORT, },
|
||||
- { "sw_out_filtered", 2, 0x13, STATS_TYPE_PORT, },
|
||||
- { "in_discards", 4, 0x00, STATS_TYPE_BANK1, },
|
||||
- { "in_filtered", 4, 0x01, STATS_TYPE_BANK1, },
|
||||
- { "in_accepted", 4, 0x02, STATS_TYPE_BANK1, },
|
||||
- { "in_bad_accepted", 4, 0x03, STATS_TYPE_BANK1, },
|
||||
- { "in_good_avb_class_a", 4, 0x04, STATS_TYPE_BANK1, },
|
||||
- { "in_good_avb_class_b", 4, 0x05, STATS_TYPE_BANK1, },
|
||||
- { "in_bad_avb_class_a", 4, 0x06, STATS_TYPE_BANK1, },
|
||||
- { "in_bad_avb_class_b", 4, 0x07, STATS_TYPE_BANK1, },
|
||||
- { "tcam_counter_0", 4, 0x08, STATS_TYPE_BANK1, },
|
||||
- { "tcam_counter_1", 4, 0x09, STATS_TYPE_BANK1, },
|
||||
- { "tcam_counter_2", 4, 0x0a, STATS_TYPE_BANK1, },
|
||||
- { "tcam_counter_3", 4, 0x0b, STATS_TYPE_BANK1, },
|
||||
- { "in_da_unknown", 4, 0x0e, STATS_TYPE_BANK1, },
|
||||
- { "in_management", 4, 0x0f, STATS_TYPE_BANK1, },
|
||||
- { "out_queue_0", 4, 0x10, STATS_TYPE_BANK1, },
|
||||
- { "out_queue_1", 4, 0x11, STATS_TYPE_BANK1, },
|
||||
- { "out_queue_2", 4, 0x12, STATS_TYPE_BANK1, },
|
||||
- { "out_queue_3", 4, 0x13, STATS_TYPE_BANK1, },
|
||||
- { "out_queue_4", 4, 0x14, STATS_TYPE_BANK1, },
|
||||
- { "out_queue_5", 4, 0x15, STATS_TYPE_BANK1, },
|
||||
- { "out_queue_6", 4, 0x16, STATS_TYPE_BANK1, },
|
||||
- { "out_queue_7", 4, 0x17, STATS_TYPE_BANK1, },
|
||||
- { "out_cut_through", 4, 0x18, STATS_TYPE_BANK1, },
|
||||
- { "out_octets_a", 4, 0x1a, STATS_TYPE_BANK1, },
|
||||
- { "out_octets_b", 4, 0x1b, STATS_TYPE_BANK1, },
|
||||
- { "out_management", 4, 0x1f, STATS_TYPE_BANK1, },
|
||||
+#define MV88E6XXX_HW_STAT_MAPPER(_fn) \
|
||||
+ _fn(in_good_octets, 8, 0x00, STATS_TYPE_BANK0) \
|
||||
+ _fn(in_bad_octets, 4, 0x02, STATS_TYPE_BANK0) \
|
||||
+ _fn(in_unicast, 4, 0x04, STATS_TYPE_BANK0) \
|
||||
+ _fn(in_broadcasts, 4, 0x06, STATS_TYPE_BANK0) \
|
||||
+ _fn(in_multicasts, 4, 0x07, STATS_TYPE_BANK0) \
|
||||
+ _fn(in_pause, 4, 0x16, STATS_TYPE_BANK0) \
|
||||
+ _fn(in_undersize, 4, 0x18, STATS_TYPE_BANK0) \
|
||||
+ _fn(in_fragments, 4, 0x19, STATS_TYPE_BANK0) \
|
||||
+ _fn(in_oversize, 4, 0x1a, STATS_TYPE_BANK0) \
|
||||
+ _fn(in_jabber, 4, 0x1b, STATS_TYPE_BANK0) \
|
||||
+ _fn(in_rx_error, 4, 0x1c, STATS_TYPE_BANK0) \
|
||||
+ _fn(in_fcs_error, 4, 0x1d, STATS_TYPE_BANK0) \
|
||||
+ _fn(out_octets, 8, 0x0e, STATS_TYPE_BANK0) \
|
||||
+ _fn(out_unicast, 4, 0x10, STATS_TYPE_BANK0) \
|
||||
+ _fn(out_broadcasts, 4, 0x13, STATS_TYPE_BANK0) \
|
||||
+ _fn(out_multicasts, 4, 0x12, STATS_TYPE_BANK0) \
|
||||
+ _fn(out_pause, 4, 0x15, STATS_TYPE_BANK0) \
|
||||
+ _fn(excessive, 4, 0x11, STATS_TYPE_BANK0) \
|
||||
+ _fn(collisions, 4, 0x1e, STATS_TYPE_BANK0) \
|
||||
+ _fn(deferred, 4, 0x05, STATS_TYPE_BANK0) \
|
||||
+ _fn(single, 4, 0x14, STATS_TYPE_BANK0) \
|
||||
+ _fn(multiple, 4, 0x17, STATS_TYPE_BANK0) \
|
||||
+ _fn(out_fcs_error, 4, 0x03, STATS_TYPE_BANK0) \
|
||||
+ _fn(late, 4, 0x1f, STATS_TYPE_BANK0) \
|
||||
+ _fn(hist_64bytes, 4, 0x08, STATS_TYPE_BANK0) \
|
||||
+ _fn(hist_65_127bytes, 4, 0x09, STATS_TYPE_BANK0) \
|
||||
+ _fn(hist_128_255bytes, 4, 0x0a, STATS_TYPE_BANK0) \
|
||||
+ _fn(hist_256_511bytes, 4, 0x0b, STATS_TYPE_BANK0) \
|
||||
+ _fn(hist_512_1023bytes, 4, 0x0c, STATS_TYPE_BANK0) \
|
||||
+ _fn(hist_1024_max_bytes, 4, 0x0d, STATS_TYPE_BANK0) \
|
||||
+ _fn(sw_in_discards, 4, 0x10, STATS_TYPE_PORT) \
|
||||
+ _fn(sw_in_filtered, 2, 0x12, STATS_TYPE_PORT) \
|
||||
+ _fn(sw_out_filtered, 2, 0x13, STATS_TYPE_PORT) \
|
||||
+ _fn(in_discards, 4, 0x00, STATS_TYPE_BANK1) \
|
||||
+ _fn(in_filtered, 4, 0x01, STATS_TYPE_BANK1) \
|
||||
+ _fn(in_accepted, 4, 0x02, STATS_TYPE_BANK1) \
|
||||
+ _fn(in_bad_accepted, 4, 0x03, STATS_TYPE_BANK1) \
|
||||
+ _fn(in_good_avb_class_a, 4, 0x04, STATS_TYPE_BANK1) \
|
||||
+ _fn(in_good_avb_class_b, 4, 0x05, STATS_TYPE_BANK1) \
|
||||
+ _fn(in_bad_avb_class_a, 4, 0x06, STATS_TYPE_BANK1) \
|
||||
+ _fn(in_bad_avb_class_b, 4, 0x07, STATS_TYPE_BANK1) \
|
||||
+ _fn(tcam_counter_0, 4, 0x08, STATS_TYPE_BANK1) \
|
||||
+ _fn(tcam_counter_1, 4, 0x09, STATS_TYPE_BANK1) \
|
||||
+ _fn(tcam_counter_2, 4, 0x0a, STATS_TYPE_BANK1) \
|
||||
+ _fn(tcam_counter_3, 4, 0x0b, STATS_TYPE_BANK1) \
|
||||
+ _fn(in_da_unknown, 4, 0x0e, STATS_TYPE_BANK1) \
|
||||
+ _fn(in_management, 4, 0x0f, STATS_TYPE_BANK1) \
|
||||
+ _fn(out_queue_0, 4, 0x10, STATS_TYPE_BANK1) \
|
||||
+ _fn(out_queue_1, 4, 0x11, STATS_TYPE_BANK1) \
|
||||
+ _fn(out_queue_2, 4, 0x12, STATS_TYPE_BANK1) \
|
||||
+ _fn(out_queue_3, 4, 0x13, STATS_TYPE_BANK1) \
|
||||
+ _fn(out_queue_4, 4, 0x14, STATS_TYPE_BANK1) \
|
||||
+ _fn(out_queue_5, 4, 0x15, STATS_TYPE_BANK1) \
|
||||
+ _fn(out_queue_6, 4, 0x16, STATS_TYPE_BANK1) \
|
||||
+ _fn(out_queue_7, 4, 0x17, STATS_TYPE_BANK1) \
|
||||
+ _fn(out_cut_through, 4, 0x18, STATS_TYPE_BANK1) \
|
||||
+ _fn(out_octets_a, 4, 0x1a, STATS_TYPE_BANK1) \
|
||||
+ _fn(out_octets_b, 4, 0x1b, STATS_TYPE_BANK1) \
|
||||
+ _fn(out_management, 4, 0x1f, STATS_TYPE_BANK1) \
|
||||
+ /* */
|
||||
+
|
||||
+#define MV88E6XXX_HW_STAT_ENTRY(_string, _size, _reg, _type) \
|
||||
+ { #_string, _size, _reg, _type },
|
||||
+static const struct mv88e6xxx_hw_stat mv88e6xxx_hw_stats[] = {
|
||||
+ MV88E6XXX_HW_STAT_MAPPER(MV88E6XXX_HW_STAT_ENTRY)
|
||||
};
|
||||
|
||||
+#define MV88E6XXX_HW_STAT_ENUM(_string, _size, _reg, _type) \
|
||||
+ MV88E6XXX_HW_STAT_ID_ ## _string,
|
||||
+enum mv88e6xxx_hw_stat_id {
|
||||
+ MV88E6XXX_HW_STAT_MAPPER(MV88E6XXX_HW_STAT_ENUM)
|
||||
+
|
||||
+ MV88E6XXX_HW_STAT_ID_MAX
|
||||
+};
|
||||
+
|
||||
+
|
||||
static uint64_t _mv88e6xxx_get_ethtool_stat(struct mv88e6xxx_chip *chip,
|
||||
const struct mv88e6xxx_hw_stat *s,
|
||||
int port, u16 bank1_select,
|
||||
@@ -1125,7 +1140,7 @@ static uint64_t _mv88e6xxx_get_ethtool_stat(struct mv88e6xxx_chip *chip,
|
||||
static int mv88e6xxx_stats_get_strings(struct mv88e6xxx_chip *chip,
|
||||
uint8_t *data, int types)
|
||||
{
|
||||
- struct mv88e6xxx_hw_stat *stat;
|
||||
+ const struct mv88e6xxx_hw_stat *stat;
|
||||
int i, j;
|
||||
|
||||
for (i = 0, j = 0; i < ARRAY_SIZE(mv88e6xxx_hw_stats); i++) {
|
||||
@@ -1206,7 +1221,7 @@ static void mv88e6xxx_get_strings(struct dsa_switch *ds, int port,
|
||||
static int mv88e6xxx_stats_get_sset_count(struct mv88e6xxx_chip *chip,
|
||||
int types)
|
||||
{
|
||||
- struct mv88e6xxx_hw_stat *stat;
|
||||
+ const struct mv88e6xxx_hw_stat *stat;
|
||||
int i, j;
|
||||
|
||||
for (i = 0, j = 0; i < ARRAY_SIZE(mv88e6xxx_hw_stats); i++) {
|
||||
@@ -1333,7 +1348,7 @@ static int mv88e6xxx_stats_get_stat(struct mv88e6xxx_chip *chip, int port,
|
||||
static int mv88e6xxx_stats_get_stats(struct mv88e6xxx_chip *chip, int port,
|
||||
uint64_t *data)
|
||||
{
|
||||
- struct mv88e6xxx_hw_stat *stat;
|
||||
+ const struct mv88e6xxx_hw_stat *stat;
|
||||
int i, j;
|
||||
|
||||
for (i = 0, j = 0; i < ARRAY_SIZE(mv88e6xxx_hw_stats); i++) {
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,86 @@
|
||||
From ffd5442fcbadcbd8733b9ac870d83d7561cca9fc Mon Sep 17 00:00:00 2001
|
||||
From: Tobias Waldekranz <tobias@waldekranz.com>
|
||||
Date: Tue, 5 Sep 2023 21:15:52 +0200
|
||||
Subject: [PATCH 4/9] net: dsa: mv88e6xxx: Add "eth-mac" counter group support
|
||||
|
||||
After this change, mv88e6xxx ports can report the applicable subset of
|
||||
their counters using ethtool's standardized "eth-mac" counter group.
|
||||
|
||||
Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com>
|
||||
---
|
||||
drivers/net/dsa/mv88e6xxx/chip.c | 52 ++++++++++++++++++++++++++++++++
|
||||
1 file changed, 52 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c
|
||||
index ea4fb0d3e628..ec3a4717bc44 100644
|
||||
--- a/drivers/net/dsa/mv88e6xxx/chip.c
|
||||
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
|
||||
@@ -1403,6 +1403,57 @@ static void mv88e6xxx_get_ethtool_stats(struct dsa_switch *ds, int port,
|
||||
|
||||
}
|
||||
|
||||
+static void mv88e6xxx_get_eth_mac_stats(struct dsa_switch *ds, int port,
|
||||
+ struct ethtool_eth_mac_stats *mac_stats)
|
||||
+{
|
||||
+#define MV88E6XXX_ETH_MAC_STAT_MAPPING(_id, _member) \
|
||||
+ [MV88E6XXX_HW_STAT_ID_ ## _id] = \
|
||||
+ offsetof(struct ethtool_eth_mac_stats, stats._member) \
|
||||
+
|
||||
+ static const size_t stat_map[MV88E6XXX_HW_STAT_ID_MAX] = {
|
||||
+ MV88E6XXX_ETH_MAC_STAT_MAPPING(out_unicast, FramesTransmittedOK),
|
||||
+ MV88E6XXX_ETH_MAC_STAT_MAPPING(single, SingleCollisionFrames),
|
||||
+ MV88E6XXX_ETH_MAC_STAT_MAPPING(multiple, MultipleCollisionFrames),
|
||||
+ MV88E6XXX_ETH_MAC_STAT_MAPPING(in_unicast, FramesReceivedOK),
|
||||
+ MV88E6XXX_ETH_MAC_STAT_MAPPING(in_fcs_error, FrameCheckSequenceErrors),
|
||||
+ MV88E6XXX_ETH_MAC_STAT_MAPPING(out_octets, OctetsTransmittedOK),
|
||||
+ MV88E6XXX_ETH_MAC_STAT_MAPPING(deferred, FramesWithDeferredXmissions),
|
||||
+ MV88E6XXX_ETH_MAC_STAT_MAPPING(late, LateCollisions),
|
||||
+ MV88E6XXX_ETH_MAC_STAT_MAPPING(in_good_octets, OctetsReceivedOK),
|
||||
+ MV88E6XXX_ETH_MAC_STAT_MAPPING(out_multicasts, MulticastFramesXmittedOK),
|
||||
+ MV88E6XXX_ETH_MAC_STAT_MAPPING(out_broadcasts, BroadcastFramesXmittedOK),
|
||||
+ MV88E6XXX_ETH_MAC_STAT_MAPPING(excessive, FramesWithExcessiveDeferral),
|
||||
+ MV88E6XXX_ETH_MAC_STAT_MAPPING(in_multicasts, MulticastFramesReceivedOK),
|
||||
+ MV88E6XXX_ETH_MAC_STAT_MAPPING(in_broadcasts, BroadcastFramesReceivedOK),
|
||||
+ };
|
||||
+ struct mv88e6xxx_chip *chip = ds->priv;
|
||||
+ const struct mv88e6xxx_hw_stat *stat;
|
||||
+ enum mv88e6xxx_hw_stat_id id;
|
||||
+ u64 *member;
|
||||
+ int ret;
|
||||
+
|
||||
+ mv88e6xxx_reg_lock(chip);
|
||||
+ ret = mv88e6xxx_stats_snapshot(chip, port);
|
||||
+ mv88e6xxx_reg_unlock(chip);
|
||||
+
|
||||
+ if (ret < 0)
|
||||
+ return;
|
||||
+
|
||||
+ stat = mv88e6xxx_hw_stats;
|
||||
+ for (id = 0; id < MV88E6XXX_HW_STAT_ID_MAX; id++, stat++) {
|
||||
+ if (!stat_map[id])
|
||||
+ continue;
|
||||
+
|
||||
+ member = (u64 *)(((char *)mac_stats) + stat_map[id]);
|
||||
+ mv88e6xxx_stats_get_stat(chip, port, stat, member);
|
||||
+ }
|
||||
+
|
||||
+ mac_stats->stats.FramesTransmittedOK += mac_stats->stats.MulticastFramesXmittedOK;
|
||||
+ mac_stats->stats.FramesTransmittedOK += mac_stats->stats.BroadcastFramesXmittedOK;
|
||||
+ mac_stats->stats.FramesReceivedOK += mac_stats->stats.MulticastFramesReceivedOK;
|
||||
+ mac_stats->stats.FramesReceivedOK += mac_stats->stats.BroadcastFramesReceivedOK;
|
||||
+}
|
||||
+
|
||||
static int mv88e6xxx_get_regs_len(struct dsa_switch *ds, int port)
|
||||
{
|
||||
struct mv88e6xxx_chip *chip = ds->priv;
|
||||
@@ -7160,6 +7211,7 @@ static const struct dsa_switch_ops mv88e6xxx_switch_ops = {
|
||||
.phylink_mac_link_up = mv88e6xxx_mac_link_up,
|
||||
.get_strings = mv88e6xxx_get_strings,
|
||||
.get_ethtool_stats = mv88e6xxx_get_ethtool_stats,
|
||||
+ .get_eth_mac_stats = mv88e6xxx_get_eth_mac_stats,
|
||||
.get_sset_count = mv88e6xxx_get_sset_count,
|
||||
.port_enable = mv88e6xxx_port_enable,
|
||||
.port_disable = mv88e6xxx_port_disable,
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
From 2cfafa598282efc980baf00b312a61032b9f5aa9 Mon Sep 17 00:00:00 2001
|
||||
From: Tobias Waldekranz <tobias@waldekranz.com>
|
||||
Date: Wed, 6 Sep 2023 10:55:53 +0200
|
||||
Subject: [PATCH 5/9] net: dsa: mv88e6xxx: Add "rmon" counter group support
|
||||
|
||||
After this change, mv88e6xxx ports can report the applicable subset of
|
||||
their counters using ethtool's standardized "rmon" counter group.
|
||||
|
||||
Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com>
|
||||
---
|
||||
drivers/net/dsa/mv88e6xxx/chip.c | 56 ++++++++++++++++++++++++++++++++
|
||||
1 file changed, 56 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c
|
||||
index ec3a4717bc44..eb5990cfc7d4 100644
|
||||
--- a/drivers/net/dsa/mv88e6xxx/chip.c
|
||||
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
|
||||
@@ -1454,6 +1454,61 @@ static void mv88e6xxx_get_eth_mac_stats(struct dsa_switch *ds, int port,
|
||||
mac_stats->stats.FramesReceivedOK += mac_stats->stats.BroadcastFramesReceivedOK;
|
||||
}
|
||||
|
||||
+static void mv88e6xxx_get_rmon_stats(struct dsa_switch *ds, int port,
|
||||
+ struct ethtool_rmon_stats *rmon_stats,
|
||||
+ const struct ethtool_rmon_hist_range **ranges)
|
||||
+{
|
||||
+#define MV88E6XXX_RMON_STAT_MAPPING(_id, _member) \
|
||||
+ [MV88E6XXX_HW_STAT_ID_ ## _id] = \
|
||||
+ offsetof(struct ethtool_rmon_stats, stats._member) \
|
||||
+
|
||||
+ static const size_t stat_map[MV88E6XXX_HW_STAT_ID_MAX] = {
|
||||
+ MV88E6XXX_RMON_STAT_MAPPING(in_undersize, undersize_pkts),
|
||||
+ MV88E6XXX_RMON_STAT_MAPPING(in_oversize, oversize_pkts),
|
||||
+ MV88E6XXX_RMON_STAT_MAPPING(in_fragments, fragments),
|
||||
+ MV88E6XXX_RMON_STAT_MAPPING(in_jabber, jabbers),
|
||||
+ MV88E6XXX_RMON_STAT_MAPPING(hist_64bytes, hist[0]),
|
||||
+ MV88E6XXX_RMON_STAT_MAPPING(hist_65_127bytes, hist[1]),
|
||||
+ MV88E6XXX_RMON_STAT_MAPPING(hist_128_255bytes, hist[2]),
|
||||
+ MV88E6XXX_RMON_STAT_MAPPING(hist_256_511bytes, hist[3]),
|
||||
+ MV88E6XXX_RMON_STAT_MAPPING(hist_512_1023bytes, hist[4]),
|
||||
+ MV88E6XXX_RMON_STAT_MAPPING(hist_1024_max_bytes, hist[5]),
|
||||
+ };
|
||||
+ static const struct ethtool_rmon_hist_range rmon_ranges[] = {
|
||||
+ { 64, 64 },
|
||||
+ { 65, 127 },
|
||||
+ { 128, 255 },
|
||||
+ { 256, 511 },
|
||||
+ { 512, 1023 },
|
||||
+ { 1024, 65535 },
|
||||
+ {}
|
||||
+ };
|
||||
+ struct mv88e6xxx_chip *chip = ds->priv;
|
||||
+ const struct mv88e6xxx_hw_stat *stat;
|
||||
+ enum mv88e6xxx_hw_stat_id id;
|
||||
+ u64 *member;
|
||||
+ int ret;
|
||||
+
|
||||
+ mv88e6xxx_reg_lock(chip);
|
||||
+ ret = mv88e6xxx_stats_snapshot(chip, port);
|
||||
+ mv88e6xxx_reg_unlock(chip);
|
||||
+
|
||||
+ if (ret < 0)
|
||||
+ return;
|
||||
+
|
||||
+ stat = mv88e6xxx_hw_stats;
|
||||
+ for (id = 0; id < MV88E6XXX_HW_STAT_ID_MAX; id++, stat++) {
|
||||
+ if (!stat_map[id])
|
||||
+ continue;
|
||||
+
|
||||
+ member = (u64 *)(((char *)rmon_stats) + stat_map[id]);
|
||||
+ mv88e6xxx_stats_get_stat(chip, port, stat, member);
|
||||
+ }
|
||||
+
|
||||
+ *ranges = rmon_ranges;
|
||||
+}
|
||||
+
|
||||
+
|
||||
static int mv88e6xxx_get_regs_len(struct dsa_switch *ds, int port)
|
||||
{
|
||||
struct mv88e6xxx_chip *chip = ds->priv;
|
||||
@@ -7212,6 +7267,7 @@ static const struct dsa_switch_ops mv88e6xxx_switch_ops = {
|
||||
.get_strings = mv88e6xxx_get_strings,
|
||||
.get_ethtool_stats = mv88e6xxx_get_ethtool_stats,
|
||||
.get_eth_mac_stats = mv88e6xxx_get_eth_mac_stats,
|
||||
+ .get_rmon_stats = mv88e6xxx_get_rmon_stats,
|
||||
.get_sset_count = mv88e6xxx_get_sset_count,
|
||||
.port_enable = mv88e6xxx_port_enable,
|
||||
.port_disable = mv88e6xxx_port_disable,
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
From 7abdce276172fe74e24fd30d204a75e388bbab6c Mon Sep 17 00:00:00 2001
|
||||
From: Tobias Waldekranz <tobias@waldekranz.com>
|
||||
Date: Thu, 21 Sep 2023 11:10:26 +0200
|
||||
Subject: [PATCH 6/9] arm64: dts: marvell: cp11x: Provide clock names for MDIO
|
||||
controllers
|
||||
|
||||
This will let the driver figure out the rate of the core clk, such
|
||||
that custom MDC frequencies can be supported.
|
||||
|
||||
Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com>
|
||||
---
|
||||
arch/arm64/boot/dts/marvell/armada-cp11x.dtsi | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/marvell/armada-cp11x.dtsi b/arch/arm64/boot/dts/marvell/armada-cp11x.dtsi
|
||||
index 4ec1aae0a3a9..f268017498a9 100644
|
||||
--- a/arch/arm64/boot/dts/marvell/armada-cp11x.dtsi
|
||||
+++ b/arch/arm64/boot/dts/marvell/armada-cp11x.dtsi
|
||||
@@ -180,6 +180,8 @@ CP11X_LABEL(mdio): mdio@12a200 {
|
||||
reg = <0x12a200 0x10>;
|
||||
clocks = <&CP11X_LABEL(clk) 1 9>, <&CP11X_LABEL(clk) 1 5>,
|
||||
<&CP11X_LABEL(clk) 1 6>, <&CP11X_LABEL(clk) 1 18>;
|
||||
+ clock-names = "gop_clk", "mg_clk",
|
||||
+ "mg_core_clk", "axi_clk";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@@ -190,6 +192,8 @@ CP11X_LABEL(xmdio): mdio@12a600 {
|
||||
reg = <0x12a600 0x10>;
|
||||
clocks = <&CP11X_LABEL(clk) 1 5>,
|
||||
<&CP11X_LABEL(clk) 1 6>, <&CP11X_LABEL(clk) 1 18>;
|
||||
+ clock-names = "mg_clk",
|
||||
+ "mg_core_clk", "axi_clk";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,119 @@
|
||||
From 8dc464b6506fbc038ccdae0a88936989fdf32117 Mon Sep 17 00:00:00 2001
|
||||
From: Tobias Waldekranz <tobias@waldekranz.com>
|
||||
Date: Tue, 19 Sep 2023 18:19:40 +0200
|
||||
Subject: [PATCH 7/9] net: mvmdio: Avoid excessive sleeps in polled mode
|
||||
|
||||
Before this change, when operating in polled mode, i.e. no IRQ is
|
||||
available, every individual C45 access would be hit with a 150us sleep
|
||||
after the bus access.
|
||||
|
||||
For example, on a board with a CN9130 SoC connected to an MV88X3310
|
||||
PHY, a single C45 read would take around 165us:
|
||||
|
||||
root@infix:~$ mdio f212a600.mdio-mii mmd 4:1 bench 0xc003
|
||||
Performed 1000 reads in 165ms
|
||||
|
||||
By replacing the long sleep with a tighter poll loop, we observe a 10x
|
||||
increase in bus throughput:
|
||||
|
||||
root@infix:~$ mdio f212a600.mdio-mii mmd 4:1 bench 0xc003
|
||||
Performed 1000 reads in 15ms
|
||||
|
||||
Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com>
|
||||
---
|
||||
drivers/net/ethernet/marvell/mvmdio.c | 41 +++++++++++----------------
|
||||
1 file changed, 16 insertions(+), 25 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/marvell/mvmdio.c b/drivers/net/ethernet/marvell/mvmdio.c
|
||||
index 8662543ca5c8..37e20c2702b5 100644
|
||||
--- a/drivers/net/ethernet/marvell/mvmdio.c
|
||||
+++ b/drivers/net/ethernet/marvell/mvmdio.c
|
||||
@@ -23,6 +23,7 @@
|
||||
#include <linux/delay.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/io.h>
|
||||
+#include <linux/iopoll.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of_device.h>
|
||||
@@ -58,11 +59,6 @@
|
||||
* - Armada 370 (Globalscale Mirabox): 41us to 43us (Polled)
|
||||
*/
|
||||
#define MVMDIO_SMI_TIMEOUT 1000 /* 1000us = 1ms */
|
||||
-#define MVMDIO_SMI_POLL_INTERVAL_MIN 45
|
||||
-#define MVMDIO_SMI_POLL_INTERVAL_MAX 55
|
||||
-
|
||||
-#define MVMDIO_XSMI_POLL_INTERVAL_MIN 150
|
||||
-#define MVMDIO_XSMI_POLL_INTERVAL_MAX 160
|
||||
|
||||
struct orion_mdio_dev {
|
||||
void __iomem *regs;
|
||||
@@ -84,8 +80,6 @@ enum orion_mdio_bus_type {
|
||||
|
||||
struct orion_mdio_ops {
|
||||
int (*is_done)(struct orion_mdio_dev *);
|
||||
- unsigned int poll_interval_min;
|
||||
- unsigned int poll_interval_max;
|
||||
};
|
||||
|
||||
/* Wait for the SMI unit to be ready for another operation
|
||||
@@ -94,23 +88,24 @@ static int orion_mdio_wait_ready(const struct orion_mdio_ops *ops,
|
||||
struct mii_bus *bus)
|
||||
{
|
||||
struct orion_mdio_dev *dev = bus->priv;
|
||||
- unsigned long timeout = usecs_to_jiffies(MVMDIO_SMI_TIMEOUT);
|
||||
- unsigned long end = jiffies + timeout;
|
||||
- int timedout = 0;
|
||||
+ unsigned long end, timeout;
|
||||
+ int done, timedout;
|
||||
|
||||
- while (1) {
|
||||
- if (ops->is_done(dev))
|
||||
+ if (dev->err_interrupt <= 0) {
|
||||
+ if (!read_poll_timeout_atomic(ops->is_done, done, done, 2,
|
||||
+ MVMDIO_SMI_TIMEOUT, false, dev))
|
||||
return 0;
|
||||
- else if (timedout)
|
||||
- break;
|
||||
-
|
||||
- if (dev->err_interrupt <= 0) {
|
||||
- usleep_range(ops->poll_interval_min,
|
||||
- ops->poll_interval_max);
|
||||
+ } else {
|
||||
+ timeout = usecs_to_jiffies(MVMDIO_SMI_TIMEOUT);
|
||||
+ end = jiffies + timeout;
|
||||
+ timedout = 0;
|
||||
+
|
||||
+ while (1) {
|
||||
+ if (ops->is_done(dev))
|
||||
+ return 0;
|
||||
+ else if (timedout)
|
||||
+ break;
|
||||
|
||||
- if (time_is_before_jiffies(end))
|
||||
- ++timedout;
|
||||
- } else {
|
||||
/* wait_event_timeout does not guarantee a delay of at
|
||||
* least one whole jiffie, so timeout must be no less
|
||||
* than two.
|
||||
@@ -135,8 +130,6 @@ static int orion_mdio_smi_is_done(struct orion_mdio_dev *dev)
|
||||
|
||||
static const struct orion_mdio_ops orion_mdio_smi_ops = {
|
||||
.is_done = orion_mdio_smi_is_done,
|
||||
- .poll_interval_min = MVMDIO_SMI_POLL_INTERVAL_MIN,
|
||||
- .poll_interval_max = MVMDIO_SMI_POLL_INTERVAL_MAX,
|
||||
};
|
||||
|
||||
static int orion_mdio_smi_read(struct mii_bus *bus, int mii_id,
|
||||
@@ -194,8 +187,6 @@ static int orion_mdio_xsmi_is_done(struct orion_mdio_dev *dev)
|
||||
|
||||
static const struct orion_mdio_ops orion_mdio_xsmi_ops = {
|
||||
.is_done = orion_mdio_xsmi_is_done,
|
||||
- .poll_interval_min = MVMDIO_XSMI_POLL_INTERVAL_MIN,
|
||||
- .poll_interval_max = MVMDIO_XSMI_POLL_INTERVAL_MAX,
|
||||
};
|
||||
|
||||
static int orion_mdio_xsmi_read_c45(struct mii_bus *bus, int mii_id,
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,88 @@
|
||||
From 1956176490d4eec3a889a38626326b375782a55a Mon Sep 17 00:00:00 2001
|
||||
From: Tobias Waldekranz <tobias@waldekranz.com>
|
||||
Date: Thu, 21 Sep 2023 11:12:55 +0200
|
||||
Subject: [PATCH 8/9] net: mvmdio: Support setting the MDC frequency on XSMI
|
||||
controllers
|
||||
|
||||
Support the standard "clock-frequency" attribute to set the generated
|
||||
MDC frequency. If not specified, the driver will leave the divisor
|
||||
untouched.
|
||||
|
||||
Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com>
|
||||
---
|
||||
drivers/net/ethernet/marvell/mvmdio.c | 45 +++++++++++++++++++++++++++
|
||||
1 file changed, 45 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/ethernet/marvell/mvmdio.c b/drivers/net/ethernet/marvell/mvmdio.c
|
||||
index 37e20c2702b5..a33f63b7f773 100644
|
||||
--- a/drivers/net/ethernet/marvell/mvmdio.c
|
||||
+++ b/drivers/net/ethernet/marvell/mvmdio.c
|
||||
@@ -53,6 +53,13 @@
|
||||
#define MVMDIO_XSMI_BUSY BIT(30)
|
||||
#define MVMDIO_XSMI_ADDR_REG 0x8
|
||||
|
||||
+#define MVMDIO_XSMI_CFG_REG 0xc
|
||||
+#define MVMDIO_XSMI_CLKDIV_MASK 0x3
|
||||
+#define MVMDIO_XSMI_CLKDIV_256 0x0
|
||||
+#define MVMDIO_XSMI_CLKDIV_64 0x1
|
||||
+#define MVMDIO_XSMI_CLKDIV_32 0x2
|
||||
+#define MVMDIO_XSMI_CLKDIV_8 0x3
|
||||
+
|
||||
/*
|
||||
* SMI Timeout measurements:
|
||||
* - Kirkwood 88F6281 (Globalscale Dreamplug): 45us to 95us (Interrupt)
|
||||
@@ -237,6 +244,41 @@ static int orion_mdio_xsmi_write_c45(struct mii_bus *bus, int mii_id,
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static void orion_mdio_xsmi_set_mdc_freq(struct mii_bus *bus)
|
||||
+{
|
||||
+ struct orion_mdio_dev *dev = bus->priv;
|
||||
+ struct clk *mg_core;
|
||||
+ u32 div, freq, cfg;
|
||||
+
|
||||
+ if (device_property_read_u32(bus->parent, "clock-frequency", &freq))
|
||||
+ return;
|
||||
+
|
||||
+ mg_core = of_clk_get_by_name(bus->parent->of_node, "mg_core_clk");
|
||||
+ if (IS_ERR(mg_core)) {
|
||||
+ dev_err(bus->parent,
|
||||
+ "MG core clock unknown, not changing MDC frequency");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ div = clk_get_rate(mg_core) / (freq + 1) + 1;
|
||||
+ clk_put(mg_core);
|
||||
+
|
||||
+ if (div <= 8)
|
||||
+ div = MVMDIO_XSMI_CLKDIV_8;
|
||||
+ else if (div <= 32)
|
||||
+ div = MVMDIO_XSMI_CLKDIV_32;
|
||||
+ else if (div <= 64)
|
||||
+ div = MVMDIO_XSMI_CLKDIV_64;
|
||||
+ else
|
||||
+ div = MVMDIO_XSMI_CLKDIV_256;
|
||||
+
|
||||
+ cfg = readl(dev->regs + MVMDIO_XSMI_CFG_REG);
|
||||
+ cfg &= ~MVMDIO_XSMI_CLKDIV_MASK;
|
||||
+ cfg |= div;
|
||||
+ writel(cfg, dev->regs + MVMDIO_XSMI_CFG_REG);
|
||||
+}
|
||||
+
|
||||
+
|
||||
static irqreturn_t orion_mdio_err_irq(int irq, void *dev_id)
|
||||
{
|
||||
struct orion_mdio_dev *dev = dev_id;
|
||||
@@ -315,6 +357,9 @@ static int orion_mdio_probe(struct platform_device *pdev)
|
||||
dev_warn(&pdev->dev,
|
||||
"unsupported number of clocks, limiting to the first "
|
||||
__stringify(ARRAY_SIZE(dev->clk)) "\n");
|
||||
+
|
||||
+ if (type == BUS_TYPE_XSMI)
|
||||
+ orion_mdio_xsmi_set_mdc_freq(bus);
|
||||
} else {
|
||||
dev->clk[0] = clk_get(&pdev->dev, NULL);
|
||||
if (PTR_ERR(dev->clk[0]) == -EPROBE_DEFER) {
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,198 @@
|
||||
From 0de9c5dfc6395eb2e3066488638ac86de58b8068 Mon Sep 17 00:00:00 2001
|
||||
From: Tobias Waldekranz <tobias@waldekranz.com>
|
||||
Date: Tue, 19 Sep 2023 18:38:10 +0200
|
||||
Subject: [PATCH 9/9] net: phy: marvell10g: Support firmware loading on 88X3310
|
||||
|
||||
If a device is found waiting for firmware to be loaded into its RAM,
|
||||
ask userspace for the binary and load it over XMDIO.
|
||||
|
||||
Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com>
|
||||
---
|
||||
drivers/net/phy/marvell10g.c | 143 +++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 143 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/phy/marvell10g.c b/drivers/net/phy/marvell10g.c
|
||||
index d4bb90d76881..155f439d9c1c 100644
|
||||
--- a/drivers/net/phy/marvell10g.c
|
||||
+++ b/drivers/net/phy/marvell10g.c
|
||||
@@ -25,6 +25,7 @@
|
||||
#include <linux/bitfield.h>
|
||||
#include <linux/ctype.h>
|
||||
#include <linux/delay.h>
|
||||
+#include <linux/firmware.h>
|
||||
#include <linux/hwmon.h>
|
||||
#include <linux/marvell_phy.h>
|
||||
#include <linux/phy.h>
|
||||
@@ -50,6 +51,13 @@ enum {
|
||||
MV_PMA_21X0_PORT_CTRL_MACTYPE_10GBASER_RATE_MATCH = 0x6,
|
||||
MV_PMA_BOOT = 0xc050,
|
||||
MV_PMA_BOOT_FATAL = BIT(0),
|
||||
+ MV_PMA_BOOT_PRGS_MASK = 0x0006,
|
||||
+ MV_PMA_BOOT_PRGS_INIT = 0x0000,
|
||||
+ MV_PMA_BOOT_PRGS_WAIT = 0x0002,
|
||||
+ MV_PMA_BOOT_PRGS_CSUM = 0x0004,
|
||||
+ MV_PMA_BOOT_PRGS_JRAM = 0x0006,
|
||||
+ MV_PMA_BOOT_APP_STARTED = BIT(4),
|
||||
+ MV_PMA_BOOT_APP_LOADED = BIT(6),
|
||||
|
||||
MV_PCS_BASE_T = 0x0000,
|
||||
MV_PCS_BASE_R = 0x1000,
|
||||
@@ -96,6 +104,12 @@ enum {
|
||||
MV_PCS_PORT_INFO_NPORTS_MASK = 0x0380,
|
||||
MV_PCS_PORT_INFO_NPORTS_SHIFT = 7,
|
||||
|
||||
+ /* Firmware downloading */
|
||||
+ MV_PCS_FW_ADDR_LOW = 0xd0f0,
|
||||
+ MV_PCS_FW_ADDR_HIGH = 0xd0f1,
|
||||
+ MV_PCS_FW_DATA = 0xd0f2,
|
||||
+ MV_PCS_FW_CSUM = 0xd0f3,
|
||||
+
|
||||
/* SerDes reinitialization 88E21X0 */
|
||||
MV_AN_21X0_SERDES_CTRL2 = 0x800f,
|
||||
MV_AN_21X0_SERDES_CTRL2_AUTO_INIT_DIS = BIT(13),
|
||||
@@ -499,6 +513,129 @@ static const struct sfp_upstream_ops mv3310_sfp_ops = {
|
||||
.module_insert = mv3310_sfp_insert,
|
||||
};
|
||||
|
||||
+struct mv3310_fw_hdr {
|
||||
+ struct {
|
||||
+ u32 size;
|
||||
+ u32 addr;
|
||||
+ u16 csum;
|
||||
+ } __packed data;
|
||||
+
|
||||
+ u8 flags;
|
||||
+#define MV3310_FW_HDR_DATA_ONLY BIT(6)
|
||||
+
|
||||
+ u8 port_skip;
|
||||
+ u32 next_hdr;
|
||||
+ u16 csum;
|
||||
+
|
||||
+ u8 pad[14];
|
||||
+} __packed;
|
||||
+
|
||||
+static int mv3310_load_fw_sect(struct phy_device *phydev,
|
||||
+ const struct mv3310_fw_hdr *hdr, const u8 *data)
|
||||
+{
|
||||
+ int err = 0;
|
||||
+ size_t i;
|
||||
+ u16 csum;
|
||||
+
|
||||
+ dev_dbg(&phydev->mdio.dev, "Loading %u byte %s section at 0x%08x\n",
|
||||
+ hdr->data.size,
|
||||
+ (hdr->flags & MV3310_FW_HDR_DATA_ONLY) ? "data" : "executable",
|
||||
+ hdr->data.addr);
|
||||
+
|
||||
+ for (i = 0, csum = 0; i < hdr->data.size; i++)
|
||||
+ csum += data[i];
|
||||
+
|
||||
+ if ((u16)~csum != hdr->data.csum) {
|
||||
+ dev_err(&phydev->mdio.dev, "Corrupt section data\n");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ phy_lock_mdio_bus(phydev);
|
||||
+
|
||||
+ /* Any existing checksum is cleared by a read */
|
||||
+ __phy_read_mmd(phydev, MDIO_MMD_PCS, MV_PCS_FW_CSUM);
|
||||
+
|
||||
+ __phy_write_mmd(phydev, MDIO_MMD_PCS, MV_PCS_FW_ADDR_LOW, hdr->data.addr & 0xffff);
|
||||
+ __phy_write_mmd(phydev, MDIO_MMD_PCS, MV_PCS_FW_ADDR_HIGH, hdr->data.addr >> 16);
|
||||
+
|
||||
+ for (i = 0; i < hdr->data.size; i += 2) {
|
||||
+ __phy_write_mmd(phydev, MDIO_MMD_PCS, MV_PCS_FW_DATA,
|
||||
+ (data[i + 1] << 8) | data[i]);
|
||||
+ }
|
||||
+
|
||||
+ csum = __phy_read_mmd(phydev, MDIO_MMD_PCS, MV_PCS_FW_CSUM);
|
||||
+ if ((u16)~csum != hdr->data.csum) {
|
||||
+ dev_err(&phydev->mdio.dev, "Download failed\n");
|
||||
+ err = -EIO;
|
||||
+ goto unlock;
|
||||
+ }
|
||||
+
|
||||
+ if (hdr->flags & MV3310_FW_HDR_DATA_ONLY)
|
||||
+ goto unlock;
|
||||
+
|
||||
+ __phy_modify_mmd(phydev, MDIO_MMD_PMAPMD, MV_PMA_BOOT, 0, MV_PMA_BOOT_APP_LOADED);
|
||||
+ mdelay(200);
|
||||
+ if (!(__phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MV_PMA_BOOT) & MV_PMA_BOOT_APP_STARTED)) {
|
||||
+ dev_err(&phydev->mdio.dev, "Application did not startup\n");
|
||||
+ err = -ENOSYS;
|
||||
+ }
|
||||
+
|
||||
+unlock:
|
||||
+ phy_unlock_mdio_bus(phydev);
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
+static int mv3310_load_fw(struct phy_device *phydev)
|
||||
+{
|
||||
+ const struct firmware *fw;
|
||||
+ struct mv3310_fw_hdr hdr;
|
||||
+ const u8 *sect;
|
||||
+ size_t i;
|
||||
+ u16 csum;
|
||||
+ int err;
|
||||
+
|
||||
+ /* dev_info(&phydev->mdio.dev, "Requ */
|
||||
+ err = request_firmware(&fw, "x33x0fw.hdr", &phydev->mdio.dev);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+
|
||||
+ if (fw->size & 1) {
|
||||
+ err = -EINVAL;
|
||||
+ goto release;
|
||||
+ }
|
||||
+
|
||||
+ for (sect = fw->data; (sect + sizeof(hdr)) < (fw->data + fw->size);) {
|
||||
+ memcpy(&hdr, sect, sizeof(hdr));
|
||||
+ hdr.data.size = cpu_to_le32(hdr.data.size);
|
||||
+ hdr.data.addr = cpu_to_le32(hdr.data.addr);
|
||||
+ hdr.data.csum = cpu_to_le16(hdr.data.csum);
|
||||
+ hdr.next_hdr = cpu_to_le32(hdr.next_hdr);
|
||||
+ hdr.csum = cpu_to_le16(hdr.csum);
|
||||
+
|
||||
+ for (i = 0, csum = 0; i < offsetof(struct mv3310_fw_hdr, csum); i++)
|
||||
+ csum += sect[i];
|
||||
+
|
||||
+ if ((u16)~csum != hdr.csum) {
|
||||
+ dev_err(&phydev->mdio.dev, "Corrupt section header\n");
|
||||
+ err = -EINVAL;
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ err = mv3310_load_fw_sect(phydev, &hdr, sect + sizeof(hdr));
|
||||
+ if (err)
|
||||
+ break;
|
||||
+
|
||||
+ if (!hdr.next_hdr)
|
||||
+ break;
|
||||
+
|
||||
+ sect = fw->data + hdr.next_hdr;
|
||||
+ }
|
||||
+
|
||||
+release:
|
||||
+ release_firmware(fw);
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
static int mv3310_probe(struct phy_device *phydev)
|
||||
{
|
||||
const struct mv3310_chip *chip = to_mv3310_chip(phydev);
|
||||
@@ -520,6 +657,12 @@ static int mv3310_probe(struct phy_device *phydev)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
+ if ((ret & MV_PMA_BOOT_PRGS_MASK) == MV_PMA_BOOT_PRGS_WAIT) {
|
||||
+ ret = mv3310_load_fw(phydev);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL);
|
||||
if (!priv)
|
||||
return -ENOMEM;
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
Index: linux-6.1.32/arch/arm64/boot/dts/marvell/cn9130-crb.dtsi
|
||||
===================================================================
|
||||
--- linux-6.1.32.orig/arch/arm64/boot/dts/marvell/cn9130-crb.dtsi
|
||||
+++ linux-6.1.32/arch/arm64/boot/dts/marvell/cn9130-crb.dtsi
|
||||
@@ -284,6 +284,11 @@
|
||||
reg = <10>;
|
||||
label = "cpu";
|
||||
ethernet = <&cp0_eth0>;
|
||||
+ phy-mode = "10gbase-r";
|
||||
+ fixed-link {
|
||||
+ speed = <10000>;
|
||||
+ full-duplex;
|
||||
+ };
|
||||
};
|
||||
|
||||
};
|
||||
@@ -1,5 +1,5 @@
|
||||
SUBDIRS = src yang
|
||||
SUBDIRS = bin share src yang
|
||||
dist_doc_DATA = README.md LICENSE
|
||||
pkglibexec_SCRIPTS = confd-bootstrap.sh
|
||||
dist_sysconf_DATA = confdrc
|
||||
DISTCLEANFILES = *~ *.d
|
||||
ACLOCAL_AMFLAGS = -I m4
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
# Defaults for testing bootstrap script -*-conf-*-
|
||||
TESTING=true
|
||||
|
||||
PATH=.:$PATH
|
||||
INIT_DATA=/etc/sysrepo/factory-default.json
|
||||
SEARCH=/usr/share/yang/modules/confd:/usr/share/yang/modules/libnetconf2:/usr/share/yang/modules/libyang:/usr/share/yang/modules/netopeer2:/usr/share/yang/modules/sysrepo
|
||||
|
||||
CFG_PATH_=/tmp/confd
|
||||
|
||||
FACTORY_DEFAULTS_D=../share/factory.d
|
||||
FAILURE_DEFAULTS_D=../share/failure.d
|
||||
|
||||
FACTORY_D=$CFG_PATH_/factory.d
|
||||
FAILURE_D=$CFG_PATH_/failure.d
|
||||
|
||||
FACTORY_CFG=$CFG_PATH_/factory-config.cfg
|
||||
FAILURE_CFG=$CFG_PATH_/failure-config.cfg
|
||||
STARTUP_CFG=$CFG_PATH_/startup-config.cfg
|
||||
|
||||
# Uncomment this line in to create a bridge (br0) with all (classified
|
||||
# 'group port') interfaces as bridge ports. The br0 interface will get
|
||||
# an IPv6 EUI64 SLAAC address as well as an IPv4 ZeroConf address, and a
|
||||
# DHCPv4 address if the device is attached to a LAN with a DHCP server.
|
||||
#GEN_IFACE_OPTS="-b -4 -d"
|
||||
|
||||
# Default hostname in Fail Secure mode, plus last three octets in the base
|
||||
# MAC address, e.g. "failed-c0-ff-ee".
|
||||
FAIL_HOSTNAME="failed"
|
||||
@@ -0,0 +1,2 @@
|
||||
pkglibexec_SCRIPTS = bootstrap error load \
|
||||
gen-hostkeys gen-hostname gen-interfaces
|
||||
@@ -1,4 +1,6 @@
|
||||
#!/bin/sh
|
||||
# Bootstrap sysrepo db with all modules required by confd
|
||||
#
|
||||
# 1. Load all yang models with /cfg/factory-config
|
||||
# 2. [ if /cfg/startup-config is missing :: copy {factory} -> /cfg/startup-config ]
|
||||
# 3. Import /cfg/startup -> {startup} ]
|
||||
@@ -9,14 +11,88 @@
|
||||
# It's all really simple ... this script takes care of 1-4
|
||||
#
|
||||
|
||||
FACTORY=$1
|
||||
STARTUP=$2
|
||||
INIT_DATA=/etc/sysrepo/factory-default.json
|
||||
SEARCH=/usr/share/yang/modules/confd:/usr/share/yang/modules/libnetconf2:/usr/share/yang/modules/libyang:/usr/share/yang/modules/netopeer2:/usr/share/yang/modules/sysrepo
|
||||
# /etc/confdrc controls the behavior or most of the gen-scripts,
|
||||
# customize in an overlay when using Infix as an br2-external.
|
||||
RC=/etc/confdrc
|
||||
if [ "$1" = "-f" ] && [ -f "$2" ]; then
|
||||
RC=$2
|
||||
fi
|
||||
|
||||
if [ -z "$FACTORY" -o -z "$STARTUP" ]; then
|
||||
echo "Missing argument to sysrepo-bootstrap.sh $FACTORY $STARTUP"
|
||||
exit 1
|
||||
if [ ! -f "$RC" ]; then
|
||||
logger -sik -p user.error -t bootstrap "Missing rc file $RC" 2>/dev/null \
|
||||
|| echo "Missing rc file $RC"
|
||||
exit 99
|
||||
fi
|
||||
|
||||
# shellcheck disable=SC1090
|
||||
. "$RC"
|
||||
|
||||
FACTORY_GEN="$(dirname "$FACTORY_CFG")/$(basename "$FACTORY_CFG" .cfg).gen"
|
||||
FAILURE_GEN="$(dirname "$FAILURE_CFG")/$(basename "$FAILURE_CFG" .cfg).gen"
|
||||
|
||||
# Generate device's factory-config at first boot or on override
|
||||
if [ ! -f "$FACTORY_GEN" ] || [ "$FACTORY_OVERRIDE" = "true" ]; then
|
||||
mkdir -p "$FACTORY_D"
|
||||
|
||||
# Save the original templates (from the original image) used to create factory-config
|
||||
for file in $(find "$FACTORY_DEFAULTS_D" -type f); do
|
||||
cp "$file" "$FACTORY_D"
|
||||
done
|
||||
|
||||
# Create an overlay for /etc/hostname to change the default in an br2-external
|
||||
gen-hostname >"$FACTORY_D/20-hostname.json"
|
||||
# shellcheck disable=SC2086
|
||||
gen-interfaces $GEN_IFACE_OPTS >"$FACTORY_D/20-interfaces.json"
|
||||
|
||||
[ -s "$FACTORY_D/20-hostkey.json" ] || gen-hostkeys >"$FACTORY_D/20-hostkey.json"
|
||||
|
||||
# Optional commands (from an overlay) to run for br2-externals
|
||||
[ -x "$(command -v gen-ifs-custom)" ] && gen-ifs-custom >"$FACTORY_D/20-interfaces.json"
|
||||
[ -x "$(command -v gen-cfg-custom)" ] && gen-cfg-custom >"$FACTORY_D/30-config.json"
|
||||
|
||||
rm -f "$FACTORY_GEN"
|
||||
# shellcheck disable=SC2046
|
||||
jq -s 'reduce .[] as $item ({}; . * $item)' \
|
||||
$(find "$FACTORY_D" -name '*.json' | sort) >"$FACTORY_GEN"
|
||||
chmod 444 "$FACTORY_GEN"
|
||||
|
||||
# TODO: Look for statically defined factory-config, based on the
|
||||
# system's product ID, or just custom site-specific factory.
|
||||
|
||||
# If we haven't found a more specific, better match, settle for
|
||||
# factory-config.gen as the system's factory-config.
|
||||
[ -h "$FACTORY_CFG" ] || ln -sf "$(basename "$FACTORY_GEN")" "$FACTORY_CFG"
|
||||
fi
|
||||
|
||||
# Generate device's failure-config at first boot
|
||||
if [ ! -f "$FAILURE_GEN" ] || [ "$FAILURE_OVERRIDE" = "true" ]; then
|
||||
mkdir -p "$FAILURE_D"
|
||||
|
||||
# Save the original templates (from the original image) used to create failure-config
|
||||
for file in $(find "$FAILURE_DEFAULTS_D" -type f); do
|
||||
cp "$file" "$FAILURE_D"
|
||||
done
|
||||
|
||||
gen-hostname "$FAIL_HOSTNAME" >"$FAILURE_D/20-hostname.json"
|
||||
gen-interfaces >"$FAILURE_D/20-interfaces.json"
|
||||
|
||||
[ -s "$FAILURE_D/20-hostkey.json" ] || gen-hostkeys >"$FAILURE_D/20-hostkey.json"
|
||||
|
||||
# Optional failure/error config to generate (or override) for br2-externals
|
||||
[ -x "$(command -v gen-err-custom)" ] && gen-err-custom >"$FAILURE_D/30-error.json"
|
||||
|
||||
rm -f "$FAILURE_GEN"
|
||||
# shellcheck disable=SC2046
|
||||
jq -s 'reduce .[] as $item ({}; . * $item)' \
|
||||
$(find "$FAILURE_D" -name '*.json' | sort) >"$FAILURE_GEN"
|
||||
chmod 444 "$FAILURE_GEN"
|
||||
|
||||
[ -h "$FAILURE_CFG" ] || ln -sf "$(basename "$FAILURE_GEN")" "$FAILURE_CFG"
|
||||
fi
|
||||
|
||||
if [ -n "$TESTING" ]; then
|
||||
echo "Done."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Drop all pre-initialized data from netopeer2 install, then re-create
|
||||
@@ -24,7 +100,7 @@ fi
|
||||
# and then we initialize it all with our factory defaults.
|
||||
rm -rf /etc/sysrepo/* /dev/shm/sr_*
|
||||
mkdir -p /etc/sysrepo/
|
||||
cp "$FACTORY" "$INIT_DATA"
|
||||
cp "$FACTORY_CFG" "$INIT_DATA"
|
||||
sysrepoctl -s $SEARCH \
|
||||
-i ietf-system@2014-08-06.yang -g wheel -p 0660 \
|
||||
-e authentication \
|
||||
@@ -85,7 +161,7 @@ sysrepoctl -s $SEARCH \
|
||||
-i infix-dhcp-client@2023-05-22.yang -g wheel -p 0660 \
|
||||
-i infix-shell-type@2023-08-21.yang -g wheel -p 0660 \
|
||||
-i infix-system@2023-08-15.yang -g wheel -p 0660 \
|
||||
-i infix-services@2023-08-22.yang -g wheel -p 0660 \
|
||||
-i infix-services@2023-10-16.yang -g wheel -p 0660 \
|
||||
-I "${INIT_DATA}"
|
||||
rc=$?
|
||||
|
||||
@@ -105,17 +181,14 @@ sysrepoctl -c ietf-netconf -g wheel -p 0660 \
|
||||
# Allow wheel group users (admin) to modify NACM
|
||||
sysrepoctl -c ietf-netconf-acm -g wheel -p 0660
|
||||
|
||||
# On first boot, install factory-config as startup-config
|
||||
# Otherwise, load startup-config to {startup}. Due to a
|
||||
# limitation in sysrepo we cannot initialize factory for
|
||||
# ietf-netconf-acm, so we cheat, see sysrepo#3079
|
||||
if [ -f "$STARTUP" ]; then
|
||||
sysrepocfg -f json -I"$STARTUP"
|
||||
else
|
||||
sysrepocfg -f json -X"$STARTUP"
|
||||
# On first boot, install factory-config as startup-config. Due to a
|
||||
# limitation in sysrepo we cannot initialize ietf-netconf-acm, so we
|
||||
# cheat, see sysrepo#3079
|
||||
if [ ! -f "$STARTUP_CFG" ]; then
|
||||
sysrepocfg -f json -X"$STARTUP_CFG"
|
||||
fi
|
||||
|
||||
# Clear running-config
|
||||
# Clear running-config so we can load startup in the next step
|
||||
echo "{}" > "$INIT_DATA"
|
||||
sysrepocfg -f json -I"$INIT_DATA" -d running
|
||||
|
||||
Executable
+5
@@ -0,0 +1,5 @@
|
||||
#!/bin/sh
|
||||
# Override using an overlay in your br2-external to change the behavior
|
||||
|
||||
logger -sik -p user.error "The device has reached an unrecoverable error, please RMA."
|
||||
exec sleep infinity
|
||||
Executable
+161
@@ -0,0 +1,161 @@
|
||||
#!/bin/sh
|
||||
# Generates ietf-intefaces + ietf-ip settings for all detected interfaces
|
||||
# Interfaces must be of type Ethernet (copper/sfp), not be "internal" DSA
|
||||
# ports, and must have a "parentbus", i.e., be physical ports.
|
||||
#
|
||||
# Usage: gen-interfaces [-4bd]
|
||||
#
|
||||
# -b brN Bridged mode, set all interfaces as ports in brN
|
||||
# -4 Generic option for both modes, enables ZeroConf IPv4
|
||||
# -d Generic option for both modes, enables DHCPv4 client
|
||||
#
|
||||
# By default this script generates plain interfaces with IPv6 autoconfig
|
||||
# (EUI64) enabled. Useful both in a plain router and a Fail Secure mode
|
||||
# where any switchcore-backed ports should be prevented from switching.
|
||||
#
|
||||
# The default mode currently does not support the '-4' or '-d' options
|
||||
# for IPv4 ZeroConf or DHCPv4 address, beacause they require source
|
||||
# routing, or similar, to work. IPv6 does not require that and is
|
||||
# therefore the recommended access method. A separate (and optional)
|
||||
# 'gen-cfg-custom' script is checked for in the bootstrap script which
|
||||
# can be used to enable IPv4 and DHCP on a single service interface if
|
||||
# needed.
|
||||
#
|
||||
# The '-b brname' option triggers the bridge mode, creating a 'brname'
|
||||
# bridge interface using all interfaces classified in 'group port' by
|
||||
# the nameif script. In the bridge mode port interfaces do not have any
|
||||
# IP address, the IPv6 autoconfig address is instead set on 'brN'. If
|
||||
# the '-4' option is set, ZeroConfig (169.254.x.y) is anabled on 'brN'.
|
||||
# If the '-d' option is set, a DHCPv4 client is enabled on 'brN'.
|
||||
#
|
||||
# A "mixed mode" is also supported, where the system may have multiple
|
||||
# ports in a switchcore, but some Ethernet interfaces directly connected
|
||||
# to the SoC. In this case, if '-b brname' is given, all 'group port'
|
||||
# interfaces will be placed in the bridge 'brname' and all other
|
||||
# interfaces will be brought up and given an IPv6 address (like above).
|
||||
#
|
||||
set -e
|
||||
|
||||
bridge=
|
||||
ipv4=false
|
||||
dhcp=
|
||||
|
||||
gen_interface()
|
||||
{
|
||||
cat <<EOF
|
||||
,{
|
||||
"name": "$1",
|
||||
"type": "infix-if-type:ethernet",
|
||||
"ietf-ip:ipv6": {
|
||||
"enabled": $2
|
||||
EOF
|
||||
if [ -n "$3" ]; then
|
||||
cat <<EOF
|
||||
},
|
||||
"infix-interfaces:bridge-port": {
|
||||
"bridge": "$3"
|
||||
EOF
|
||||
fi
|
||||
cat <<EOF
|
||||
}
|
||||
}
|
||||
EOF
|
||||
}
|
||||
|
||||
while [ "$1" != "" ]; do
|
||||
case $1 in
|
||||
-4)
|
||||
ipv4=true
|
||||
;;
|
||||
-b)
|
||||
bridge="$2"
|
||||
shift
|
||||
;;
|
||||
-d)
|
||||
dhcp=true
|
||||
;;
|
||||
*)
|
||||
break
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
phys_ifaces=$(ip -d -j link show | jq -r '
|
||||
.[] |
|
||||
select(.link_type == "ether") |
|
||||
select(.group != "internal") |
|
||||
select(has("parentbus")) |
|
||||
.ifname')
|
||||
ports=$(ip -d -j link show group port | jq -r '
|
||||
.[] |
|
||||
select(.link_type == "ether") |
|
||||
select(.group != "internal") |
|
||||
select(has("parentbus")) |
|
||||
.ifname')
|
||||
ifaces=""
|
||||
for phy in $phys_ifaces; do
|
||||
found=""
|
||||
for port in $ports; do
|
||||
if [ $port = $phy ]; then
|
||||
found=true
|
||||
break
|
||||
fi
|
||||
done
|
||||
if [ -z "$found" ]; then
|
||||
ifaces="$ifaces $phy"
|
||||
fi
|
||||
done
|
||||
|
||||
cat <<EOF
|
||||
{
|
||||
"ietf-interfaces:interfaces": {
|
||||
"interface": [
|
||||
{
|
||||
"name": "lo",
|
||||
"type": "infix-if-type:loopback",
|
||||
"ietf-ip:ipv4": {
|
||||
"address": [{ "ip": "127.0.0.1", "prefix-length": 8 }]
|
||||
},
|
||||
"ietf-ip:ipv6": {
|
||||
"address": [{ "ip": "::1", "prefix-length": 128 }]
|
||||
}
|
||||
EOF
|
||||
if [ -n "$bridge" ]; then
|
||||
cat <<EOF
|
||||
},
|
||||
{
|
||||
"name": "$bridge",
|
||||
"type": "infix-if-type:bridge",
|
||||
"ietf-ip:ipv4": {
|
||||
"infix-ip:autoconf": {
|
||||
"enabled": $ipv4
|
||||
}
|
||||
},
|
||||
"ietf-ip:ipv6": {
|
||||
"enabled": true
|
||||
}
|
||||
EOF
|
||||
fi
|
||||
|
||||
cat <<EOF
|
||||
}
|
||||
$(for iface in $ifaces; do gen_interface $iface true; done)
|
||||
$(for iface in $ports; do gen_interface $iface false $bridge; done)
|
||||
]
|
||||
EOF
|
||||
if [ "$dhcp" = "true" ] && [ -n "$bridge" ]; then
|
||||
cat <<EOF
|
||||
},
|
||||
"infix-dhcp-client:dhcp-client": {
|
||||
"enabled": true,
|
||||
"client-if": [
|
||||
{
|
||||
"if-name": "$bridge"
|
||||
}
|
||||
]
|
||||
EOF
|
||||
fi
|
||||
cat <<EOF
|
||||
}
|
||||
}
|
||||
EOF
|
||||
Executable
+38
@@ -0,0 +1,38 @@
|
||||
#!/bin/sh
|
||||
# load [-b] <startup-config | failure-config>
|
||||
#
|
||||
# Import a configuration to the sysrepo datastore using `sysrepocfg -Ifile`
|
||||
#
|
||||
# If the '-b' option is used we set the Finit <usr/bootstrap> condition if
|
||||
# sysrepocfg returns OK. This to be able to detect and trigger the Infix
|
||||
# Fail Secure Mode at boot.
|
||||
#
|
||||
set -e
|
||||
|
||||
if [ "$1" = "-b" ]; then
|
||||
bootstrap=true
|
||||
shift
|
||||
else
|
||||
bootstrap=false
|
||||
fi
|
||||
config=$1
|
||||
fn=/cfg/${config}.cfg
|
||||
|
||||
if [ ! -f "$fn" ]; then
|
||||
if [ ! -f "$config" ]; then
|
||||
logger -sik -p user.error "No such file, $fn, aborting!"
|
||||
exit 1
|
||||
fi
|
||||
fn=$config
|
||||
fi
|
||||
|
||||
if ! sysrepocfg -v3 -I"$fn" -f json; then
|
||||
if eval $bootstrap; then
|
||||
logger -sik -p user.error "Failed bootstrapping system, reverting to Fail Secure mode!"
|
||||
initctl -nbq runlevel 9
|
||||
else
|
||||
logger -sik -p user.error "Failed loading $fn, aborting!"
|
||||
fi
|
||||
exit 1
|
||||
fi
|
||||
logger -sik -p user.notice "Loaded $fn successfully."
|
||||
@@ -0,0 +1,34 @@
|
||||
# Defaults for /usr/libexec/confd/bootstrap -*-conf-*-
|
||||
# Copy and mofify this file to your br2-external overlay
|
||||
|
||||
PATH=/usr/libexec/confd/:$PATH
|
||||
INIT_DATA=/etc/sysrepo/factory-default.json
|
||||
SEARCH=/usr/share/yang/modules/confd:/usr/share/yang/modules/libnetconf2:/usr/share/yang/modules/libyang:/usr/share/yang/modules/netopeer2:/usr/share/yang/modules/sysrepo
|
||||
|
||||
CFG_PATH_=/cfg
|
||||
|
||||
FACTORY_DEFAULTS_D=/usr/share/confd/factory.d
|
||||
FAILURE_DEFAULTS_D=/usr/share/confd/failure.d
|
||||
|
||||
FACTORY_D=$CFG_PATH_/factory.d
|
||||
FAILURE_D=$CFG_PATH_/failure.d
|
||||
|
||||
FACTORY_CFG=$CFG_PATH_/factory-config.cfg
|
||||
FAILURE_CFG=$CFG_PATH_/failure-config.cfg
|
||||
STARTUP_CFG=$CFG_PATH_/startup-config.cfg
|
||||
|
||||
# Uncomment this line in to create a bridge (br0) with all (classified
|
||||
# 'group port') interfaces as bridge ports. The br0 interface will get
|
||||
# an IPv6 EUI64 SLAAC address as well as an IPv4 ZeroConf address, and a
|
||||
# DHCPv4 address if the device is attached to a LAN with a DHCP server.
|
||||
#GEN_IFACE_OPTS="-b br0 -4 -d"
|
||||
|
||||
# Default hostname in Fail Secure mode, plus last three octets in the base
|
||||
# MAC address, e.g. "failed-c0-ff-ee".
|
||||
FAIL_HOSTNAME="failed"
|
||||
|
||||
# Uncomment to regenerate factory-config (except hostkeys) on each boot.
|
||||
#FACTORY_OVERRIDE=true
|
||||
|
||||
# Uncomment to regenerate failure-config (except hostkeys) on each boot.
|
||||
#FAILURE_OVERRIDE=true
|
||||
@@ -5,6 +5,10 @@ AM_SILENT_RULES(yes)
|
||||
|
||||
AC_CONFIG_FILES([
|
||||
Makefile
|
||||
bin/Makefile
|
||||
share/Makefile
|
||||
share/factory.d/Makefile
|
||||
share/failure.d/Makefile
|
||||
src/Makefile
|
||||
yang/Makefile
|
||||
])
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
SUBDIRS = factory.d failure.d
|
||||
dist_pkgdata_DATA = README
|
||||
@@ -0,0 +1 @@
|
||||
Templates for generating device-specific factory-config and failure-config.
|
||||
-3
@@ -7,8 +7,5 @@
|
||||
},
|
||||
"infix-services:mdns": {
|
||||
"enabled": true
|
||||
},
|
||||
"infix-services:ssdp": {
|
||||
"enabled": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
factorydir = $(pkgdatadir)/factory.d
|
||||
dist_factory_DATA = 10-authentication.json 10-nacm.json \
|
||||
10-netconf-server.json 10-system.json
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"ietf-system:system": {
|
||||
"authentication": {
|
||||
"user": [
|
||||
{
|
||||
"name": "admin",
|
||||
"password": "$6$bKPp6xu45L1cmp70$fcwDhGZct4q8LxwPASf9iVHyWqnklcdjeYi/SupLo1K9nb.aAQUz48.3qTcW38XL6gQzfHyGoyeDG2orjPUwm1",
|
||||
"infix-system:shell": "infix-shell-type:bash"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
+1
@@ -0,0 +1 @@
|
||||
../factory.d/10-nacm.json
|
||||
@@ -0,0 +1 @@
|
||||
../factory.d/10-netconf-server.json
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"ietf-system:system": {
|
||||
"hostname": "failure"
|
||||
},
|
||||
"ieee802-dot1ab-lldp:lldp": {
|
||||
"infix-lldp:enabled": true
|
||||
},
|
||||
"infix-services:mdns": {
|
||||
"enabled": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
failuredir = $(pkgdatadir)/failure.d
|
||||
dist_failure_DATA = 10-authentication.json 10-nacm.json \
|
||||
10-netconf-server.json 10-system.json
|
||||
|
||||
@@ -67,7 +67,7 @@ int core_post_hook(sr_session_ctx_t *session, uint32_t sub_id, const char *modul
|
||||
|
||||
int sr_plugin_init_cb(sr_session_ctx_t *session, void **priv)
|
||||
{
|
||||
int log_opts = LOG_USER;
|
||||
int log_opts = LOG_PID | LOG_DAEMON;
|
||||
int rc = SR_ERR_SYS;
|
||||
char *env;
|
||||
|
||||
|
||||
@@ -416,6 +416,22 @@ static int netdag_set_conf_addrs(FILE *ip, const char *ifname,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int netdag_gen_link_mtu(FILE *ip, struct lyd_node *dif)
|
||||
{
|
||||
const char *ifname = lydx_get_cattr(dif, "name");
|
||||
struct lyd_node *node;
|
||||
struct lydx_diff nd;
|
||||
|
||||
if (!strcmp(ifname, "lo")) /* skip for now */
|
||||
return 0;
|
||||
|
||||
node = lydx_get_descendant(lyd_child(dif), "ipv4", "mtu", NULL);
|
||||
if (node && lydx_get_diff(node, &nd))
|
||||
fprintf(ip, "link set %s mtu %s\n", ifname, nd.new ? nd.val : "1500");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int netdag_gen_link_addr(FILE *ip, struct lyd_node *cif, struct lyd_node *dif)
|
||||
{
|
||||
const char *ifname = lydx_get_cattr(dif, "name");
|
||||
@@ -570,12 +586,12 @@ static int netdag_gen_ipv4_autoconf(struct dagger *net, struct lyd_node *cif,
|
||||
return err;
|
||||
}
|
||||
|
||||
static int netdag_gen_sysctl_bool(struct dagger *net,
|
||||
const char *ifname, FILE **fpp,
|
||||
struct lyd_node *node,
|
||||
const char *fmt, ...)
|
||||
static int netdag_gen_sysctl_setting(struct dagger *net, const char *ifname, FILE **fpp,
|
||||
int isboolean, const char *fallback,
|
||||
struct lyd_node *node, const char *fmt, ...)
|
||||
{
|
||||
struct lydx_diff nd;
|
||||
const char *value;
|
||||
va_list ap;
|
||||
|
||||
if (!node)
|
||||
@@ -584,18 +600,32 @@ static int netdag_gen_sysctl_bool(struct dagger *net,
|
||||
if (!lydx_get_diff(node, &nd))
|
||||
return 0;
|
||||
|
||||
*fpp = *fpp ? : dagger_fopen_next(net, "init", ifname,
|
||||
60, "init.sysctl");
|
||||
*fpp = *fpp ? : dagger_fopen_next(net, "init", ifname, 60, "init.sysctl");
|
||||
if (!*fpp)
|
||||
return -EIO;
|
||||
|
||||
va_start(ap, fmt);
|
||||
vfprintf(*fpp, fmt, ap);
|
||||
va_end(ap);
|
||||
fprintf(*fpp, " = %u\n", (nd.new && !strcmp(nd.val, "true")) ? 1 : 0);
|
||||
|
||||
if (isboolean) {
|
||||
if (nd.new && !strcmp(nd.val, "true"))
|
||||
value = "1";
|
||||
else
|
||||
value = "0";
|
||||
} else {
|
||||
if (nd.new)
|
||||
value = nd.val;
|
||||
else
|
||||
value = fallback;
|
||||
}
|
||||
|
||||
fprintf(*fpp, " = %s\n", value);
|
||||
|
||||
return 0;
|
||||
}
|
||||
static int netdag_gen_sysctl(struct dagger *net,
|
||||
struct lyd_node *cif,
|
||||
struct lyd_node *dif)
|
||||
{
|
||||
const char *ifname = lydx_get_cattr(dif, "name");
|
||||
@@ -604,15 +634,21 @@ static int netdag_gen_sysctl(struct dagger *net,
|
||||
int err = 0;
|
||||
|
||||
node = lydx_get_descendant(lyd_child(dif), "ipv4", "forwarding", NULL);
|
||||
err = err ? : netdag_gen_sysctl_bool(net, ifname, &sysctl, node,
|
||||
"net.ipv4.conf.%s.forwarding",
|
||||
ifname);
|
||||
err = err ? : netdag_gen_sysctl_setting(net, ifname, &sysctl, 1, "0", node,
|
||||
"net.ipv4.conf.%s.forwarding", ifname);
|
||||
|
||||
node = lydx_get_descendant(lyd_child(dif), "ipv6", "forwarding", NULL);
|
||||
err = err ? : netdag_gen_sysctl_bool(net, ifname, &sysctl, node,
|
||||
"net.ipv6.conf.%s.forwarding",
|
||||
ifname);
|
||||
err = err ? : netdag_gen_sysctl_setting(net, ifname, &sysctl, 1, "0", node,
|
||||
"net.ipv6.conf.%s.forwarding", ifname);
|
||||
|
||||
if (!strcmp(ifname, "lo")) /* skip for now */
|
||||
goto skip_mtu;
|
||||
|
||||
node = lydx_get_descendant(lyd_child(cif), "ipv6", "mtu", NULL);
|
||||
err = err ? : netdag_gen_sysctl_setting(net, ifname, &sysctl, 0, "1280", node,
|
||||
"net.ipv6.conf.%s.mtu", ifname);
|
||||
|
||||
skip_mtu:
|
||||
if (sysctl)
|
||||
fclose(sysctl);
|
||||
|
||||
@@ -776,15 +812,17 @@ static int netdag_gen_bridge(struct dagger *net, struct lyd_node *dif,
|
||||
const char *op = add ? "add" : "set";
|
||||
struct lyd_node *vlans, *vlan;
|
||||
int vlan_filtering, pvid, fwd_mask;
|
||||
int mcast_snooping;
|
||||
const char *proto;
|
||||
FILE *br = NULL;
|
||||
int err = 0;
|
||||
|
||||
vlan_filtering = bridge_vlan_settings(cif, &proto, &pvid);
|
||||
mcast_snooping = 0; /* Not supported yet */
|
||||
fwd_mask = bridge_fwd_mask(cif);
|
||||
|
||||
fprintf(ip, "link %s dev %s type bridge group_fwd_mask %d vlan_filtering %d",
|
||||
op, brname, fwd_mask, vlan_filtering ? 1 : 0);
|
||||
fprintf(ip, "link %s dev %s type bridge group_fwd_mask %d vlan_filtering %d mcast_snooping %d",
|
||||
op, brname, fwd_mask, vlan_filtering ? 1 : 0, mcast_snooping ? 1 : 0);
|
||||
if (!vlan_filtering) {
|
||||
fputc('\n', ip);
|
||||
goto done;
|
||||
@@ -1093,6 +1131,7 @@ static sr_error_t netdag_gen_iface(struct dagger *net,
|
||||
}
|
||||
|
||||
/* Set Addresses */
|
||||
err = err ? : netdag_gen_link_mtu(ip, dif);
|
||||
err = err ? : netdag_gen_link_addr(ip, cif, dif);
|
||||
err = err ? : netdag_gen_ip_addrs(ip, "ipv4", cif, dif);
|
||||
err = err ? : netdag_gen_ip_addrs(ip, "ipv6", cif, dif);
|
||||
@@ -1104,7 +1143,7 @@ static sr_error_t netdag_gen_iface(struct dagger *net,
|
||||
if (!attr || !strcmp(attr, "true"))
|
||||
fprintf(ip, "link set dev %s up state up\n", ifname);
|
||||
|
||||
err = err ? : netdag_gen_sysctl(net, dif);
|
||||
err = err ? : netdag_gen_sysctl(net, cif, dif);
|
||||
|
||||
err_close_ip:
|
||||
fclose(ip);
|
||||
|
||||
@@ -677,7 +677,7 @@ static int sys_add_new_user(sr_session_ctx_t *sess, char *name)
|
||||
ERROR("Failed creating new user \"%s\"\n", name);
|
||||
return SR_ERR_SYS;
|
||||
}
|
||||
DEBUG("New user \"%s\" created\n", name);
|
||||
NOTE("New user \"%s\" created\n", name);
|
||||
|
||||
/*
|
||||
* OpenSSH in Infix has been set up to use /var/run/sshd/%s.keys
|
||||
@@ -712,7 +712,7 @@ static char *change_get_user(struct sr_change *change)
|
||||
if (user) {
|
||||
pw = getpwnam(user);
|
||||
if (!pw) {
|
||||
DEBUG("Skipping attribute for missing user (%s)", user);
|
||||
ERROR("Skipping attribute for missing user (%s)", user);
|
||||
free(user);
|
||||
user = NULL;
|
||||
}
|
||||
@@ -753,12 +753,12 @@ static sr_error_t handle_sr_passwd_update(augeas *aug, sr_session_ctx_t *, struc
|
||||
}
|
||||
if (aug_set_dynpath(aug, hash, "etc/shadow/%s/password", user))
|
||||
return SR_ERR_SYS;
|
||||
DEBUG("Password updated for user %s", user);
|
||||
NOTE("Password updated for user %s", user);
|
||||
break;
|
||||
case SR_OP_DELETED:
|
||||
if (aug_set_dynpath(aug, "!", "etc/shadow/%s/password", user))
|
||||
return SR_ERR_SYS;
|
||||
DEBUG("Password deleted for user %s", user);
|
||||
NOTE("Password deleted for user %s", user);
|
||||
break;
|
||||
case SR_OP_MOVED:
|
||||
return SR_ERR_OK;
|
||||
@@ -801,10 +801,10 @@ static sr_error_t check_sr_user_update(augeas *aug, sr_session_ctx_t *, struct s
|
||||
|
||||
name = sr_xpath_key_value(val->xpath, "user", "name", &state);
|
||||
if (!is_valid_username(name)) {
|
||||
ERROR("Invalid username \"%s\"\n", name);
|
||||
ERROR("Invalid username \"%s\"", name);
|
||||
return SR_ERR_VALIDATION_FAILED;
|
||||
}
|
||||
DEBUG("Username \"%s\" is valid\n", name);
|
||||
ERROR("Username \"%s\" is valid", name);
|
||||
|
||||
return SR_ERR_OK;
|
||||
}
|
||||
@@ -825,7 +825,7 @@ static sr_error_t handle_sr_user_update(augeas *aug, sr_session_ctx_t *sess, str
|
||||
sr_xpath_recover(&state);
|
||||
return err;
|
||||
}
|
||||
DEBUG("User %s created\n", name);
|
||||
NOTE("User %s created", name);
|
||||
sr_xpath_recover(&state);
|
||||
break;
|
||||
case SR_OP_DELETED:
|
||||
@@ -837,7 +837,7 @@ static sr_error_t handle_sr_user_update(augeas *aug, sr_session_ctx_t *sess, str
|
||||
sr_xpath_recover(&state);
|
||||
return err;
|
||||
}
|
||||
DEBUG("User %s deleted\n", name);
|
||||
NOTE("User %s deleted", name);
|
||||
sr_xpath_recover(&state);
|
||||
break;
|
||||
case SR_OP_MOVED:
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
|
||||
static const struct srx_module_requirement reqs[] = {
|
||||
{ .dir = YANG_PATH_, .name = "infix-services", .rev = "2023-08-22" },
|
||||
{ .dir = YANG_PATH_, .name = "infix-services", .rev = "2023-10-16" },
|
||||
{ .dir = YANG_PATH_, .name = "ieee802-dot1ab-lldp", .rev = "2022-03-15" },
|
||||
{ .dir = YANG_PATH_, .name = "infix-lldp", .rev = "2023-08-23" },
|
||||
{ NULL }
|
||||
@@ -75,12 +75,6 @@ static int mdns_change(sr_session_ctx_t *session, uint32_t sub_id, const char *m
|
||||
return svc_change(session, event, xpath, "mdns", "avahi");
|
||||
}
|
||||
|
||||
static int ssdp_change(sr_session_ctx_t *session, uint32_t sub_id, const char *module,
|
||||
const char *xpath, sr_event_t event, unsigned request_id, void *_confd)
|
||||
{
|
||||
return svc_change(session, event, xpath, "ssdp", "ssdp-responder");
|
||||
}
|
||||
|
||||
static int lldp_change(sr_session_ctx_t *session, uint32_t sub_id, const char *module,
|
||||
const char *xpath, sr_event_t event, unsigned request_id, void *_confd)
|
||||
{
|
||||
@@ -97,8 +91,6 @@ int infix_services_init(struct confd *confd)
|
||||
|
||||
REGISTER_CHANGE(confd->session, "infix-services", "/infix-services:mdns",
|
||||
0, mdns_change, confd, &confd->sub);
|
||||
REGISTER_CHANGE(confd->session, "infix-services", "/infix-services:ssdp",
|
||||
0, ssdp_change, confd, &confd->sub);
|
||||
REGISTER_CHANGE(confd->session, "ieee802-dot1ab-lldp", "/ieee802-dot1ab-lldp:lldp",
|
||||
0, lldp_change, confd, &confd->sub);
|
||||
|
||||
|
||||
@@ -50,10 +50,6 @@ module infix-ip {
|
||||
}
|
||||
}
|
||||
|
||||
deviation "/if:interfaces/if:interface/ip:ipv4/ip:mtu" {
|
||||
deviate not-supported;
|
||||
}
|
||||
|
||||
deviation "/if:interfaces/if:interface/ip:ipv4/ip:address/ip:subnet/ip:netmask" {
|
||||
deviate not-supported;
|
||||
}
|
||||
@@ -62,10 +58,6 @@ module infix-ip {
|
||||
deviate not-supported;
|
||||
}
|
||||
|
||||
deviation "/if:interfaces/if:interface/ip:ipv6/ip:mtu" {
|
||||
deviate not-supported;
|
||||
}
|
||||
|
||||
deviation "/if:interfaces/if:interface/ip:ipv6/ip:address/ip:status" {
|
||||
deviate not-supported;
|
||||
}
|
||||
|
||||
+6
-10
@@ -7,8 +7,13 @@ module infix-services {
|
||||
contact "kernelkit@googlegroups.com";
|
||||
description "Infix services, generic.";
|
||||
|
||||
revision 2023-10-16 {
|
||||
description "Drop SSDP support, mDNS-SD is now available in Windows 10.";
|
||||
reference "internal";
|
||||
}
|
||||
|
||||
revision 2023-08-22 {
|
||||
description "Initial revision, add SSDP and mDNS/SD enable/disable only.";
|
||||
description "Initial revision, add SSDP and mDNS-SD enable/disable only.";
|
||||
reference "internal";
|
||||
}
|
||||
|
||||
@@ -24,13 +29,4 @@ module infix-services {
|
||||
description "Globally enable or disable mDNS/SD on all interfaces.";
|
||||
}
|
||||
}
|
||||
|
||||
container ssdp {
|
||||
description "Advertise system over SSDP (Windows uPnP), IPv4 only.";
|
||||
|
||||
leaf enabled {
|
||||
type boolean;
|
||||
description "Globally enable or disable SSDP on all interfaces.";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -18,8 +18,12 @@ int vasprintf(char **strp, const char *fmt, va_list ap);
|
||||
int asprintf(char **strp, const char *fmt, ...);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Only NOTICE and above are logged by default, see setlogmask() for details.
|
||||
*/
|
||||
#define DEBUG(fmt, ...) do { if (debug) syslog(LOG_DEBUG, fmt, ##__VA_ARGS__); } while (0)
|
||||
#define INFO(fmt, ...) syslog(LOG_INFO, fmt, ##__VA_ARGS__)
|
||||
#define INFO(fmt, ...) syslog(LOG_INFO, fmt, ##__VA_ARGS__)
|
||||
#define NOTE(fmt, ...) syslog(LOG_NOTICE, fmt, ##__VA_ARGS__)
|
||||
#define ERROR(fmt, ...) syslog(LOG_ERR, "%s: " fmt, __func__, ##__VA_ARGS__)
|
||||
#define ERRNO(fmt, ...) syslog(LOG_ERR, "%s: " fmt ": %s", __func__, ##__VA_ARGS__, strerror(errno))
|
||||
|
||||
|
||||
+31
-20
@@ -1,3 +1,4 @@
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <jansson.h>
|
||||
@@ -20,7 +21,7 @@ static json_t *json_get_ip_addr(const char *ifname)
|
||||
return json_get_output(cmd);
|
||||
}
|
||||
|
||||
static const char *get_yang_origin(const char *protocol)
|
||||
static const char *get_yang_origin(const char *proto, json_t *j_addr)
|
||||
{
|
||||
size_t i;
|
||||
struct {
|
||||
@@ -29,13 +30,26 @@ static const char *get_yang_origin(const char *protocol)
|
||||
|
||||
} map[] = {
|
||||
{"kernel_ll", "link-layer"},
|
||||
{"kernel_ra", "link-layer"},
|
||||
{"static", "static"},
|
||||
{"dhcp", "dhcp"},
|
||||
{"random", "random"},
|
||||
};
|
||||
|
||||
/**
|
||||
* kernel_ll/kernel_ll only has a link-layer origin if its address is
|
||||
* based on the link layer address (addrgenmode eui64).
|
||||
*/
|
||||
if ((strcmp(proto, "kernel_ll") == 0) || (strcmp(proto, "kernel_ra") == 0)) {
|
||||
json_t *j_val;
|
||||
|
||||
j_val = json_object_get(j_addr, "stable-privacy");
|
||||
if (j_val && json_is_boolean(j_val) && json_boolean_value(j_val))
|
||||
return "random";
|
||||
}
|
||||
|
||||
for (i = 0; i < sizeof(map) / sizeof(map[0]); i++) {
|
||||
if (strcmp(protocol, map[i].kern) != 0)
|
||||
if (strcmp(proto, map[i].kern) != 0)
|
||||
continue;
|
||||
|
||||
return map[i].yang;
|
||||
@@ -47,6 +61,7 @@ static const char *get_yang_origin(const char *protocol)
|
||||
static int ly_add_ip_mtu(const struct ly_ctx *ctx, struct lyd_node *node,
|
||||
char *xpath, json_t *j_iface, char *ifname)
|
||||
{
|
||||
json_int_t j_mtu;
|
||||
json_t *j_val;
|
||||
int err;
|
||||
|
||||
@@ -57,14 +72,21 @@ static int ly_add_ip_mtu(const struct ly_ctx *ctx, struct lyd_node *node,
|
||||
if (strcmp(ifname, "lo") == 0)
|
||||
return SR_ERR_OK;
|
||||
|
||||
j_val = json_object_get(j_iface, "mtu");
|
||||
if (!json_is_integer(j_val)) {
|
||||
ERROR("Expected a JSON integer for 'mtu'");
|
||||
return SR_ERR_SYS;
|
||||
if (strstr(xpath, "ipv4")) {
|
||||
j_val = json_object_get(j_iface, "mtu");
|
||||
if (!json_is_integer(j_val)) {
|
||||
ERROR("Expected a JSON integer for 'mtu'");
|
||||
return SR_ERR_SYS;
|
||||
}
|
||||
j_mtu = json_integer_value(j_val);
|
||||
} else {
|
||||
if (readllf(&j_mtu, "/proc/sys/net/ipv6/conf/%s/mtu", ifname)) {
|
||||
ERROR("Failed reading sysctl value of %s IPv6 MTU: %s", ifname, strerror(errno));
|
||||
return SR_ERR_SYS;
|
||||
}
|
||||
}
|
||||
|
||||
err = lydx_new_path(ctx, &node, xpath, "mtu", "%lld",
|
||||
json_integer_value(j_val));
|
||||
err = lydx_new_path(ctx, &node, xpath, "mtu", "%lld", j_mtu);
|
||||
if (err) {
|
||||
ERROR("Error, adding 'mtu' to data tree, libyang error %d", err);
|
||||
return SR_ERR_LY;
|
||||
@@ -89,18 +111,7 @@ static int ly_add_ip_addr_origin(const struct ly_ctx *ctx, struct lyd_node *addr
|
||||
ERROR("Expected a JSON string for ip 'protocol'");
|
||||
return SR_ERR_SYS;
|
||||
}
|
||||
|
||||
origin = get_yang_origin(json_string_value(j_val));
|
||||
|
||||
/**
|
||||
* kernel_ll/link-layer only has a link-layer origin if its address is
|
||||
* based on the link layer address (addrgenmode eui64).
|
||||
*/
|
||||
if (strcmp(origin, "link-layer") == 0) {
|
||||
j_val = json_object_get(j_addr, "stable-privacy");
|
||||
if (j_val && json_is_boolean(j_val) && json_boolean_value(j_val))
|
||||
origin = "random";
|
||||
}
|
||||
origin = get_yang_origin(json_string_value(j_val), j_addr);
|
||||
|
||||
err = lydx_new_path(ctx, &addr_node, addr_xpath, "origin", "%s", origin);
|
||||
if (err) {
|
||||
|
||||
@@ -322,9 +322,9 @@
|
||||
}
|
||||
},
|
||||
{
|
||||
"TEST-DESCR": "VLAN without operstatus",
|
||||
"name": "vlan20",
|
||||
"type": "infix-if-type:vlan",
|
||||
"oper-status": "up",
|
||||
"if-index": 4,
|
||||
"phys-address": "02:00:00:00:00:00",
|
||||
"statistics": {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user