mirror of
https://github.com/revyos/thead-kernel.git
synced 2026-06-21 09:12:26 +02:00
sync: huiwei: Solve reboot stability test problem
commit: 9875bcc0ce835faf034b452678ea5d1547d97b6c
This commit is contained in:
@@ -19,17 +19,7 @@
|
||||
sound-dai = <&es8388_audio_codec>;
|
||||
};
|
||||
};
|
||||
simple-audio-card,dai-link@1 { /* I2S - AUDIO SYS CODEC 7210*/
|
||||
reg = <1>;
|
||||
format = "i2s";
|
||||
cpu {
|
||||
sound-dai = <&i2s1 0>;
|
||||
};
|
||||
codec {
|
||||
sound-dai = <&es7210_audio_codec>;
|
||||
};
|
||||
};
|
||||
simple-audio-card,dai-link@2 { /* I2S - AUDIO SYS CODEC HDMI*/
|
||||
simple-audio-card,dai-link@1 { /* I2S - AUDIO SYS CODEC HDMI*/
|
||||
reg = <2>;
|
||||
format = "i2s";
|
||||
cpu {
|
||||
|
||||
@@ -287,25 +287,6 @@
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
reg_tp_pwr_en: regulator-pwr-en {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "regulator-pwr-en";
|
||||
regulator-min-microvolt = <2800000>;
|
||||
regulator-max-microvolt = <2800000>;
|
||||
gpio = <&pcal6408ahk_d 4 1>;
|
||||
enable-active-high;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
reg_usb_hub_vdd1v2: regulator-hub-vdd12-en {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "regulator-hub-vdd12-en";
|
||||
regulator-min-microvolt = <1200000>;
|
||||
regulator-max-microvolt = <1200000>;
|
||||
gpio = <&pcal6408ahk_d 2 1>;
|
||||
enable-active-high;
|
||||
};
|
||||
|
||||
reg_usb_hub_vcc5v: regulator-hub-vcc5v-en {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "regulator-hub-vcc5v-en";
|
||||
@@ -472,24 +453,6 @@
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
soc_vdd33_lcd0_en_reg: soc_lcd0_vdd33_en {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "soc_lcd0_vdd33_en";
|
||||
regulator-min-microvolt = <3300000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
gpio = <&pcal6408ahk_d 5 1>;
|
||||
enable-active-high;
|
||||
};
|
||||
|
||||
soc_vdd18_lcd0_en_reg: soc_lcd0_vdd18_en {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "soc_lcd0_vdd18_en";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
gpio = <&pcal6408ahk_d 6 1>;
|
||||
enable-active-high;
|
||||
};
|
||||
|
||||
soc_vdd5v_se_en_reg: soc_vdd5v_se_en {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "soc_vdd5v_se_en";
|
||||
@@ -520,88 +483,6 @@
|
||||
|
||||
};
|
||||
|
||||
|
||||
soc_avdd28_rgb_reg: soc_avdd28_rgb {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "soc_avdd28_rgb";
|
||||
regulator-min-microvolt = <2800000>;
|
||||
regulator-max-microvolt = <2800000>;
|
||||
gpio = <&pcal6408ahk_b 1 1>;
|
||||
enable-active-high;
|
||||
};
|
||||
|
||||
soc_dovdd18_rgb_reg: soc_dovdd18_rgb {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "soc_dovdd18_rgb";
|
||||
regulator-min-microvolt = <2800000>;
|
||||
regulator-max-microvolt = <2800000>;
|
||||
gpio = <&pcal6408ahk_b 2 1>;
|
||||
enable-active-high;
|
||||
};
|
||||
|
||||
soc_dvdd12_rgb_reg: soc_dvdd12_rgb {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "soc_dvdd12_rgb";
|
||||
regulator-min-microvolt = <2800000>;
|
||||
regulator-max-microvolt = <2800000>;
|
||||
gpio = <&pcal6408ahk_b 0 1>;
|
||||
enable-active-high;
|
||||
};
|
||||
|
||||
soc_avdd25_ir_reg: soc_avdd25_ir {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "soc_avdd25_ir";
|
||||
regulator-min-microvolt = <2500000>;
|
||||
regulator-max-microvolt = <2500000>;
|
||||
gpio = <&pcal6408ahk_b 5 1>;
|
||||
enable-active-high;
|
||||
};
|
||||
|
||||
soc_dovdd18_ir_reg: soc_dovdd18_ir {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "soc_dovdd18_ir";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
gpio = <&pcal6408ahk_b 3 1>;
|
||||
enable-active-high;
|
||||
};
|
||||
|
||||
soc_dvdd12_ir_reg: soc_dvdd12_ir {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "soc_dvdd12_ir";
|
||||
regulator-min-microvolt = <1200000>;
|
||||
regulator-max-microvolt = <1200000>;
|
||||
gpio = <&pcal6408ahk_b 4 1>;
|
||||
enable-active-high;
|
||||
};
|
||||
|
||||
soc_cam2_avdd25_ir_reg: soc_cam2_avdd25_ir {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "soc_cam2_avdd25_ir";
|
||||
regulator-min-microvolt = <2500000>;
|
||||
regulator-max-microvolt = <2500000>;
|
||||
gpio = <&pcal6408ahk_b 7 1>;
|
||||
enable-active-high;
|
||||
};
|
||||
|
||||
soc_cam2_dovdd18_ir_reg: soc_cam2_dovdd18_ir {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "soc_cam2_dovdd18_ir";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
gpio = <&pcal6408ahk_b 6 1>;
|
||||
enable-active-high;
|
||||
};
|
||||
|
||||
soc_cam2_dvdd12_ir_reg: soc_cam2_dvdd12_ir {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "soc_cam2_dvdd12_ir";
|
||||
regulator-min-microvolt = <1200000>;
|
||||
regulator-max-microvolt = <1200000>;
|
||||
gpio = <&pcal6408ahk_c 0 1>;
|
||||
enable-active-high;
|
||||
};
|
||||
|
||||
dvdd_cpu_reg: appcpu_dvdd {
|
||||
compatible = "thead,light-dialog-pmic";
|
||||
regulator-name = "appcpu_dvdd";
|
||||
@@ -897,7 +778,7 @@
|
||||
|
||||
es8388_audio_codec: es8388@11 {
|
||||
#sound-dai-cells = <0>;
|
||||
compatible = "everest,es8388", "everest,es8323";
|
||||
compatible = "everest,es8323";
|
||||
reg = <0x11>;
|
||||
sound-name-prefix = "ES8388";
|
||||
headset-detect = <&rk_headset>;
|
||||
@@ -910,17 +791,6 @@
|
||||
pinctrl-0 = <&pinctrl_audiopa3 &pinctrl_audiopa2>;
|
||||
};
|
||||
|
||||
es7210_audio_codec: es7210@40 {
|
||||
#sound-dai-cells = <0>;
|
||||
compatible = "MicArray_0";
|
||||
reg = <0x40>;
|
||||
sound-name-prefix = "ES7210";
|
||||
MVDD-supply = <&soc_aud_3v3_en_reg>;
|
||||
AVDD-supply = <&soc_aud_3v3_en_reg>;
|
||||
DVDD-supply = <&soc_aud_1v8_en_reg>;
|
||||
PVDD-supply = <&soc_aud_1v8_en_reg>;
|
||||
};
|
||||
|
||||
audio_aw87519_pa: amp@58 {
|
||||
compatible = "awinic,aw87519_pa";
|
||||
reg = <0x58>;
|
||||
@@ -950,13 +820,6 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
es7210_audio_codec_1: es7210@40 {
|
||||
#sound-dai-cells = <0>;
|
||||
compatible = "MicArray_0";
|
||||
reg = <0x40>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
audio_aw87519_pa2@58 {
|
||||
compatible = "awinic,aw87519_pa";
|
||||
reg = <0x58>;
|
||||
@@ -1060,24 +923,6 @@
|
||||
};
|
||||
};
|
||||
|
||||
&qspi1 {
|
||||
compatible = "snps,dw-apb-ssi";
|
||||
num-cs = <1>;
|
||||
cs-gpios = <&gpio0_porta 1 0>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_qspi1>;
|
||||
status = "okay";
|
||||
|
||||
spidev@0 {
|
||||
compatible = "spidev";
|
||||
#address-cells = <0x1>;
|
||||
#size-cells = <0x1>;
|
||||
reg = <0x0>;
|
||||
spi-max-frequency = <50000000>;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
&gmac0 {
|
||||
phy-mode = "rgmii-id";
|
||||
rx-clk-delay = <0x00>; /* for RGMII */
|
||||
@@ -1568,13 +1413,6 @@
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2c0>;
|
||||
|
||||
pcal6408ahk_b: gpio@18 {
|
||||
compatible = "nxp,pca9557";
|
||||
reg = <0x18>;
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
};
|
||||
|
||||
usbc0: husb311_0@4e {
|
||||
compatible = "hynetek,husb311";
|
||||
reg = <0x4e>;
|
||||
@@ -1664,13 +1502,6 @@
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2c1>;
|
||||
|
||||
pcal6408ahk_c: gpio@18 {
|
||||
compatible = "nxp,pca9557";
|
||||
reg = <0x18>;
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
};
|
||||
|
||||
hc32fx_mcu:hc32fx_mcu@0x4c {
|
||||
compatible = "hc32fx-mcu";
|
||||
reg = <0x4c>;
|
||||
@@ -1736,13 +1567,6 @@
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2c3>;
|
||||
|
||||
pcal6408ahk_d: gpio@18 {
|
||||
compatible = "nxp,pca9557";
|
||||
reg = <0x18>;
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
};
|
||||
|
||||
touch@14 {
|
||||
#gpio-cells = <2>;
|
||||
compatible = "goodix,gt9271";
|
||||
@@ -1839,74 +1663,6 @@
|
||||
memory-region = <&dsp1_mem>;
|
||||
};
|
||||
|
||||
&vvcam_sensor0 {
|
||||
sensor_name = "OV12870";
|
||||
sensor_regulators = "soc_dovdd18_rgb", "soc_dvdd12_rgb", "soc_avdd28_rgb";
|
||||
sensor_regulator_timing_us = <70 50 20>;
|
||||
sensor_pdn = <&gpio1_porta 28 0>; //powerdown pin / shutdown pin
|
||||
sensor_rst = <&pcal6408ahk_c 1 0>;
|
||||
sensor_pdn_delay_us = <4000>; //powerdown pin / shutdown pin actived till I2C ready
|
||||
DOVDD18_RGB-supply = <&soc_dovdd18_rgb_reg>;
|
||||
DVDD12_RGB-supply = <&soc_dvdd12_rgb_reg>;
|
||||
AVDD28_RGB-supply = <&soc_avdd28_rgb_reg>;
|
||||
i2c_reg_width = /bits/ 8 <2>;
|
||||
i2c_data_width = /bits/ 8 <1>;
|
||||
i2c_addr = /bits/ 8 <0x10>;
|
||||
i2c_bus = /bits/ 8 <0>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&vvcam_sensor1 {//cam1 csia
|
||||
sensor_name = "SC132GS";
|
||||
sensor_regulators = "soc_dovdd18_ir", "soc_dvdd12_ir", "soc_avdd25_ir";
|
||||
sensor_regulator_timing_us = <70 1000 2000>;
|
||||
i2c_addr = /bits/ 8 <0x30>;
|
||||
sensor_pdn = <&gpio1_porta 30 0>; //powerdown pin / shutdown pin
|
||||
sensor_rst = <&pcal6408ahk_c 2 0>;
|
||||
sensor_pdn_delay_us = <2000>; //powerdown pin / shutdown pin actived till I2C ready
|
||||
DOVDD18_IR-supply = <&soc_dovdd18_ir_reg>;
|
||||
DVDD12_IR-supply = <&soc_dvdd12_ir_reg>;
|
||||
AVDD25_IR-supply = <&soc_avdd25_ir_reg>;
|
||||
i2c_reg_width = /bits/ 8 <2>;
|
||||
i2c_data_width = /bits/ 8 <1>;
|
||||
i2c_bus = /bits/ 8 <1>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&vvcam_sensor2 {//cam2 csib
|
||||
sensor_name = "SC132GS";
|
||||
sensor_regulators = "soc_cam2_dovdd18_ir", "soc_cam2_dvdd12_ir", "soc_cam2_avdd25_ir";
|
||||
sensor_regulator_timing_us = <70 1000 2000>;
|
||||
i2c_addr = /bits/ 8 <0x30>;
|
||||
sensor_pdn = <&gpio2_porta 13 0>; //powerdown pin / shutdown pin
|
||||
sensor_rst = <&pcal6408ahk_c 3 0>;
|
||||
sensor_pdn_delay_us = <2000>; //powerdown pin / shutdown pin actived till I2C ready
|
||||
DOVDD18_IR-supply = <&soc_cam2_dovdd18_ir_reg>;
|
||||
DVDD12_IR-supply = <&soc_cam2_dvdd12_ir_reg>;
|
||||
AVDD25_IR-supply = <&soc_cam2_avdd25_ir_reg>;
|
||||
i2c_reg_width = /bits/ 8 <2>;
|
||||
i2c_data_width = /bits/ 8 <1>;
|
||||
i2c_bus = /bits/ 8 <2>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&vvcam_sensor3 {//cam3 csi0 modified
|
||||
sensor_name = "OV5693";
|
||||
sensor_regulators = "soc_dovdd18_rgb", "soc_dvdd12_rgb", "soc_avdd28_rgb";
|
||||
sensor_regulator_timing_us = <70 50 20>;
|
||||
sensor_pdn = <&gpio1_porta 28 0>; //powerdown pin / shutdown pin
|
||||
sensor_rst = <&pcal6408ahk_c 1 0>;
|
||||
sensor_pdn_delay_us = <4000>; //powerdown pin / shutdown pin actived till I2C ready
|
||||
DOVDD18_RGB-supply = <&soc_dovdd18_rgb_reg>;
|
||||
DVDD12_RGB-supply = <&soc_dvdd12_rgb_reg>;
|
||||
AVDD28_RGB-supply = <&soc_avdd28_rgb_reg>;
|
||||
i2c_reg_width = /bits/ 8 <2>;
|
||||
i2c_data_width = /bits/ 8 <1>;
|
||||
i2c_addr = /bits/ 8 <0x36>;
|
||||
i2c_bus = /bits/ 8 <0>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&video2 {
|
||||
vi_mem_pool_region = <0>; // vi_mem: framebuffer, region[0]
|
||||
status = "okay";
|
||||
@@ -2220,17 +1976,7 @@
|
||||
sound-dai = <&es8388_audio_codec>;
|
||||
};
|
||||
};
|
||||
simple-audio-card,dai-link@1 { /* I2S - AUDIO SYS CODEC 7210*/
|
||||
reg = <1>;
|
||||
format = "i2s";
|
||||
cpu {
|
||||
sound-dai = <&i2s1 0>;
|
||||
};
|
||||
codec {
|
||||
sound-dai = <&es7210_audio_codec>;
|
||||
};
|
||||
};
|
||||
simple-audio-card,dai-link@2 { /* I2S - HDMI*/
|
||||
simple-audio-card,dai-link@1 { /* I2S - HDMI*/
|
||||
reg = <2>;
|
||||
format = "i2s";
|
||||
cpu {
|
||||
|
||||
@@ -1767,8 +1767,8 @@
|
||||
light,sel = "ap_i2s";
|
||||
interrupt-parent = <&intc>;
|
||||
interrupts = <70>;
|
||||
dmas = <&dmac0 35>, <&dmac0 40>;
|
||||
dma-names = "tx", "rx";
|
||||
dmas = <&dmac0 35>;
|
||||
dma-names = "tx";
|
||||
light,dma_maxburst = <4>;
|
||||
#dma-cells = <1>;
|
||||
clocks = <&vosys_clk_gate LIGHT_CLKGEN_HDMI_I2S_CLK>;
|
||||
@@ -2162,7 +2162,7 @@
|
||||
clocks = <&clk CLKGEN_I2C1_PCLK>;
|
||||
clock-names = "pclk";
|
||||
clock-frequency = <100000>;
|
||||
i2c_mode = "dma";
|
||||
// i2c_mode = "dma";
|
||||
dmas = <&dmac0 14>, <&dmac0 15>;
|
||||
dma-names = "tx", "rx";
|
||||
#dma-cells = <1>;
|
||||
@@ -2238,7 +2238,7 @@
|
||||
clocks = <&clk CLKGEN_I2C4_PCLK>;
|
||||
clock-names = "pclk";
|
||||
clock-frequency = <100000>;
|
||||
i2c_mode = "dma";
|
||||
// i2c_mode = "dma";
|
||||
dmas = <&dmac0 20>, <&dmac0 21>;
|
||||
dma-names = "tx", "rx";
|
||||
#dma-cells = <1>;
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
#define LT_8911_I2C_ADAPTER 3
|
||||
#define LT_8911_I2C_ADDR 0x45
|
||||
|
||||
static struct i2c_mipi_dsi *g_lt8911_mipi_dsi = NULL;
|
||||
static struct i2c_mipi_dsi g_lt8911_mipi_dsi;
|
||||
static bool g_is_std_suspend __nosavedata;
|
||||
|
||||
static const struct drm_display_mode lt8911_default_mode = {
|
||||
@@ -707,7 +707,7 @@ static int backlight_init(struct i2c_mipi_dsi *md)
|
||||
static int i2c_md_probe(struct i2c_client *client, const struct i2c_device_id *id)
|
||||
{
|
||||
struct device *dev = &client->dev;
|
||||
struct i2c_mipi_dsi *md = g_lt8911_mipi_dsi;
|
||||
struct i2c_mipi_dsi *md = &g_lt8911_mipi_dsi;
|
||||
|
||||
DBG_FUNC("start");
|
||||
|
||||
@@ -872,13 +872,10 @@ static int lt8911_dsi_probe(struct mipi_dsi_device *dsi)
|
||||
int ret;
|
||||
struct i2c_mipi_dsi *ctx;
|
||||
|
||||
ctx = g_lt8911_mipi_dsi;
|
||||
ctx = &g_lt8911_mipi_dsi;
|
||||
|
||||
if(ctx == NULL){
|
||||
ctx = devm_kzalloc(&dsi->dev, sizeof(*ctx), GFP_KERNEL);
|
||||
if (!ctx)
|
||||
return -ENOMEM;
|
||||
g_lt8911_mipi_dsi = ctx;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
if(ctx->client == NULL){
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
#include <video/mipi_display.h>
|
||||
|
||||
|
||||
#if 0
|
||||
#if 1
|
||||
#define DBG_FUNC(format, x...) printk(KERN_ERR "[DSI]%s:" format"\n", __func__, ##x)
|
||||
#define DBG_PRINT(format, x...) printk(KERN_ERR "[DSI]" format"\n", ##x)
|
||||
#else
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
#ifndef _XT_CONNMARK_H_target
|
||||
#define _XT_CONNMARK_H_target
|
||||
|
||||
#include <linux/netfilter/xt_connmark.h>
|
||||
|
||||
#endif /*_XT_CONNMARK_H_target*/
|
||||
@@ -1,27 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
/* x_tables module for setting the IPv4/IPv6 DSCP field
|
||||
*
|
||||
* (C) 2002 Harald Welte <laforge@gnumonks.org>
|
||||
* based on ipt_FTOS.c (C) 2000 by Matthew G. Marsh <mgm@paktronix.com>
|
||||
* This software is distributed under GNU GPL v2, 1991
|
||||
*
|
||||
* See RFC2474 for a description of the DSCP field within the IP Header.
|
||||
*
|
||||
* xt_DSCP.h,v 1.7 2002/03/14 12:03:13 laforge Exp
|
||||
*/
|
||||
#ifndef _XT_DSCP_TARGET_H
|
||||
#define _XT_DSCP_TARGET_H
|
||||
#include <linux/netfilter/xt_dscp.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
/* target info */
|
||||
struct xt_DSCP_info {
|
||||
__u8 dscp;
|
||||
};
|
||||
|
||||
struct xt_tos_target_info {
|
||||
__u8 tos_value;
|
||||
__u8 tos_mask;
|
||||
};
|
||||
|
||||
#endif /* _XT_DSCP_TARGET_H */
|
||||
@@ -1,7 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
#ifndef _XT_MARK_H_target
|
||||
#define _XT_MARK_H_target
|
||||
|
||||
#include <linux/netfilter/xt_mark.h>
|
||||
|
||||
#endif /*_XT_MARK_H_target */
|
||||
@@ -1,17 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
#ifndef _XT_RATEEST_TARGET_H
|
||||
#define _XT_RATEEST_TARGET_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/if.h>
|
||||
|
||||
struct xt_rateest_target_info {
|
||||
char name[IFNAMSIZ];
|
||||
__s8 interval;
|
||||
__u8 ewma_log;
|
||||
|
||||
/* Used internally by the kernel */
|
||||
struct xt_rateest *est __attribute__((aligned(8)));
|
||||
};
|
||||
|
||||
#endif /* _XT_RATEEST_TARGET_H */
|
||||
@@ -1,13 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
#ifndef _XT_TCPMSS_H
|
||||
#define _XT_TCPMSS_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
struct xt_tcpmss_info {
|
||||
__u16 mss;
|
||||
};
|
||||
|
||||
#define XT_TCPMSS_CLAMP_PMTU 0xffff
|
||||
|
||||
#endif /* _XT_TCPMSS_H */
|
||||
@@ -1,34 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
/* Header file for iptables ipt_ECN target
|
||||
*
|
||||
* (C) 2002 by Harald Welte <laforge@gnumonks.org>
|
||||
*
|
||||
* This software is distributed under GNU GPL v2, 1991
|
||||
*
|
||||
* ipt_ECN.h,v 1.3 2002/05/29 12:17:40 laforge Exp
|
||||
*/
|
||||
#ifndef _IPT_ECN_TARGET_H
|
||||
#define _IPT_ECN_TARGET_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/netfilter/xt_DSCP.h>
|
||||
|
||||
#define IPT_ECN_IP_MASK (~XT_DSCP_MASK)
|
||||
|
||||
#define IPT_ECN_OP_SET_IP 0x01 /* set ECN bits of IPv4 header */
|
||||
#define IPT_ECN_OP_SET_ECE 0x10 /* set ECE bit of TCP header */
|
||||
#define IPT_ECN_OP_SET_CWR 0x20 /* set CWR bit of TCP header */
|
||||
|
||||
#define IPT_ECN_OP_MASK 0xce
|
||||
|
||||
struct ipt_ECN_info {
|
||||
__u8 operation; /* bitset of operations */
|
||||
__u8 ip_ect; /* ECT codepoint of IPv4 header, pre-shifted */
|
||||
union {
|
||||
struct {
|
||||
__u8 ece:1, cwr:1; /* TCP ECT bits */
|
||||
} tcp;
|
||||
} proto;
|
||||
};
|
||||
|
||||
#endif /* _IPT_ECN_TARGET_H */
|
||||
@@ -1,24 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
/* TTL modification module for IP tables
|
||||
* (C) 2000 by Harald Welte <laforge@netfilter.org> */
|
||||
|
||||
#ifndef _IPT_TTL_H
|
||||
#define _IPT_TTL_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
enum {
|
||||
IPT_TTL_SET = 0,
|
||||
IPT_TTL_INC,
|
||||
IPT_TTL_DEC
|
||||
};
|
||||
|
||||
#define IPT_TTL_MAXMODE IPT_TTL_DEC
|
||||
|
||||
struct ipt_TTL_info {
|
||||
__u8 mode;
|
||||
__u8 ttl;
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
@@ -1,25 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
/* Hop Limit modification module for ip6tables
|
||||
* Maciej Soltysiak <solt@dns.toxicfilms.tv>
|
||||
* Based on HW's TTL module */
|
||||
|
||||
#ifndef _IP6T_HL_H
|
||||
#define _IP6T_HL_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
enum {
|
||||
IP6T_HL_SET = 0,
|
||||
IP6T_HL_INC,
|
||||
IP6T_HL_DEC
|
||||
};
|
||||
|
||||
#define IP6T_HL_MAXMODE IP6T_HL_DEC
|
||||
|
||||
struct ip6t_HL_info {
|
||||
__u8 mode;
|
||||
__u8 hop_limit;
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
@@ -1,161 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/* x_tables module for setting the IPv4/IPv6 DSCP field, Version 1.8
|
||||
*
|
||||
* (C) 2002 by Harald Welte <laforge@netfilter.org>
|
||||
* based on ipt_FTOS.c (C) 2000 by Matthew G. Marsh <mgm@paktronix.com>
|
||||
*
|
||||
* See RFC2474 for a description of the DSCP field within the IP Header.
|
||||
*/
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
#include <linux/module.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/ip.h>
|
||||
#include <linux/ipv6.h>
|
||||
#include <net/dsfield.h>
|
||||
|
||||
#include <linux/netfilter/x_tables.h>
|
||||
#include <linux/netfilter/xt_DSCP.h>
|
||||
|
||||
MODULE_AUTHOR("Harald Welte <laforge@netfilter.org>");
|
||||
MODULE_DESCRIPTION("Xtables: DSCP/TOS field modification");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS("ipt_DSCP");
|
||||
MODULE_ALIAS("ip6t_DSCP");
|
||||
MODULE_ALIAS("ipt_TOS");
|
||||
MODULE_ALIAS("ip6t_TOS");
|
||||
|
||||
static unsigned int
|
||||
dscp_tg(struct sk_buff *skb, const struct xt_action_param *par)
|
||||
{
|
||||
const struct xt_DSCP_info *dinfo = par->targinfo;
|
||||
u_int8_t dscp = ipv4_get_dsfield(ip_hdr(skb)) >> XT_DSCP_SHIFT;
|
||||
|
||||
if (dscp != dinfo->dscp) {
|
||||
if (skb_ensure_writable(skb, sizeof(struct iphdr)))
|
||||
return NF_DROP;
|
||||
|
||||
ipv4_change_dsfield(ip_hdr(skb),
|
||||
(__force __u8)(~XT_DSCP_MASK),
|
||||
dinfo->dscp << XT_DSCP_SHIFT);
|
||||
|
||||
}
|
||||
return XT_CONTINUE;
|
||||
}
|
||||
|
||||
static unsigned int
|
||||
dscp_tg6(struct sk_buff *skb, const struct xt_action_param *par)
|
||||
{
|
||||
const struct xt_DSCP_info *dinfo = par->targinfo;
|
||||
u_int8_t dscp = ipv6_get_dsfield(ipv6_hdr(skb)) >> XT_DSCP_SHIFT;
|
||||
|
||||
if (dscp != dinfo->dscp) {
|
||||
if (skb_ensure_writable(skb, sizeof(struct ipv6hdr)))
|
||||
return NF_DROP;
|
||||
|
||||
ipv6_change_dsfield(ipv6_hdr(skb),
|
||||
(__force __u8)(~XT_DSCP_MASK),
|
||||
dinfo->dscp << XT_DSCP_SHIFT);
|
||||
}
|
||||
return XT_CONTINUE;
|
||||
}
|
||||
|
||||
static int dscp_tg_check(const struct xt_tgchk_param *par)
|
||||
{
|
||||
const struct xt_DSCP_info *info = par->targinfo;
|
||||
|
||||
if (info->dscp > XT_DSCP_MAX)
|
||||
return -EDOM;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static unsigned int
|
||||
tos_tg(struct sk_buff *skb, const struct xt_action_param *par)
|
||||
{
|
||||
const struct xt_tos_target_info *info = par->targinfo;
|
||||
struct iphdr *iph = ip_hdr(skb);
|
||||
u_int8_t orig, nv;
|
||||
|
||||
orig = ipv4_get_dsfield(iph);
|
||||
nv = (orig & ~info->tos_mask) ^ info->tos_value;
|
||||
|
||||
if (orig != nv) {
|
||||
if (skb_ensure_writable(skb, sizeof(struct iphdr)))
|
||||
return NF_DROP;
|
||||
iph = ip_hdr(skb);
|
||||
ipv4_change_dsfield(iph, 0, nv);
|
||||
}
|
||||
|
||||
return XT_CONTINUE;
|
||||
}
|
||||
|
||||
static unsigned int
|
||||
tos_tg6(struct sk_buff *skb, const struct xt_action_param *par)
|
||||
{
|
||||
const struct xt_tos_target_info *info = par->targinfo;
|
||||
struct ipv6hdr *iph = ipv6_hdr(skb);
|
||||
u_int8_t orig, nv;
|
||||
|
||||
orig = ipv6_get_dsfield(iph);
|
||||
nv = (orig & ~info->tos_mask) ^ info->tos_value;
|
||||
|
||||
if (orig != nv) {
|
||||
if (skb_ensure_writable(skb, sizeof(struct iphdr)))
|
||||
return NF_DROP;
|
||||
iph = ipv6_hdr(skb);
|
||||
ipv6_change_dsfield(iph, 0, nv);
|
||||
}
|
||||
|
||||
return XT_CONTINUE;
|
||||
}
|
||||
|
||||
static struct xt_target dscp_tg_reg[] __read_mostly = {
|
||||
{
|
||||
.name = "DSCP",
|
||||
.family = NFPROTO_IPV4,
|
||||
.checkentry = dscp_tg_check,
|
||||
.target = dscp_tg,
|
||||
.targetsize = sizeof(struct xt_DSCP_info),
|
||||
.table = "mangle",
|
||||
.me = THIS_MODULE,
|
||||
},
|
||||
{
|
||||
.name = "DSCP",
|
||||
.family = NFPROTO_IPV6,
|
||||
.checkentry = dscp_tg_check,
|
||||
.target = dscp_tg6,
|
||||
.targetsize = sizeof(struct xt_DSCP_info),
|
||||
.table = "mangle",
|
||||
.me = THIS_MODULE,
|
||||
},
|
||||
{
|
||||
.name = "TOS",
|
||||
.revision = 1,
|
||||
.family = NFPROTO_IPV4,
|
||||
.table = "mangle",
|
||||
.target = tos_tg,
|
||||
.targetsize = sizeof(struct xt_tos_target_info),
|
||||
.me = THIS_MODULE,
|
||||
},
|
||||
{
|
||||
.name = "TOS",
|
||||
.revision = 1,
|
||||
.family = NFPROTO_IPV6,
|
||||
.table = "mangle",
|
||||
.target = tos_tg6,
|
||||
.targetsize = sizeof(struct xt_tos_target_info),
|
||||
.me = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init dscp_tg_init(void)
|
||||
{
|
||||
return xt_register_targets(dscp_tg_reg, ARRAY_SIZE(dscp_tg_reg));
|
||||
}
|
||||
|
||||
static void __exit dscp_tg_exit(void)
|
||||
{
|
||||
xt_unregister_targets(dscp_tg_reg, ARRAY_SIZE(dscp_tg_reg));
|
||||
}
|
||||
|
||||
module_init(dscp_tg_init);
|
||||
module_exit(dscp_tg_exit);
|
||||
@@ -1,159 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* TTL modification target for IP tables
|
||||
* (C) 2000,2005 by Harald Welte <laforge@netfilter.org>
|
||||
*
|
||||
* Hop Limit modification target for ip6tables
|
||||
* Maciej Soltysiak <solt@dns.toxicfilms.tv>
|
||||
*/
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
#include <linux/module.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/ip.h>
|
||||
#include <linux/ipv6.h>
|
||||
#include <net/checksum.h>
|
||||
|
||||
#include <linux/netfilter/x_tables.h>
|
||||
#include <linux/netfilter_ipv4/ipt_TTL.h>
|
||||
#include <linux/netfilter_ipv6/ip6t_HL.h>
|
||||
|
||||
MODULE_AUTHOR("Harald Welte <laforge@netfilter.org>");
|
||||
MODULE_AUTHOR("Maciej Soltysiak <solt@dns.toxicfilms.tv>");
|
||||
MODULE_DESCRIPTION("Xtables: Hoplimit/TTL Limit field modification target");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
static unsigned int
|
||||
ttl_tg(struct sk_buff *skb, const struct xt_action_param *par)
|
||||
{
|
||||
struct iphdr *iph;
|
||||
const struct ipt_TTL_info *info = par->targinfo;
|
||||
int new_ttl;
|
||||
|
||||
if (skb_ensure_writable(skb, sizeof(*iph)))
|
||||
return NF_DROP;
|
||||
|
||||
iph = ip_hdr(skb);
|
||||
|
||||
switch (info->mode) {
|
||||
case IPT_TTL_SET:
|
||||
new_ttl = info->ttl;
|
||||
break;
|
||||
case IPT_TTL_INC:
|
||||
new_ttl = iph->ttl + info->ttl;
|
||||
if (new_ttl > 255)
|
||||
new_ttl = 255;
|
||||
break;
|
||||
case IPT_TTL_DEC:
|
||||
new_ttl = iph->ttl - info->ttl;
|
||||
if (new_ttl < 0)
|
||||
new_ttl = 0;
|
||||
break;
|
||||
default:
|
||||
new_ttl = iph->ttl;
|
||||
break;
|
||||
}
|
||||
|
||||
if (new_ttl != iph->ttl) {
|
||||
csum_replace2(&iph->check, htons(iph->ttl << 8),
|
||||
htons(new_ttl << 8));
|
||||
iph->ttl = new_ttl;
|
||||
}
|
||||
|
||||
return XT_CONTINUE;
|
||||
}
|
||||
|
||||
static unsigned int
|
||||
hl_tg6(struct sk_buff *skb, const struct xt_action_param *par)
|
||||
{
|
||||
struct ipv6hdr *ip6h;
|
||||
const struct ip6t_HL_info *info = par->targinfo;
|
||||
int new_hl;
|
||||
|
||||
if (skb_ensure_writable(skb, sizeof(*ip6h)))
|
||||
return NF_DROP;
|
||||
|
||||
ip6h = ipv6_hdr(skb);
|
||||
|
||||
switch (info->mode) {
|
||||
case IP6T_HL_SET:
|
||||
new_hl = info->hop_limit;
|
||||
break;
|
||||
case IP6T_HL_INC:
|
||||
new_hl = ip6h->hop_limit + info->hop_limit;
|
||||
if (new_hl > 255)
|
||||
new_hl = 255;
|
||||
break;
|
||||
case IP6T_HL_DEC:
|
||||
new_hl = ip6h->hop_limit - info->hop_limit;
|
||||
if (new_hl < 0)
|
||||
new_hl = 0;
|
||||
break;
|
||||
default:
|
||||
new_hl = ip6h->hop_limit;
|
||||
break;
|
||||
}
|
||||
|
||||
ip6h->hop_limit = new_hl;
|
||||
|
||||
return XT_CONTINUE;
|
||||
}
|
||||
|
||||
static int ttl_tg_check(const struct xt_tgchk_param *par)
|
||||
{
|
||||
const struct ipt_TTL_info *info = par->targinfo;
|
||||
|
||||
if (info->mode > IPT_TTL_MAXMODE)
|
||||
return -EINVAL;
|
||||
if (info->mode != IPT_TTL_SET && info->ttl == 0)
|
||||
return -EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int hl_tg6_check(const struct xt_tgchk_param *par)
|
||||
{
|
||||
const struct ip6t_HL_info *info = par->targinfo;
|
||||
|
||||
if (info->mode > IP6T_HL_MAXMODE)
|
||||
return -EINVAL;
|
||||
if (info->mode != IP6T_HL_SET && info->hop_limit == 0)
|
||||
return -EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct xt_target hl_tg_reg[] __read_mostly = {
|
||||
{
|
||||
.name = "TTL",
|
||||
.revision = 0,
|
||||
.family = NFPROTO_IPV4,
|
||||
.target = ttl_tg,
|
||||
.targetsize = sizeof(struct ipt_TTL_info),
|
||||
.table = "mangle",
|
||||
.checkentry = ttl_tg_check,
|
||||
.me = THIS_MODULE,
|
||||
},
|
||||
{
|
||||
.name = "HL",
|
||||
.revision = 0,
|
||||
.family = NFPROTO_IPV6,
|
||||
.target = hl_tg6,
|
||||
.targetsize = sizeof(struct ip6t_HL_info),
|
||||
.table = "mangle",
|
||||
.checkentry = hl_tg6_check,
|
||||
.me = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init hl_tg_init(void)
|
||||
{
|
||||
return xt_register_targets(hl_tg_reg, ARRAY_SIZE(hl_tg_reg));
|
||||
}
|
||||
|
||||
static void __exit hl_tg_exit(void)
|
||||
{
|
||||
xt_unregister_targets(hl_tg_reg, ARRAY_SIZE(hl_tg_reg));
|
||||
}
|
||||
|
||||
module_init(hl_tg_init);
|
||||
module_exit(hl_tg_exit);
|
||||
MODULE_ALIAS("ipt_TTL");
|
||||
MODULE_ALIAS("ip6t_HL");
|
||||
@@ -1,232 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* (C) 2007 Patrick McHardy <kaber@trash.net>
|
||||
*/
|
||||
#include <linux/module.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/gen_stats.h>
|
||||
#include <linux/jhash.h>
|
||||
#include <linux/rtnetlink.h>
|
||||
#include <linux/random.h>
|
||||
#include <linux/slab.h>
|
||||
#include <net/gen_stats.h>
|
||||
#include <net/netlink.h>
|
||||
#include <net/netns/generic.h>
|
||||
|
||||
#include <linux/netfilter/x_tables.h>
|
||||
#include <linux/netfilter/xt_RATEEST.h>
|
||||
#include <net/netfilter/xt_rateest.h>
|
||||
|
||||
#define RATEEST_HSIZE 16
|
||||
|
||||
struct xt_rateest_net {
|
||||
struct mutex hash_lock;
|
||||
struct hlist_head hash[RATEEST_HSIZE];
|
||||
};
|
||||
|
||||
static unsigned int xt_rateest_id;
|
||||
|
||||
static unsigned int jhash_rnd __read_mostly;
|
||||
|
||||
static unsigned int xt_rateest_hash(const char *name)
|
||||
{
|
||||
return jhash(name, sizeof_field(struct xt_rateest, name), jhash_rnd) &
|
||||
(RATEEST_HSIZE - 1);
|
||||
}
|
||||
|
||||
static void xt_rateest_hash_insert(struct xt_rateest_net *xn,
|
||||
struct xt_rateest *est)
|
||||
{
|
||||
unsigned int h;
|
||||
|
||||
h = xt_rateest_hash(est->name);
|
||||
hlist_add_head(&est->list, &xn->hash[h]);
|
||||
}
|
||||
|
||||
static struct xt_rateest *__xt_rateest_lookup(struct xt_rateest_net *xn,
|
||||
const char *name)
|
||||
{
|
||||
struct xt_rateest *est;
|
||||
unsigned int h;
|
||||
|
||||
h = xt_rateest_hash(name);
|
||||
hlist_for_each_entry(est, &xn->hash[h], list) {
|
||||
if (strcmp(est->name, name) == 0) {
|
||||
est->refcnt++;
|
||||
return est;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct xt_rateest *xt_rateest_lookup(struct net *net, const char *name)
|
||||
{
|
||||
struct xt_rateest_net *xn = net_generic(net, xt_rateest_id);
|
||||
struct xt_rateest *est;
|
||||
|
||||
mutex_lock(&xn->hash_lock);
|
||||
est = __xt_rateest_lookup(xn, name);
|
||||
mutex_unlock(&xn->hash_lock);
|
||||
return est;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(xt_rateest_lookup);
|
||||
|
||||
void xt_rateest_put(struct net *net, struct xt_rateest *est)
|
||||
{
|
||||
struct xt_rateest_net *xn = net_generic(net, xt_rateest_id);
|
||||
|
||||
mutex_lock(&xn->hash_lock);
|
||||
if (--est->refcnt == 0) {
|
||||
hlist_del(&est->list);
|
||||
gen_kill_estimator(&est->rate_est);
|
||||
/*
|
||||
* gen_estimator est_timer() might access est->lock or bstats,
|
||||
* wait a RCU grace period before freeing 'est'
|
||||
*/
|
||||
kfree_rcu(est, rcu);
|
||||
}
|
||||
mutex_unlock(&xn->hash_lock);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(xt_rateest_put);
|
||||
|
||||
static unsigned int
|
||||
xt_rateest_tg(struct sk_buff *skb, const struct xt_action_param *par)
|
||||
{
|
||||
const struct xt_rateest_target_info *info = par->targinfo;
|
||||
struct gnet_stats_basic_packed *stats = &info->est->bstats;
|
||||
|
||||
spin_lock_bh(&info->est->lock);
|
||||
stats->bytes += skb->len;
|
||||
stats->packets++;
|
||||
spin_unlock_bh(&info->est->lock);
|
||||
|
||||
return XT_CONTINUE;
|
||||
}
|
||||
|
||||
static int xt_rateest_tg_checkentry(const struct xt_tgchk_param *par)
|
||||
{
|
||||
struct xt_rateest_net *xn = net_generic(par->net, xt_rateest_id);
|
||||
struct xt_rateest_target_info *info = par->targinfo;
|
||||
struct xt_rateest *est;
|
||||
struct {
|
||||
struct nlattr opt;
|
||||
struct gnet_estimator est;
|
||||
} cfg;
|
||||
int ret;
|
||||
|
||||
if (strnlen(info->name, sizeof(est->name)) >= sizeof(est->name))
|
||||
return -ENAMETOOLONG;
|
||||
|
||||
net_get_random_once(&jhash_rnd, sizeof(jhash_rnd));
|
||||
|
||||
mutex_lock(&xn->hash_lock);
|
||||
est = __xt_rateest_lookup(xn, info->name);
|
||||
if (est) {
|
||||
mutex_unlock(&xn->hash_lock);
|
||||
/*
|
||||
* If estimator parameters are specified, they must match the
|
||||
* existing estimator.
|
||||
*/
|
||||
if ((!info->interval && !info->ewma_log) ||
|
||||
(info->interval != est->params.interval ||
|
||||
info->ewma_log != est->params.ewma_log)) {
|
||||
xt_rateest_put(par->net, est);
|
||||
return -EINVAL;
|
||||
}
|
||||
info->est = est;
|
||||
return 0;
|
||||
}
|
||||
|
||||
ret = -ENOMEM;
|
||||
est = kzalloc(sizeof(*est), GFP_KERNEL);
|
||||
if (!est)
|
||||
goto err1;
|
||||
|
||||
strlcpy(est->name, info->name, sizeof(est->name));
|
||||
spin_lock_init(&est->lock);
|
||||
est->refcnt = 1;
|
||||
est->params.interval = info->interval;
|
||||
est->params.ewma_log = info->ewma_log;
|
||||
|
||||
cfg.opt.nla_len = nla_attr_size(sizeof(cfg.est));
|
||||
cfg.opt.nla_type = TCA_STATS_RATE_EST;
|
||||
cfg.est.interval = info->interval;
|
||||
cfg.est.ewma_log = info->ewma_log;
|
||||
|
||||
ret = gen_new_estimator(&est->bstats, NULL, &est->rate_est,
|
||||
&est->lock, NULL, &cfg.opt);
|
||||
if (ret < 0)
|
||||
goto err2;
|
||||
|
||||
info->est = est;
|
||||
xt_rateest_hash_insert(xn, est);
|
||||
mutex_unlock(&xn->hash_lock);
|
||||
return 0;
|
||||
|
||||
err2:
|
||||
kfree(est);
|
||||
err1:
|
||||
mutex_unlock(&xn->hash_lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void xt_rateest_tg_destroy(const struct xt_tgdtor_param *par)
|
||||
{
|
||||
struct xt_rateest_target_info *info = par->targinfo;
|
||||
|
||||
xt_rateest_put(par->net, info->est);
|
||||
}
|
||||
|
||||
static struct xt_target xt_rateest_tg_reg __read_mostly = {
|
||||
.name = "RATEEST",
|
||||
.revision = 0,
|
||||
.family = NFPROTO_UNSPEC,
|
||||
.target = xt_rateest_tg,
|
||||
.checkentry = xt_rateest_tg_checkentry,
|
||||
.destroy = xt_rateest_tg_destroy,
|
||||
.targetsize = sizeof(struct xt_rateest_target_info),
|
||||
.usersize = offsetof(struct xt_rateest_target_info, est),
|
||||
.me = THIS_MODULE,
|
||||
};
|
||||
|
||||
static __net_init int xt_rateest_net_init(struct net *net)
|
||||
{
|
||||
struct xt_rateest_net *xn = net_generic(net, xt_rateest_id);
|
||||
int i;
|
||||
|
||||
mutex_init(&xn->hash_lock);
|
||||
for (i = 0; i < ARRAY_SIZE(xn->hash); i++)
|
||||
INIT_HLIST_HEAD(&xn->hash[i]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct pernet_operations xt_rateest_net_ops = {
|
||||
.init = xt_rateest_net_init,
|
||||
.id = &xt_rateest_id,
|
||||
.size = sizeof(struct xt_rateest_net),
|
||||
};
|
||||
|
||||
static int __init xt_rateest_tg_init(void)
|
||||
{
|
||||
int err = register_pernet_subsys(&xt_rateest_net_ops);
|
||||
|
||||
if (err)
|
||||
return err;
|
||||
return xt_register_target(&xt_rateest_tg_reg);
|
||||
}
|
||||
|
||||
static void __exit xt_rateest_tg_fini(void)
|
||||
{
|
||||
xt_unregister_target(&xt_rateest_tg_reg);
|
||||
unregister_pernet_subsys(&xt_rateest_net_ops);
|
||||
}
|
||||
|
||||
|
||||
MODULE_AUTHOR("Patrick McHardy <kaber@trash.net>");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_DESCRIPTION("Xtables: packet rate estimator");
|
||||
MODULE_ALIAS("ipt_RATEEST");
|
||||
MODULE_ALIAS("ip6t_RATEEST");
|
||||
module_init(xt_rateest_tg_init);
|
||||
module_exit(xt_rateest_tg_fini);
|
||||
@@ -1,345 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* This is a module which is used for setting the MSS option in TCP packets.
|
||||
*
|
||||
* Copyright (C) 2000 Marc Boucher <marc@mbsi.ca>
|
||||
* Copyright (C) 2007 Patrick McHardy <kaber@trash.net>
|
||||
*/
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
#include <linux/module.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/ip.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/ipv6.h>
|
||||
#include <linux/tcp.h>
|
||||
#include <net/dst.h>
|
||||
#include <net/flow.h>
|
||||
#include <net/ipv6.h>
|
||||
#include <net/route.h>
|
||||
#include <net/tcp.h>
|
||||
|
||||
#include <linux/netfilter_ipv4/ip_tables.h>
|
||||
#include <linux/netfilter_ipv6/ip6_tables.h>
|
||||
#include <linux/netfilter/x_tables.h>
|
||||
#include <linux/netfilter/xt_tcpudp.h>
|
||||
#include <linux/netfilter/xt_TCPMSS.h>
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Marc Boucher <marc@mbsi.ca>");
|
||||
MODULE_DESCRIPTION("Xtables: TCP Maximum Segment Size (MSS) adjustment");
|
||||
MODULE_ALIAS("ipt_TCPMSS");
|
||||
MODULE_ALIAS("ip6t_TCPMSS");
|
||||
|
||||
static inline unsigned int
|
||||
optlen(const u_int8_t *opt, unsigned int offset)
|
||||
{
|
||||
/* Beware zero-length options: make finite progress */
|
||||
if (opt[offset] <= TCPOPT_NOP || opt[offset+1] == 0)
|
||||
return 1;
|
||||
else
|
||||
return opt[offset+1];
|
||||
}
|
||||
|
||||
static u_int32_t tcpmss_reverse_mtu(struct net *net,
|
||||
const struct sk_buff *skb,
|
||||
unsigned int family)
|
||||
{
|
||||
struct flowi fl;
|
||||
struct rtable *rt = NULL;
|
||||
u_int32_t mtu = ~0U;
|
||||
|
||||
if (family == PF_INET) {
|
||||
struct flowi4 *fl4 = &fl.u.ip4;
|
||||
memset(fl4, 0, sizeof(*fl4));
|
||||
fl4->daddr = ip_hdr(skb)->saddr;
|
||||
} else {
|
||||
struct flowi6 *fl6 = &fl.u.ip6;
|
||||
|
||||
memset(fl6, 0, sizeof(*fl6));
|
||||
fl6->daddr = ipv6_hdr(skb)->saddr;
|
||||
}
|
||||
|
||||
nf_route(net, (struct dst_entry **)&rt, &fl, false, family);
|
||||
if (rt != NULL) {
|
||||
mtu = dst_mtu(&rt->dst);
|
||||
dst_release(&rt->dst);
|
||||
}
|
||||
return mtu;
|
||||
}
|
||||
|
||||
static int
|
||||
tcpmss_mangle_packet(struct sk_buff *skb,
|
||||
const struct xt_action_param *par,
|
||||
unsigned int family,
|
||||
unsigned int tcphoff,
|
||||
unsigned int minlen)
|
||||
{
|
||||
const struct xt_tcpmss_info *info = par->targinfo;
|
||||
struct tcphdr *tcph;
|
||||
int len, tcp_hdrlen;
|
||||
unsigned int i;
|
||||
__be16 oldval;
|
||||
u16 newmss;
|
||||
u8 *opt;
|
||||
|
||||
/* This is a fragment, no TCP header is available */
|
||||
if (par->fragoff != 0)
|
||||
return 0;
|
||||
|
||||
if (skb_ensure_writable(skb, skb->len))
|
||||
return -1;
|
||||
|
||||
len = skb->len - tcphoff;
|
||||
if (len < (int)sizeof(struct tcphdr))
|
||||
return -1;
|
||||
|
||||
tcph = (struct tcphdr *)(skb_network_header(skb) + tcphoff);
|
||||
tcp_hdrlen = tcph->doff * 4;
|
||||
|
||||
if (len < tcp_hdrlen || tcp_hdrlen < sizeof(struct tcphdr))
|
||||
return -1;
|
||||
|
||||
if (info->mss == XT_TCPMSS_CLAMP_PMTU) {
|
||||
struct net *net = xt_net(par);
|
||||
unsigned int in_mtu = tcpmss_reverse_mtu(net, skb, family);
|
||||
unsigned int min_mtu = min(dst_mtu(skb_dst(skb)), in_mtu);
|
||||
|
||||
if (min_mtu <= minlen) {
|
||||
net_err_ratelimited("unknown or invalid path-MTU (%u)\n",
|
||||
min_mtu);
|
||||
return -1;
|
||||
}
|
||||
newmss = min_mtu - minlen;
|
||||
} else
|
||||
newmss = info->mss;
|
||||
|
||||
opt = (u_int8_t *)tcph;
|
||||
for (i = sizeof(struct tcphdr); i <= tcp_hdrlen - TCPOLEN_MSS; i += optlen(opt, i)) {
|
||||
if (opt[i] == TCPOPT_MSS && opt[i+1] == TCPOLEN_MSS) {
|
||||
u_int16_t oldmss;
|
||||
|
||||
oldmss = (opt[i+2] << 8) | opt[i+3];
|
||||
|
||||
/* Never increase MSS, even when setting it, as
|
||||
* doing so results in problems for hosts that rely
|
||||
* on MSS being set correctly.
|
||||
*/
|
||||
if (oldmss <= newmss)
|
||||
return 0;
|
||||
|
||||
opt[i+2] = (newmss & 0xff00) >> 8;
|
||||
opt[i+3] = newmss & 0x00ff;
|
||||
|
||||
inet_proto_csum_replace2(&tcph->check, skb,
|
||||
htons(oldmss), htons(newmss),
|
||||
false);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* There is data after the header so the option can't be added
|
||||
* without moving it, and doing so may make the SYN packet
|
||||
* itself too large. Accept the packet unmodified instead.
|
||||
*/
|
||||
if (len > tcp_hdrlen)
|
||||
return 0;
|
||||
|
||||
/* tcph->doff has 4 bits, do not wrap it to 0 */
|
||||
if (tcp_hdrlen >= 15 * 4)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* MSS Option not found ?! add it..
|
||||
*/
|
||||
if (skb_tailroom(skb) < TCPOLEN_MSS) {
|
||||
if (pskb_expand_head(skb, 0,
|
||||
TCPOLEN_MSS - skb_tailroom(skb),
|
||||
GFP_ATOMIC))
|
||||
return -1;
|
||||
tcph = (struct tcphdr *)(skb_network_header(skb) + tcphoff);
|
||||
}
|
||||
|
||||
skb_put(skb, TCPOLEN_MSS);
|
||||
|
||||
/*
|
||||
* IPv4: RFC 1122 states "If an MSS option is not received at
|
||||
* connection setup, TCP MUST assume a default send MSS of 536".
|
||||
* IPv6: RFC 2460 states IPv6 has a minimum MTU of 1280 and a minimum
|
||||
* length IPv6 header of 60, ergo the default MSS value is 1220
|
||||
* Since no MSS was provided, we must use the default values
|
||||
*/
|
||||
if (xt_family(par) == NFPROTO_IPV4)
|
||||
newmss = min(newmss, (u16)536);
|
||||
else
|
||||
newmss = min(newmss, (u16)1220);
|
||||
|
||||
opt = (u_int8_t *)tcph + sizeof(struct tcphdr);
|
||||
memmove(opt + TCPOLEN_MSS, opt, len - sizeof(struct tcphdr));
|
||||
|
||||
inet_proto_csum_replace2(&tcph->check, skb,
|
||||
htons(len), htons(len + TCPOLEN_MSS), true);
|
||||
opt[0] = TCPOPT_MSS;
|
||||
opt[1] = TCPOLEN_MSS;
|
||||
opt[2] = (newmss & 0xff00) >> 8;
|
||||
opt[3] = newmss & 0x00ff;
|
||||
|
||||
inet_proto_csum_replace4(&tcph->check, skb, 0, *((__be32 *)opt), false);
|
||||
|
||||
oldval = ((__be16 *)tcph)[6];
|
||||
tcph->doff += TCPOLEN_MSS/4;
|
||||
inet_proto_csum_replace2(&tcph->check, skb,
|
||||
oldval, ((__be16 *)tcph)[6], false);
|
||||
return TCPOLEN_MSS;
|
||||
}
|
||||
|
||||
static unsigned int
|
||||
tcpmss_tg4(struct sk_buff *skb, const struct xt_action_param *par)
|
||||
{
|
||||
struct iphdr *iph = ip_hdr(skb);
|
||||
__be16 newlen;
|
||||
int ret;
|
||||
|
||||
ret = tcpmss_mangle_packet(skb, par,
|
||||
PF_INET,
|
||||
iph->ihl * 4,
|
||||
sizeof(*iph) + sizeof(struct tcphdr));
|
||||
if (ret < 0)
|
||||
return NF_DROP;
|
||||
if (ret > 0) {
|
||||
iph = ip_hdr(skb);
|
||||
newlen = htons(ntohs(iph->tot_len) + ret);
|
||||
csum_replace2(&iph->check, iph->tot_len, newlen);
|
||||
iph->tot_len = newlen;
|
||||
}
|
||||
return XT_CONTINUE;
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_IP6_NF_IPTABLES)
|
||||
static unsigned int
|
||||
tcpmss_tg6(struct sk_buff *skb, const struct xt_action_param *par)
|
||||
{
|
||||
struct ipv6hdr *ipv6h = ipv6_hdr(skb);
|
||||
u8 nexthdr;
|
||||
__be16 frag_off, oldlen, newlen;
|
||||
int tcphoff;
|
||||
int ret;
|
||||
|
||||
nexthdr = ipv6h->nexthdr;
|
||||
tcphoff = ipv6_skip_exthdr(skb, sizeof(*ipv6h), &nexthdr, &frag_off);
|
||||
if (tcphoff < 0)
|
||||
return NF_DROP;
|
||||
ret = tcpmss_mangle_packet(skb, par,
|
||||
PF_INET6,
|
||||
tcphoff,
|
||||
sizeof(*ipv6h) + sizeof(struct tcphdr));
|
||||
if (ret < 0)
|
||||
return NF_DROP;
|
||||
if (ret > 0) {
|
||||
ipv6h = ipv6_hdr(skb);
|
||||
oldlen = ipv6h->payload_len;
|
||||
newlen = htons(ntohs(oldlen) + ret);
|
||||
if (skb->ip_summed == CHECKSUM_COMPLETE)
|
||||
skb->csum = csum_add(csum_sub(skb->csum, oldlen),
|
||||
newlen);
|
||||
ipv6h->payload_len = newlen;
|
||||
}
|
||||
return XT_CONTINUE;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Must specify -p tcp --syn */
|
||||
static inline bool find_syn_match(const struct xt_entry_match *m)
|
||||
{
|
||||
const struct xt_tcp *tcpinfo = (const struct xt_tcp *)m->data;
|
||||
|
||||
if (strcmp(m->u.kernel.match->name, "tcp") == 0 &&
|
||||
tcpinfo->flg_cmp & TCPHDR_SYN &&
|
||||
!(tcpinfo->invflags & XT_TCP_INV_FLAGS))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static int tcpmss_tg4_check(const struct xt_tgchk_param *par)
|
||||
{
|
||||
const struct xt_tcpmss_info *info = par->targinfo;
|
||||
const struct ipt_entry *e = par->entryinfo;
|
||||
const struct xt_entry_match *ematch;
|
||||
|
||||
if (info->mss == XT_TCPMSS_CLAMP_PMTU &&
|
||||
(par->hook_mask & ~((1 << NF_INET_FORWARD) |
|
||||
(1 << NF_INET_LOCAL_OUT) |
|
||||
(1 << NF_INET_POST_ROUTING))) != 0) {
|
||||
pr_info_ratelimited("path-MTU clamping only supported in FORWARD, OUTPUT and POSTROUTING hooks\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (par->nft_compat)
|
||||
return 0;
|
||||
|
||||
xt_ematch_foreach(ematch, e)
|
||||
if (find_syn_match(ematch))
|
||||
return 0;
|
||||
pr_info_ratelimited("Only works on TCP SYN packets\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_IP6_NF_IPTABLES)
|
||||
static int tcpmss_tg6_check(const struct xt_tgchk_param *par)
|
||||
{
|
||||
const struct xt_tcpmss_info *info = par->targinfo;
|
||||
const struct ip6t_entry *e = par->entryinfo;
|
||||
const struct xt_entry_match *ematch;
|
||||
|
||||
if (info->mss == XT_TCPMSS_CLAMP_PMTU &&
|
||||
(par->hook_mask & ~((1 << NF_INET_FORWARD) |
|
||||
(1 << NF_INET_LOCAL_OUT) |
|
||||
(1 << NF_INET_POST_ROUTING))) != 0) {
|
||||
pr_info_ratelimited("path-MTU clamping only supported in FORWARD, OUTPUT and POSTROUTING hooks\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (par->nft_compat)
|
||||
return 0;
|
||||
|
||||
xt_ematch_foreach(ematch, e)
|
||||
if (find_syn_match(ematch))
|
||||
return 0;
|
||||
pr_info_ratelimited("Only works on TCP SYN packets\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
#endif
|
||||
|
||||
static struct xt_target tcpmss_tg_reg[] __read_mostly = {
|
||||
{
|
||||
.family = NFPROTO_IPV4,
|
||||
.name = "TCPMSS",
|
||||
.checkentry = tcpmss_tg4_check,
|
||||
.target = tcpmss_tg4,
|
||||
.targetsize = sizeof(struct xt_tcpmss_info),
|
||||
.proto = IPPROTO_TCP,
|
||||
.me = THIS_MODULE,
|
||||
},
|
||||
#if IS_ENABLED(CONFIG_IP6_NF_IPTABLES)
|
||||
{
|
||||
.family = NFPROTO_IPV6,
|
||||
.name = "TCPMSS",
|
||||
.checkentry = tcpmss_tg6_check,
|
||||
.target = tcpmss_tg6,
|
||||
.targetsize = sizeof(struct xt_tcpmss_info),
|
||||
.proto = IPPROTO_TCP,
|
||||
.me = THIS_MODULE,
|
||||
},
|
||||
#endif
|
||||
};
|
||||
|
||||
static int __init tcpmss_tg_init(void)
|
||||
{
|
||||
return xt_register_targets(tcpmss_tg_reg, ARRAY_SIZE(tcpmss_tg_reg));
|
||||
}
|
||||
|
||||
static void __exit tcpmss_tg_exit(void)
|
||||
{
|
||||
xt_unregister_targets(tcpmss_tg_reg, ARRAY_SIZE(tcpmss_tg_reg));
|
||||
}
|
||||
|
||||
module_init(tcpmss_tg_init);
|
||||
module_exit(tcpmss_tg_exit);
|
||||
@@ -685,11 +685,11 @@ static int es8323_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
|
||||
u8 iface = 0;
|
||||
u8 adciface = 0;
|
||||
u8 daciface = 0;
|
||||
|
||||
printk(KERN_EMERG "yd %s %d\n", __func__, __LINE__);
|
||||
iface = snd_soc_component_read(component, ES8323_IFACE);
|
||||
adciface = snd_soc_component_read(component, ES8323_ADC_IFACE);
|
||||
daciface = snd_soc_component_read(component, ES8323_DAC_IFACE);
|
||||
|
||||
printk(KERN_EMERG "yd %s %d\n", __func__, __LINE__);
|
||||
/* set master/slave audio interface */
|
||||
switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
|
||||
case SND_SOC_DAIFMT_CBM_CFM: /* MASTER MODE */
|
||||
@@ -749,7 +749,7 @@ static int es8323_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
|
||||
snd_soc_component_write(component, ES8323_IFACE, iface);
|
||||
snd_soc_component_write(component, ES8323_ADC_IFACE, adciface);
|
||||
snd_soc_component_write(component, ES8323_DAC_IFACE, daciface);
|
||||
|
||||
printk(KERN_EMERG "yd %s %d\n", __func__, __LINE__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -824,9 +824,11 @@ static int es8323_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||
{
|
||||
struct snd_soc_component *component = dai->component;
|
||||
struct es8323_priv *es8323 = snd_soc_component_get_drvdata(component);
|
||||
|
||||
u16 srate = snd_soc_component_read(component, ES8323_IFACE) & 0x80;
|
||||
u16 adciface = snd_soc_component_read(component, ES8323_ADC_IFACE) & 0xE3;
|
||||
u16 daciface = snd_soc_component_read(component, ES8323_DAC_IFACE) & 0xC7;
|
||||
|
||||
int coeff;
|
||||
int i;
|
||||
|
||||
@@ -1035,6 +1037,7 @@ static int es8323_probe(struct snd_soc_component *component)
|
||||
es8323->component = component;
|
||||
|
||||
ret = es8323_reset(component);
|
||||
|
||||
if (ret < 0) {
|
||||
dev_err(component->dev, "Failed to issue reset\n");
|
||||
// clk_disable_unprepare(es8323->mclk);
|
||||
@@ -1081,7 +1084,6 @@ static int es8323_probe(struct snd_soc_component *component)
|
||||
snd_soc_component_write(component, 0x14, 0x05);
|
||||
snd_soc_component_write(component, 0x15, 0x06);
|
||||
snd_soc_component_write(component, 0x16, 0x53);
|
||||
|
||||
snd_soc_component_write(component, 0x17, 0x18);
|
||||
snd_soc_component_write(component, 0x18, 0x02);
|
||||
snd_soc_component_write(component, 0x1A, 0x00);
|
||||
@@ -1098,7 +1100,6 @@ static int es8323_probe(struct snd_soc_component *component)
|
||||
snd_soc_component_write(component, 0x02, 0x00);
|
||||
usleep_range(18000, 20000);
|
||||
snd_soc_component_write(component, 0x04, 0x3C);
|
||||
|
||||
es8323_set_bias_level(component, SND_SOC_BIAS_STANDBY);
|
||||
g_es8323 = es8323;
|
||||
DBG("%s : successfully !\n",__func__);
|
||||
@@ -1133,7 +1134,7 @@ static const struct snd_soc_component_driver soc_codec_dev_es8323 = {
|
||||
static const struct regmap_config es8323_regmap_config = {
|
||||
.reg_bits = 8,
|
||||
.val_bits = 8,
|
||||
.max_register = ES8323_DACCONTROL30,
|
||||
.max_register = ES8323_DACCONTROL31,
|
||||
.cache_type = REGCACHE_RBTREE,
|
||||
.reg_defaults = es8323_reg_defaults,
|
||||
.num_reg_defaults = ARRAY_SIZE(es8323_reg_defaults),
|
||||
|
||||
@@ -66,6 +66,7 @@
|
||||
#define ES8323_DACCONTROL28 0x32
|
||||
#define ES8323_DACCONTROL29 0x33
|
||||
#define ES8323_DACCONTROL30 0x34
|
||||
#define ES8323_DACCONTROL31 0x35
|
||||
|
||||
#define ES8323_LADC_VOL ES8323_ADCCONTROL8
|
||||
#define ES8323_RADC_VOL ES8323_ADCCONTROL9
|
||||
|
||||
@@ -1,42 +0,0 @@
|
||||
C Z6.0+pooncelock+poonceLock+pombonce
|
||||
|
||||
(*
|
||||
* Result: Never
|
||||
*
|
||||
* This litmus test demonstrates how smp_mb__after_spinlock() may be
|
||||
* used to ensure that accesses in different critical sections for a
|
||||
* given lock running on different CPUs are nevertheless seen in order
|
||||
* by CPUs not holding that lock.
|
||||
*)
|
||||
|
||||
{}
|
||||
|
||||
P0(int *x, int *y, spinlock_t *mylock)
|
||||
{
|
||||
spin_lock(mylock);
|
||||
WRITE_ONCE(*x, 1);
|
||||
WRITE_ONCE(*y, 1);
|
||||
spin_unlock(mylock);
|
||||
}
|
||||
|
||||
P1(int *y, int *z, spinlock_t *mylock)
|
||||
{
|
||||
int r0;
|
||||
|
||||
spin_lock(mylock);
|
||||
smp_mb__after_spinlock();
|
||||
r0 = READ_ONCE(*y);
|
||||
WRITE_ONCE(*z, 1);
|
||||
spin_unlock(mylock);
|
||||
}
|
||||
|
||||
P2(int *x, int *z)
|
||||
{
|
||||
int r1;
|
||||
|
||||
WRITE_ONCE(*z, 2);
|
||||
smp_mb();
|
||||
r1 = READ_ONCE(*x);
|
||||
}
|
||||
|
||||
exists (1:r0=1 /\ z=2 /\ 2:r1=0)
|
||||
Reference in New Issue
Block a user