diff options
Diffstat (limited to 'include')
130 files changed, 4241 insertions, 954 deletions
diff --git a/include/asm-generic/checksum.h b/include/asm-generic/checksum.h index 59811df58c5b..3150cbd8eb21 100644 --- a/include/asm-generic/checksum.h +++ b/include/asm-generic/checksum.h | |||
| @@ -65,14 +65,14 @@ static inline __sum16 csum_fold(__wsum csum) | |||
| 65 | * returns a 16-bit checksum, already complemented | 65 | * returns a 16-bit checksum, already complemented |
| 66 | */ | 66 | */ |
| 67 | extern __wsum | 67 | extern __wsum |
| 68 | csum_tcpudp_nofold(__be32 saddr, __be32 daddr, unsigned short len, | 68 | csum_tcpudp_nofold(__be32 saddr, __be32 daddr, __u32 len, |
| 69 | unsigned short proto, __wsum sum); | 69 | __u8 proto, __wsum sum); |
| 70 | #endif | 70 | #endif |
| 71 | 71 | ||
| 72 | #ifndef csum_tcpudp_magic | 72 | #ifndef csum_tcpudp_magic |
| 73 | static inline __sum16 | 73 | static inline __sum16 |
| 74 | csum_tcpudp_magic(__be32 saddr, __be32 daddr, unsigned short len, | 74 | csum_tcpudp_magic(__be32 saddr, __be32 daddr, __u32 len, |
| 75 | unsigned short proto, __wsum sum) | 75 | __u8 proto, __wsum sum) |
| 76 | { | 76 | { |
| 77 | return csum_fold(csum_tcpudp_nofold(saddr, daddr, len, proto, sum)); | 77 | return csum_fold(csum_tcpudp_nofold(saddr, daddr, len, proto, sum)); |
| 78 | } | 78 | } |
diff --git a/include/dt-bindings/clock/rk3036-cru.h b/include/dt-bindings/clock/rk3036-cru.h index ebc7a7b43f52..de44109a3a04 100644 --- a/include/dt-bindings/clock/rk3036-cru.h +++ b/include/dt-bindings/clock/rk3036-cru.h | |||
| @@ -54,6 +54,7 @@ | |||
| 54 | #define SCLK_PVTM_VIDEO 125 | 54 | #define SCLK_PVTM_VIDEO 125 |
| 55 | #define SCLK_MAC 151 | 55 | #define SCLK_MAC 151 |
| 56 | #define SCLK_MACREF 152 | 56 | #define SCLK_MACREF 152 |
| 57 | #define SCLK_MACPLL 153 | ||
| 57 | #define SCLK_SFC 160 | 58 | #define SCLK_SFC 160 |
| 58 | 59 | ||
| 59 | /* aclk gates */ | 60 | /* aclk gates */ |
| @@ -92,6 +93,7 @@ | |||
| 92 | #define HCLK_SDMMC 456 | 93 | #define HCLK_SDMMC 456 |
| 93 | #define HCLK_SDIO 457 | 94 | #define HCLK_SDIO 457 |
| 94 | #define HCLK_EMMC 459 | 95 | #define HCLK_EMMC 459 |
| 96 | #define HCLK_MAC 460 | ||
| 95 | #define HCLK_I2S 462 | 97 | #define HCLK_I2S 462 |
| 96 | #define HCLK_LCDC 465 | 98 | #define HCLK_LCDC 465 |
| 97 | #define HCLK_ROM 467 | 99 | #define HCLK_ROM 467 |
diff --git a/include/linux/bcma/bcma.h b/include/linux/bcma/bcma.h index 3feb1b2d75d8..0367c63f5960 100644 --- a/include/linux/bcma/bcma.h +++ b/include/linux/bcma/bcma.h | |||
| @@ -151,6 +151,8 @@ struct bcma_host_ops { | |||
| 151 | #define BCMA_CORE_PCIE2 0x83C /* PCI Express Gen2 */ | 151 | #define BCMA_CORE_PCIE2 0x83C /* PCI Express Gen2 */ |
| 152 | #define BCMA_CORE_USB30_DEV 0x83D | 152 | #define BCMA_CORE_USB30_DEV 0x83D |
| 153 | #define BCMA_CORE_ARM_CR4 0x83E | 153 | #define BCMA_CORE_ARM_CR4 0x83E |
| 154 | #define BCMA_CORE_GCI 0x840 | ||
| 155 | #define BCMA_CORE_CMEM 0x846 /* CNDS DDR2/3 memory controller */ | ||
| 154 | #define BCMA_CORE_ARM_CA7 0x847 | 156 | #define BCMA_CORE_ARM_CA7 0x847 |
| 155 | #define BCMA_CORE_SYS_MEM 0x849 | 157 | #define BCMA_CORE_SYS_MEM 0x849 |
| 156 | #define BCMA_CORE_DEFAULT 0xFFF | 158 | #define BCMA_CORE_DEFAULT 0xFFF |
| @@ -199,6 +201,7 @@ struct bcma_host_ops { | |||
| 199 | #define BCMA_PKG_ID_BCM4707 1 | 201 | #define BCMA_PKG_ID_BCM4707 1 |
| 200 | #define BCMA_PKG_ID_BCM4708 2 | 202 | #define BCMA_PKG_ID_BCM4708 2 |
| 201 | #define BCMA_PKG_ID_BCM4709 0 | 203 | #define BCMA_PKG_ID_BCM4709 0 |
| 204 | #define BCMA_CHIP_ID_BCM47094 53030 | ||
| 202 | #define BCMA_CHIP_ID_BCM53018 53018 | 205 | #define BCMA_CHIP_ID_BCM53018 53018 |
| 203 | 206 | ||
| 204 | /* Board types (on PCI usually equals to the subsystem dev id) */ | 207 | /* Board types (on PCI usually equals to the subsystem dev id) */ |
diff --git a/include/linux/bcma/bcma_driver_chipcommon.h b/include/linux/bcma/bcma_driver_chipcommon.h index db51a6ffb7d6..846513c73606 100644 --- a/include/linux/bcma/bcma_driver_chipcommon.h +++ b/include/linux/bcma/bcma_driver_chipcommon.h | |||
| @@ -217,6 +217,11 @@ | |||
| 217 | #define BCMA_CC_CLKDIV_JTAG_SHIFT 8 | 217 | #define BCMA_CC_CLKDIV_JTAG_SHIFT 8 |
| 218 | #define BCMA_CC_CLKDIV_UART 0x000000FF | 218 | #define BCMA_CC_CLKDIV_UART 0x000000FF |
| 219 | #define BCMA_CC_CAP_EXT 0x00AC /* Capabilities */ | 219 | #define BCMA_CC_CAP_EXT 0x00AC /* Capabilities */ |
| 220 | #define BCMA_CC_CAP_EXT_SECI_PRESENT 0x00000001 | ||
| 221 | #define BCMA_CC_CAP_EXT_GSIO_PRESENT 0x00000002 | ||
| 222 | #define BCMA_CC_CAP_EXT_GCI_PRESENT 0x00000004 | ||
| 223 | #define BCMA_CC_CAP_EXT_SECI_PUART_PRESENT 0x00000008 /* UART present */ | ||
| 224 | #define BCMA_CC_CAP_EXT_AOB_PRESENT 0x00000040 | ||
| 220 | #define BCMA_CC_PLLONDELAY 0x00B0 /* Rev >= 4 only */ | 225 | #define BCMA_CC_PLLONDELAY 0x00B0 /* Rev >= 4 only */ |
| 221 | #define BCMA_CC_FREFSELDELAY 0x00B4 /* Rev >= 4 only */ | 226 | #define BCMA_CC_FREFSELDELAY 0x00B4 /* Rev >= 4 only */ |
| 222 | #define BCMA_CC_SLOWCLKCTL 0x00B8 /* 6 <= Rev <= 9 only */ | 227 | #define BCMA_CC_SLOWCLKCTL 0x00B8 /* 6 <= Rev <= 9 only */ |
| @@ -351,12 +356,12 @@ | |||
| 351 | #define BCMA_CC_PMU_RES_REQTS 0x0640 /* PMU res req timer sel */ | 356 | #define BCMA_CC_PMU_RES_REQTS 0x0640 /* PMU res req timer sel */ |
| 352 | #define BCMA_CC_PMU_RES_REQT 0x0644 /* PMU res req timer */ | 357 | #define BCMA_CC_PMU_RES_REQT 0x0644 /* PMU res req timer */ |
| 353 | #define BCMA_CC_PMU_RES_REQM 0x0648 /* PMU res req mask */ | 358 | #define BCMA_CC_PMU_RES_REQM 0x0648 /* PMU res req mask */ |
| 354 | #define BCMA_CC_CHIPCTL_ADDR 0x0650 | 359 | #define BCMA_CC_PMU_CHIPCTL_ADDR 0x0650 |
| 355 | #define BCMA_CC_CHIPCTL_DATA 0x0654 | 360 | #define BCMA_CC_PMU_CHIPCTL_DATA 0x0654 |
| 356 | #define BCMA_CC_REGCTL_ADDR 0x0658 | 361 | #define BCMA_CC_PMU_REGCTL_ADDR 0x0658 |
| 357 | #define BCMA_CC_REGCTL_DATA 0x065C | 362 | #define BCMA_CC_PMU_REGCTL_DATA 0x065C |
| 358 | #define BCMA_CC_PLLCTL_ADDR 0x0660 | 363 | #define BCMA_CC_PMU_PLLCTL_ADDR 0x0660 |
| 359 | #define BCMA_CC_PLLCTL_DATA 0x0664 | 364 | #define BCMA_CC_PMU_PLLCTL_DATA 0x0664 |
| 360 | #define BCMA_CC_PMU_STRAPOPT 0x0668 /* (corerev >= 28) */ | 365 | #define BCMA_CC_PMU_STRAPOPT 0x0668 /* (corerev >= 28) */ |
| 361 | #define BCMA_CC_PMU_XTAL_FREQ 0x066C /* (pmurev >= 10) */ | 366 | #define BCMA_CC_PMU_XTAL_FREQ 0x066C /* (pmurev >= 10) */ |
| 362 | #define BCMA_CC_PMU_XTAL_FREQ_ILPCTL_MASK 0x00001FFF | 367 | #define BCMA_CC_PMU_XTAL_FREQ_ILPCTL_MASK 0x00001FFF |
| @@ -566,17 +571,16 @@ | |||
| 566 | * Check availability with ((struct bcma_chipcommon)->capabilities & BCMA_CC_CAP_PMU) | 571 | * Check availability with ((struct bcma_chipcommon)->capabilities & BCMA_CC_CAP_PMU) |
| 567 | */ | 572 | */ |
| 568 | struct bcma_chipcommon_pmu { | 573 | struct bcma_chipcommon_pmu { |
| 574 | struct bcma_device *core; /* Can be separated core or just ChipCommon one */ | ||
| 569 | u8 rev; /* PMU revision */ | 575 | u8 rev; /* PMU revision */ |
| 570 | u32 crystalfreq; /* The active crystal frequency (in kHz) */ | 576 | u32 crystalfreq; /* The active crystal frequency (in kHz) */ |
| 571 | }; | 577 | }; |
| 572 | 578 | ||
| 573 | #ifdef CONFIG_BCMA_DRIVER_MIPS | 579 | #ifdef CONFIG_BCMA_PFLASH |
| 574 | struct bcma_pflash { | 580 | struct bcma_pflash { |
| 575 | bool present; | 581 | bool present; |
| 576 | u8 buswidth; | ||
| 577 | u32 window; | ||
| 578 | u32 window_size; | ||
| 579 | }; | 582 | }; |
| 583 | #endif | ||
| 580 | 584 | ||
| 581 | #ifdef CONFIG_BCMA_SFLASH | 585 | #ifdef CONFIG_BCMA_SFLASH |
| 582 | struct mtd_info; | 586 | struct mtd_info; |
| @@ -600,6 +604,7 @@ struct bcma_nflash { | |||
| 600 | }; | 604 | }; |
| 601 | #endif | 605 | #endif |
| 602 | 606 | ||
| 607 | #ifdef CONFIG_BCMA_DRIVER_MIPS | ||
| 603 | struct bcma_serial_port { | 608 | struct bcma_serial_port { |
| 604 | void *regs; | 609 | void *regs; |
| 605 | unsigned long clockspeed; | 610 | unsigned long clockspeed; |
| @@ -619,8 +624,9 @@ struct bcma_drv_cc { | |||
| 619 | /* Fast Powerup Delay constant */ | 624 | /* Fast Powerup Delay constant */ |
| 620 | u16 fast_pwrup_delay; | 625 | u16 fast_pwrup_delay; |
| 621 | struct bcma_chipcommon_pmu pmu; | 626 | struct bcma_chipcommon_pmu pmu; |
| 622 | #ifdef CONFIG_BCMA_DRIVER_MIPS | 627 | #ifdef CONFIG_BCMA_PFLASH |
| 623 | struct bcma_pflash pflash; | 628 | struct bcma_pflash pflash; |
| 629 | #endif | ||
| 624 | #ifdef CONFIG_BCMA_SFLASH | 630 | #ifdef CONFIG_BCMA_SFLASH |
| 625 | struct bcma_sflash sflash; | 631 | struct bcma_sflash sflash; |
| 626 | #endif | 632 | #endif |
| @@ -628,6 +634,7 @@ struct bcma_drv_cc { | |||
| 628 | struct bcma_nflash nflash; | 634 | struct bcma_nflash nflash; |
| 629 | #endif | 635 | #endif |
| 630 | 636 | ||
| 637 | #ifdef CONFIG_BCMA_DRIVER_MIPS | ||
| 631 | int nr_serial_ports; | 638 | int nr_serial_ports; |
| 632 | struct bcma_serial_port serial_ports[4]; | 639 | struct bcma_serial_port serial_ports[4]; |
| 633 | #endif /* CONFIG_BCMA_DRIVER_MIPS */ | 640 | #endif /* CONFIG_BCMA_DRIVER_MIPS */ |
| @@ -660,6 +667,19 @@ struct bcma_drv_cc_b { | |||
| 660 | #define bcma_cc_maskset32(cc, offset, mask, set) \ | 667 | #define bcma_cc_maskset32(cc, offset, mask, set) \ |
| 661 | bcma_cc_write32(cc, offset, (bcma_cc_read32(cc, offset) & (mask)) | (set)) | 668 | bcma_cc_write32(cc, offset, (bcma_cc_read32(cc, offset) & (mask)) | (set)) |
| 662 | 669 | ||
| 670 | /* PMU registers access */ | ||
| 671 | #define bcma_pmu_read32(cc, offset) \ | ||
| 672 | bcma_read32((cc)->pmu.core, offset) | ||
| 673 | #define bcma_pmu_write32(cc, offset, val) \ | ||
| 674 | bcma_write32((cc)->pmu.core, offset, val) | ||
| 675 | |||
| 676 | #define bcma_pmu_mask32(cc, offset, mask) \ | ||
| 677 | bcma_pmu_write32(cc, offset, bcma_pmu_read32(cc, offset) & (mask)) | ||
| 678 | #define bcma_pmu_set32(cc, offset, set) \ | ||
| 679 | bcma_pmu_write32(cc, offset, bcma_pmu_read32(cc, offset) | (set)) | ||
| 680 | #define bcma_pmu_maskset32(cc, offset, mask, set) \ | ||
| 681 | bcma_pmu_write32(cc, offset, (bcma_pmu_read32(cc, offset) & (mask)) | (set)) | ||
| 682 | |||
| 663 | extern u32 bcma_chipco_watchdog_timer_set(struct bcma_drv_cc *cc, u32 ticks); | 683 | extern u32 bcma_chipco_watchdog_timer_set(struct bcma_drv_cc *cc, u32 ticks); |
| 664 | 684 | ||
| 665 | extern u32 bcma_chipco_get_alp_clock(struct bcma_drv_cc *cc); | 685 | extern u32 bcma_chipco_get_alp_clock(struct bcma_drv_cc *cc); |
diff --git a/include/linux/bitmap.h b/include/linux/bitmap.h index 9653fdb76a42..e9b0b9ab07e5 100644 --- a/include/linux/bitmap.h +++ b/include/linux/bitmap.h | |||
| @@ -59,6 +59,8 @@ | |||
| 59 | * bitmap_find_free_region(bitmap, bits, order) Find and allocate bit region | 59 | * bitmap_find_free_region(bitmap, bits, order) Find and allocate bit region |
| 60 | * bitmap_release_region(bitmap, pos, order) Free specified bit region | 60 | * bitmap_release_region(bitmap, pos, order) Free specified bit region |
| 61 | * bitmap_allocate_region(bitmap, pos, order) Allocate specified bit region | 61 | * bitmap_allocate_region(bitmap, pos, order) Allocate specified bit region |
| 62 | * bitmap_from_u32array(dst, nbits, buf, nwords) *dst = *buf (nwords 32b words) | ||
| 63 | * bitmap_to_u32array(buf, nwords, src, nbits) *buf = *dst (nwords 32b words) | ||
| 62 | */ | 64 | */ |
| 63 | 65 | ||
| 64 | /* | 66 | /* |
| @@ -163,6 +165,14 @@ extern void bitmap_fold(unsigned long *dst, const unsigned long *orig, | |||
| 163 | extern int bitmap_find_free_region(unsigned long *bitmap, unsigned int bits, int order); | 165 | extern int bitmap_find_free_region(unsigned long *bitmap, unsigned int bits, int order); |
| 164 | extern void bitmap_release_region(unsigned long *bitmap, unsigned int pos, int order); | 166 | extern void bitmap_release_region(unsigned long *bitmap, unsigned int pos, int order); |
| 165 | extern int bitmap_allocate_region(unsigned long *bitmap, unsigned int pos, int order); | 167 | extern int bitmap_allocate_region(unsigned long *bitmap, unsigned int pos, int order); |
| 168 | extern unsigned int bitmap_from_u32array(unsigned long *bitmap, | ||
| 169 | unsigned int nbits, | ||
| 170 | const u32 *buf, | ||
| 171 | unsigned int nwords); | ||
| 172 | extern unsigned int bitmap_to_u32array(u32 *buf, | ||
| 173 | unsigned int nwords, | ||
| 174 | const unsigned long *bitmap, | ||
| 175 | unsigned int nbits); | ||
| 166 | #ifdef __BIG_ENDIAN | 176 | #ifdef __BIG_ENDIAN |
| 167 | extern void bitmap_copy_le(unsigned long *dst, const unsigned long *src, unsigned int nbits); | 177 | extern void bitmap_copy_le(unsigned long *dst, const unsigned long *src, unsigned int nbits); |
| 168 | #else | 178 | #else |
diff --git a/include/linux/bpf.h b/include/linux/bpf.h index 83d1926c61e4..21ee41b92e8a 100644 --- a/include/linux/bpf.h +++ b/include/linux/bpf.h | |||
| @@ -10,6 +10,7 @@ | |||
| 10 | #include <uapi/linux/bpf.h> | 10 | #include <uapi/linux/bpf.h> |
| 11 | #include <linux/workqueue.h> | 11 | #include <linux/workqueue.h> |
| 12 | #include <linux/file.h> | 12 | #include <linux/file.h> |
| 13 | #include <linux/percpu.h> | ||
| 13 | 14 | ||
| 14 | struct bpf_map; | 15 | struct bpf_map; |
| 15 | 16 | ||
| @@ -36,6 +37,7 @@ struct bpf_map { | |||
| 36 | u32 key_size; | 37 | u32 key_size; |
| 37 | u32 value_size; | 38 | u32 value_size; |
| 38 | u32 max_entries; | 39 | u32 max_entries; |
| 40 | u32 map_flags; | ||
| 39 | u32 pages; | 41 | u32 pages; |
| 40 | struct user_struct *user; | 42 | struct user_struct *user; |
| 41 | const struct bpf_map_ops *ops; | 43 | const struct bpf_map_ops *ops; |
| @@ -65,6 +67,7 @@ enum bpf_arg_type { | |||
| 65 | */ | 67 | */ |
| 66 | ARG_PTR_TO_STACK, /* any pointer to eBPF program stack */ | 68 | ARG_PTR_TO_STACK, /* any pointer to eBPF program stack */ |
| 67 | ARG_CONST_STACK_SIZE, /* number of bytes accessed from stack */ | 69 | ARG_CONST_STACK_SIZE, /* number of bytes accessed from stack */ |
| 70 | ARG_CONST_STACK_SIZE_OR_ZERO, /* number of bytes accessed from stack or 0 */ | ||
| 68 | 71 | ||
| 69 | ARG_PTR_TO_CTX, /* pointer to context */ | 72 | ARG_PTR_TO_CTX, /* pointer to context */ |
| 70 | ARG_ANYTHING, /* any (initialized) argument is ok */ | 73 | ARG_ANYTHING, /* any (initialized) argument is ok */ |
| @@ -151,6 +154,7 @@ struct bpf_array { | |||
| 151 | union { | 154 | union { |
| 152 | char value[0] __aligned(8); | 155 | char value[0] __aligned(8); |
| 153 | void *ptrs[0] __aligned(8); | 156 | void *ptrs[0] __aligned(8); |
| 157 | void __percpu *pptrs[0] __aligned(8); | ||
| 154 | }; | 158 | }; |
| 155 | }; | 159 | }; |
| 156 | #define MAX_TAIL_CALL_CNT 32 | 160 | #define MAX_TAIL_CALL_CNT 32 |
| @@ -161,6 +165,8 @@ bool bpf_prog_array_compatible(struct bpf_array *array, const struct bpf_prog *f | |||
| 161 | const struct bpf_func_proto *bpf_get_trace_printk_proto(void); | 165 | const struct bpf_func_proto *bpf_get_trace_printk_proto(void); |
| 162 | 166 | ||
| 163 | #ifdef CONFIG_BPF_SYSCALL | 167 | #ifdef CONFIG_BPF_SYSCALL |
| 168 | DECLARE_PER_CPU(int, bpf_prog_active); | ||
| 169 | |||
| 164 | void bpf_register_prog_type(struct bpf_prog_type_list *tl); | 170 | void bpf_register_prog_type(struct bpf_prog_type_list *tl); |
| 165 | void bpf_register_map_type(struct bpf_map_type_list *tl); | 171 | void bpf_register_map_type(struct bpf_map_type_list *tl); |
| 166 | 172 | ||
| @@ -173,6 +179,7 @@ struct bpf_map *__bpf_map_get(struct fd f); | |||
| 173 | void bpf_map_inc(struct bpf_map *map, bool uref); | 179 | void bpf_map_inc(struct bpf_map *map, bool uref); |
| 174 | void bpf_map_put_with_uref(struct bpf_map *map); | 180 | void bpf_map_put_with_uref(struct bpf_map *map); |
| 175 | void bpf_map_put(struct bpf_map *map); | 181 | void bpf_map_put(struct bpf_map *map); |
| 182 | int bpf_map_precharge_memlock(u32 pages); | ||
| 176 | 183 | ||
| 177 | extern int sysctl_unprivileged_bpf_disabled; | 184 | extern int sysctl_unprivileged_bpf_disabled; |
| 178 | 185 | ||
| @@ -182,6 +189,30 @@ int bpf_prog_new_fd(struct bpf_prog *prog); | |||
| 182 | int bpf_obj_pin_user(u32 ufd, const char __user *pathname); | 189 | int bpf_obj_pin_user(u32 ufd, const char __user *pathname); |
| 183 | int bpf_obj_get_user(const char __user *pathname); | 190 | int bpf_obj_get_user(const char __user *pathname); |
| 184 | 191 | ||
| 192 | int bpf_percpu_hash_copy(struct bpf_map *map, void *key, void *value); | ||
| 193 | int bpf_percpu_array_copy(struct bpf_map *map, void *key, void *value); | ||
| 194 | int bpf_percpu_hash_update(struct bpf_map *map, void *key, void *value, | ||
| 195 | u64 flags); | ||
| 196 | int bpf_percpu_array_update(struct bpf_map *map, void *key, void *value, | ||
| 197 | u64 flags); | ||
| 198 | int bpf_stackmap_copy(struct bpf_map *map, void *key, void *value); | ||
| 199 | |||
| 200 | /* memcpy that is used with 8-byte aligned pointers, power-of-8 size and | ||
| 201 | * forced to use 'long' read/writes to try to atomically copy long counters. | ||
| 202 | * Best-effort only. No barriers here, since it _will_ race with concurrent | ||
| 203 | * updates from BPF programs. Called from bpf syscall and mostly used with | ||
| 204 | * size 8 or 16 bytes, so ask compiler to inline it. | ||
| 205 | */ | ||
| 206 | static inline void bpf_long_memcpy(void *dst, const void *src, u32 size) | ||
| 207 | { | ||
| 208 | const long *lsrc = src; | ||
| 209 | long *ldst = dst; | ||
| 210 | |||
| 211 | size /= sizeof(long); | ||
| 212 | while (size--) | ||
| 213 | *ldst++ = *lsrc++; | ||
| 214 | } | ||
| 215 | |||
| 185 | /* verify correctness of eBPF program */ | 216 | /* verify correctness of eBPF program */ |
| 186 | int bpf_check(struct bpf_prog **fp, union bpf_attr *attr); | 217 | int bpf_check(struct bpf_prog **fp, union bpf_attr *attr); |
| 187 | #else | 218 | #else |
| @@ -213,6 +244,7 @@ extern const struct bpf_func_proto bpf_get_current_uid_gid_proto; | |||
| 213 | extern const struct bpf_func_proto bpf_get_current_comm_proto; | 244 | extern const struct bpf_func_proto bpf_get_current_comm_proto; |
| 214 | extern const struct bpf_func_proto bpf_skb_vlan_push_proto; | 245 | extern const struct bpf_func_proto bpf_skb_vlan_push_proto; |
| 215 | extern const struct bpf_func_proto bpf_skb_vlan_pop_proto; | 246 | extern const struct bpf_func_proto bpf_skb_vlan_pop_proto; |
| 247 | extern const struct bpf_func_proto bpf_get_stackid_proto; | ||
| 216 | 248 | ||
| 217 | /* Shared helpers among cBPF and eBPF. */ | 249 | /* Shared helpers among cBPF and eBPF. */ |
| 218 | void bpf_user_rnd_init_once(void); | 250 | void bpf_user_rnd_init_once(void); |
diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h index 653dc9c4ebac..e2b7bf27c03e 100644 --- a/include/linux/ethtool.h +++ b/include/linux/ethtool.h | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | #ifndef _LINUX_ETHTOOL_H | 12 | #ifndef _LINUX_ETHTOOL_H |
| 13 | #define _LINUX_ETHTOOL_H | 13 | #define _LINUX_ETHTOOL_H |
| 14 | 14 | ||
| 15 | #include <linux/bitmap.h> | ||
| 15 | #include <linux/compat.h> | 16 | #include <linux/compat.h> |
| 16 | #include <uapi/linux/ethtool.h> | 17 | #include <uapi/linux/ethtool.h> |
| 17 | 18 | ||
| @@ -40,9 +41,6 @@ struct compat_ethtool_rxnfc { | |||
| 40 | 41 | ||
| 41 | #include <linux/rculist.h> | 42 | #include <linux/rculist.h> |
| 42 | 43 | ||
| 43 | extern int __ethtool_get_settings(struct net_device *dev, | ||
| 44 | struct ethtool_cmd *cmd); | ||
| 45 | |||
| 46 | /** | 44 | /** |
| 47 | * enum ethtool_phys_id_state - indicator state for physical identification | 45 | * enum ethtool_phys_id_state - indicator state for physical identification |
| 48 | * @ETHTOOL_ID_INACTIVE: Physical ID indicator should be deactivated | 46 | * @ETHTOOL_ID_INACTIVE: Physical ID indicator should be deactivated |
| @@ -97,13 +95,70 @@ static inline u32 ethtool_rxfh_indir_default(u32 index, u32 n_rx_rings) | |||
| 97 | return index % n_rx_rings; | 95 | return index % n_rx_rings; |
| 98 | } | 96 | } |
| 99 | 97 | ||
| 98 | /* number of link mode bits/ulongs handled internally by kernel */ | ||
| 99 | #define __ETHTOOL_LINK_MODE_MASK_NBITS \ | ||
| 100 | (__ETHTOOL_LINK_MODE_LAST + 1) | ||
| 101 | |||
| 102 | /* declare a link mode bitmap */ | ||
| 103 | #define __ETHTOOL_DECLARE_LINK_MODE_MASK(name) \ | ||
| 104 | DECLARE_BITMAP(name, __ETHTOOL_LINK_MODE_MASK_NBITS) | ||
| 105 | |||
| 106 | /* drivers must ignore base.cmd and base.link_mode_masks_nwords | ||
| 107 | * fields, but they are allowed to overwrite them (will be ignored). | ||
| 108 | */ | ||
| 109 | struct ethtool_link_ksettings { | ||
| 110 | struct ethtool_link_settings base; | ||
| 111 | struct { | ||
| 112 | __ETHTOOL_DECLARE_LINK_MODE_MASK(supported); | ||
| 113 | __ETHTOOL_DECLARE_LINK_MODE_MASK(advertising); | ||
| 114 | __ETHTOOL_DECLARE_LINK_MODE_MASK(lp_advertising); | ||
| 115 | } link_modes; | ||
| 116 | }; | ||
| 117 | |||
| 118 | /** | ||
| 119 | * ethtool_link_ksettings_zero_link_mode - clear link_ksettings link mode mask | ||
| 120 | * @ptr : pointer to struct ethtool_link_ksettings | ||
| 121 | * @name : one of supported/advertising/lp_advertising | ||
| 122 | */ | ||
| 123 | #define ethtool_link_ksettings_zero_link_mode(ptr, name) \ | ||
| 124 | bitmap_zero((ptr)->link_modes.name, __ETHTOOL_LINK_MODE_MASK_NBITS) | ||
| 125 | |||
| 126 | /** | ||
| 127 | * ethtool_link_ksettings_add_link_mode - set bit in link_ksettings | ||
| 128 | * link mode mask | ||
| 129 | * @ptr : pointer to struct ethtool_link_ksettings | ||
| 130 | * @name : one of supported/advertising/lp_advertising | ||
| 131 | * @mode : one of the ETHTOOL_LINK_MODE_*_BIT | ||
| 132 | * (not atomic, no bound checking) | ||
| 133 | */ | ||
| 134 | #define ethtool_link_ksettings_add_link_mode(ptr, name, mode) \ | ||
| 135 | __set_bit(ETHTOOL_LINK_MODE_ ## mode ## _BIT, (ptr)->link_modes.name) | ||
| 136 | |||
| 137 | /** | ||
| 138 | * ethtool_link_ksettings_test_link_mode - test bit in ksettings link mode mask | ||
| 139 | * @ptr : pointer to struct ethtool_link_ksettings | ||
| 140 | * @name : one of supported/advertising/lp_advertising | ||
| 141 | * @mode : one of the ETHTOOL_LINK_MODE_*_BIT | ||
| 142 | * (not atomic, no bound checking) | ||
| 143 | * | ||
| 144 | * Returns true/false. | ||
| 145 | */ | ||
| 146 | #define ethtool_link_ksettings_test_link_mode(ptr, name, mode) \ | ||
| 147 | test_bit(ETHTOOL_LINK_MODE_ ## mode ## _BIT, (ptr)->link_modes.name) | ||
| 148 | |||
| 149 | extern int | ||
| 150 | __ethtool_get_link_ksettings(struct net_device *dev, | ||
| 151 | struct ethtool_link_ksettings *link_ksettings); | ||
| 152 | |||
| 100 | /** | 153 | /** |
| 101 | * struct ethtool_ops - optional netdev operations | 154 | * struct ethtool_ops - optional netdev operations |
| 102 | * @get_settings: Get various device settings including Ethernet link | 155 | * @get_settings: DEPRECATED, use %get_link_ksettings/%set_link_ksettings |
| 156 | * API. Get various device settings including Ethernet link | ||
| 103 | * settings. The @cmd parameter is expected to have been cleared | 157 | * settings. The @cmd parameter is expected to have been cleared |
| 104 | * before get_settings is called. Returns a negative error code or | 158 | * before get_settings is called. Returns a negative error code |
| 105 | * zero. | 159 | * or zero. |
| 106 | * @set_settings: Set various device settings including Ethernet link | 160 | * @set_settings: DEPRECATED, use %get_link_ksettings/%set_link_ksettings |
| 161 | * API. Set various device settings including Ethernet link | ||
| 107 | * settings. Returns a negative error code or zero. | 162 | * settings. Returns a negative error code or zero. |
| 108 | * @get_drvinfo: Report driver/device information. Should only set the | 163 | * @get_drvinfo: Report driver/device information. Should only set the |
| 109 | * @driver, @version, @fw_version and @bus_info fields. If not | 164 | * @driver, @version, @fw_version and @bus_info fields. If not |
| @@ -201,6 +256,29 @@ static inline u32 ethtool_rxfh_indir_default(u32 index, u32 n_rx_rings) | |||
| 201 | * @get_module_eeprom: Get the eeprom information from the plug-in module | 256 | * @get_module_eeprom: Get the eeprom information from the plug-in module |
| 202 | * @get_eee: Get Energy-Efficient (EEE) supported and status. | 257 | * @get_eee: Get Energy-Efficient (EEE) supported and status. |
| 203 | * @set_eee: Set EEE status (enable/disable) as well as LPI timers. | 258 | * @set_eee: Set EEE status (enable/disable) as well as LPI timers. |
| 259 | * @get_per_queue_coalesce: Get interrupt coalescing parameters per queue. | ||
| 260 | * It must check that the given queue number is valid. If neither a RX nor | ||
| 261 | * a TX queue has this number, return -EINVAL. If only a RX queue or a TX | ||
| 262 | * queue has this number, set the inapplicable fields to ~0 and return 0. | ||
| 263 | * Returns a negative error code or zero. | ||
| 264 | * @set_per_queue_coalesce: Set interrupt coalescing parameters per queue. | ||
| 265 | * It must check that the given queue number is valid. If neither a RX nor | ||
| 266 | * a TX queue has this number, return -EINVAL. If only a RX queue or a TX | ||
| 267 | * queue has this number, ignore the inapplicable fields. | ||
| 268 | * Returns a negative error code or zero. | ||
| 269 | * @get_link_ksettings: When defined, takes precedence over the | ||
| 270 | * %get_settings method. Get various device settings | ||
| 271 | * including Ethernet link settings. The %cmd and | ||
| 272 | * %link_mode_masks_nwords fields should be ignored (use | ||
| 273 | * %__ETHTOOL_LINK_MODE_MASK_NBITS instead of the latter), any | ||
| 274 | * change to them will be overwritten by kernel. Returns a | ||
| 275 | * negative error code or zero. | ||
| 276 | * @set_link_ksettings: When defined, takes precedence over the | ||
| 277 | * %set_settings method. Set various device settings including | ||
| 278 | * Ethernet link settings. The %cmd and %link_mode_masks_nwords | ||
| 279 | * fields should be ignored (use %__ETHTOOL_LINK_MODE_MASK_NBITS | ||
| 280 | * instead of the latter), any change to them will be overwritten | ||
| 281 | * by kernel. Returns a negative error code or zero. | ||
| 204 | * | 282 | * |
| 205 | * All operations are optional (i.e. the function pointer may be set | 283 | * All operations are optional (i.e. the function pointer may be set |
| 206 | * to %NULL) and callers must take this into account. Callers must | 284 | * to %NULL) and callers must take this into account. Callers must |
| @@ -279,7 +357,13 @@ struct ethtool_ops { | |||
| 279 | const struct ethtool_tunable *, void *); | 357 | const struct ethtool_tunable *, void *); |
| 280 | int (*set_tunable)(struct net_device *, | 358 | int (*set_tunable)(struct net_device *, |
| 281 | const struct ethtool_tunable *, const void *); | 359 | const struct ethtool_tunable *, const void *); |
| 282 | 360 | int (*get_per_queue_coalesce)(struct net_device *, u32, | |
| 283 | 361 | struct ethtool_coalesce *); | |
| 362 | int (*set_per_queue_coalesce)(struct net_device *, u32, | ||
| 363 | struct ethtool_coalesce *); | ||
| 364 | int (*get_link_ksettings)(struct net_device *, | ||
| 365 | struct ethtool_link_ksettings *); | ||
| 366 | int (*set_link_ksettings)(struct net_device *, | ||
| 367 | const struct ethtool_link_ksettings *); | ||
| 284 | }; | 368 | }; |
| 285 | #endif /* _LINUX_ETHTOOL_H */ | 369 | #endif /* _LINUX_ETHTOOL_H */ |
diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h index 452c0b0d2f32..3b1f6cef9513 100644 --- a/include/linux/ieee80211.h +++ b/include/linux/ieee80211.h | |||
| @@ -163,6 +163,14 @@ static inline u16 ieee80211_sn_sub(u16 sn1, u16 sn2) | |||
| 163 | /* 30 byte 4 addr hdr, 2 byte QoS, 2304 byte MSDU, 12 byte crypt, 4 byte FCS */ | 163 | /* 30 byte 4 addr hdr, 2 byte QoS, 2304 byte MSDU, 12 byte crypt, 4 byte FCS */ |
| 164 | #define IEEE80211_MAX_FRAME_LEN 2352 | 164 | #define IEEE80211_MAX_FRAME_LEN 2352 |
| 165 | 165 | ||
| 166 | /* Maximal size of an A-MSDU */ | ||
| 167 | #define IEEE80211_MAX_MPDU_LEN_HT_3839 3839 | ||
| 168 | #define IEEE80211_MAX_MPDU_LEN_HT_7935 7935 | ||
| 169 | |||
| 170 | #define IEEE80211_MAX_MPDU_LEN_VHT_3895 3895 | ||
| 171 | #define IEEE80211_MAX_MPDU_LEN_VHT_7991 7991 | ||
| 172 | #define IEEE80211_MAX_MPDU_LEN_VHT_11454 11454 | ||
| 173 | |||
| 166 | #define IEEE80211_MAX_SSID_LEN 32 | 174 | #define IEEE80211_MAX_SSID_LEN 32 |
| 167 | 175 | ||
| 168 | #define IEEE80211_MAX_MESH_ID_LEN 32 | 176 | #define IEEE80211_MAX_MESH_ID_LEN 32 |
| @@ -843,6 +851,8 @@ enum ieee80211_vht_opmode_bits { | |||
| 843 | }; | 851 | }; |
| 844 | 852 | ||
| 845 | #define WLAN_SA_QUERY_TR_ID_LEN 2 | 853 | #define WLAN_SA_QUERY_TR_ID_LEN 2 |
| 854 | #define WLAN_MEMBERSHIP_LEN 8 | ||
| 855 | #define WLAN_USER_POSITION_LEN 16 | ||
| 846 | 856 | ||
| 847 | /** | 857 | /** |
| 848 | * struct ieee80211_tpc_report_ie | 858 | * struct ieee80211_tpc_report_ie |
| @@ -991,6 +1001,11 @@ struct ieee80211_mgmt { | |||
| 991 | } __packed vht_opmode_notif; | 1001 | } __packed vht_opmode_notif; |
| 992 | struct { | 1002 | struct { |
| 993 | u8 action_code; | 1003 | u8 action_code; |
| 1004 | u8 membership[WLAN_MEMBERSHIP_LEN]; | ||
| 1005 | u8 position[WLAN_USER_POSITION_LEN]; | ||
| 1006 | } __packed vht_group_notif; | ||
| 1007 | struct { | ||
| 1008 | u8 action_code; | ||
| 994 | u8 dialog_token; | 1009 | u8 dialog_token; |
| 995 | u8 tpc_elem_id; | 1010 | u8 tpc_elem_id; |
| 996 | u8 tpc_elem_length; | 1011 | u8 tpc_elem_length; |
| @@ -1498,6 +1513,7 @@ struct ieee80211_vht_operation { | |||
| 1498 | #define IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_3895 0x00000000 | 1513 | #define IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_3895 0x00000000 |
| 1499 | #define IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_7991 0x00000001 | 1514 | #define IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_7991 0x00000001 |
| 1500 | #define IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454 0x00000002 | 1515 | #define IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454 0x00000002 |
| 1516 | #define IEEE80211_VHT_CAP_MAX_MPDU_MASK 0x00000003 | ||
| 1501 | #define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ 0x00000004 | 1517 | #define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ 0x00000004 |
| 1502 | #define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ 0x00000008 | 1518 | #define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ 0x00000008 |
| 1503 | #define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK 0x0000000C | 1519 | #define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK 0x0000000C |
| @@ -2079,6 +2095,16 @@ enum ieee80211_tdls_actioncode { | |||
| 2079 | #define WLAN_EXT_CAPA8_TDLS_WIDE_BW_ENABLED BIT(5) | 2095 | #define WLAN_EXT_CAPA8_TDLS_WIDE_BW_ENABLED BIT(5) |
| 2080 | #define WLAN_EXT_CAPA8_OPMODE_NOTIF BIT(6) | 2096 | #define WLAN_EXT_CAPA8_OPMODE_NOTIF BIT(6) |
| 2081 | 2097 | ||
| 2098 | /* Defines the maximal number of MSDUs in an A-MSDU. */ | ||
| 2099 | #define WLAN_EXT_CAPA8_MAX_MSDU_IN_AMSDU_LSB BIT(7) | ||
| 2100 | #define WLAN_EXT_CAPA9_MAX_MSDU_IN_AMSDU_MSB BIT(0) | ||
| 2101 | |||
| 2102 | /* | ||
| 2103 | * Fine Timing Measurement Initiator - bit 71 of @WLAN_EID_EXT_CAPABILITY | ||
| 2104 | * information element | ||
| 2105 | */ | ||
| 2106 | #define WLAN_EXT_CAPA9_FTM_INITIATOR BIT(7) | ||
| 2107 | |||
| 2082 | /* TDLS specific payload type in the LLC/SNAP header */ | 2108 | /* TDLS specific payload type in the LLC/SNAP header */ |
| 2083 | #define WLAN_TDLS_SNAP_RFTYPE 0x2 | 2109 | #define WLAN_TDLS_SNAP_RFTYPE 0x2 |
| 2084 | 2110 | ||
diff --git a/include/linux/if_bridge.h b/include/linux/if_bridge.h index a338a688ee4a..dcb89e3515db 100644 --- a/include/linux/if_bridge.h +++ b/include/linux/if_bridge.h | |||
| @@ -46,10 +46,6 @@ struct br_ip_list { | |||
| 46 | #define BR_LEARNING_SYNC BIT(9) | 46 | #define BR_LEARNING_SYNC BIT(9) |
| 47 | #define BR_PROXYARP_WIFI BIT(10) | 47 | #define BR_PROXYARP_WIFI BIT(10) |
| 48 | 48 | ||
| 49 | /* values as per ieee8021QBridgeFdbAgingTime */ | ||
| 50 | #define BR_MIN_AGEING_TIME (10 * HZ) | ||
| 51 | #define BR_MAX_AGEING_TIME (1000000 * HZ) | ||
| 52 | |||
| 53 | #define BR_DEFAULT_AGEING_TIME (300 * HZ) | 49 | #define BR_DEFAULT_AGEING_TIME (300 * HZ) |
| 54 | 50 | ||
| 55 | extern void brioctl_set(int (*ioctl_hook)(struct net *, unsigned int, void __user *)); | 51 | extern void brioctl_set(int (*ioctl_hook)(struct net *, unsigned int, void __user *)); |
diff --git a/include/linux/if_team.h b/include/linux/if_team.h index b84e49c3a738..174f43f43aff 100644 --- a/include/linux/if_team.h +++ b/include/linux/if_team.h | |||
| @@ -24,6 +24,7 @@ struct team_pcpu_stats { | |||
| 24 | struct u64_stats_sync syncp; | 24 | struct u64_stats_sync syncp; |
| 25 | u32 rx_dropped; | 25 | u32 rx_dropped; |
| 26 | u32 tx_dropped; | 26 | u32 tx_dropped; |
| 27 | u32 rx_nohandler; | ||
| 27 | }; | 28 | }; |
| 28 | 29 | ||
| 29 | struct team; | 30 | struct team; |
diff --git a/include/linux/igmp.h b/include/linux/igmp.h index 9c9de11549a7..12f6fba6d21a 100644 --- a/include/linux/igmp.h +++ b/include/linux/igmp.h | |||
| @@ -37,11 +37,6 @@ static inline struct igmpv3_query * | |||
| 37 | return (struct igmpv3_query *)skb_transport_header(skb); | 37 | return (struct igmpv3_query *)skb_transport_header(skb); |
| 38 | } | 38 | } |
| 39 | 39 | ||
| 40 | extern int sysctl_igmp_llm_reports; | ||
| 41 | extern int sysctl_igmp_max_memberships; | ||
| 42 | extern int sysctl_igmp_max_msf; | ||
| 43 | extern int sysctl_igmp_qrv; | ||
| 44 | |||
| 45 | struct ip_sf_socklist { | 40 | struct ip_sf_socklist { |
| 46 | unsigned int sl_max; | 41 | unsigned int sl_max; |
| 47 | unsigned int sl_count; | 42 | unsigned int sl_count; |
diff --git a/include/linux/inet_lro.h b/include/linux/inet_lro.h deleted file mode 100644 index 9a715cfa1fe3..000000000000 --- a/include/linux/inet_lro.h +++ /dev/null | |||
| @@ -1,142 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * linux/include/linux/inet_lro.h | ||
| 3 | * | ||
| 4 | * Large Receive Offload (ipv4 / tcp) | ||
| 5 | * | ||
| 6 | * (C) Copyright IBM Corp. 2007 | ||
| 7 | * | ||
| 8 | * Authors: | ||
| 9 | * Jan-Bernd Themann <themann@de.ibm.com> | ||
| 10 | * Christoph Raisch <raisch@de.ibm.com> | ||
| 11 | * | ||
| 12 | * | ||
| 13 | * This program is free software; you can redistribute it and/or modify | ||
| 14 | * it under the terms of the GNU General Public License as published by | ||
| 15 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 16 | * any later version. | ||
| 17 | * | ||
| 18 | * This program is distributed in the hope that it will be useful, | ||
| 19 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 20 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 21 | * GNU General Public License for more details. | ||
| 22 | * | ||
| 23 | * You should have received a copy of the GNU General Public License | ||
| 24 | * along with this program; if not, write to the Free Software | ||
| 25 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 26 | */ | ||
| 27 | |||
| 28 | #ifndef __INET_LRO_H_ | ||
| 29 | #define __INET_LRO_H_ | ||
| 30 | |||
| 31 | #include <net/ip.h> | ||
| 32 | #include <net/tcp.h> | ||
| 33 | |||
| 34 | /* | ||
| 35 | * LRO statistics | ||
| 36 | */ | ||
| 37 | |||
| 38 | struct net_lro_stats { | ||
| 39 | unsigned long aggregated; | ||
| 40 | unsigned long flushed; | ||
| 41 | unsigned long no_desc; | ||
| 42 | }; | ||
| 43 | |||
| 44 | /* | ||
| 45 | * LRO descriptor for a tcp session | ||
| 46 | */ | ||
| 47 | struct net_lro_desc { | ||
| 48 | struct sk_buff *parent; | ||
| 49 | struct sk_buff *last_skb; | ||
| 50 | struct skb_frag_struct *next_frag; | ||
| 51 | struct iphdr *iph; | ||
| 52 | struct tcphdr *tcph; | ||
| 53 | __wsum data_csum; | ||
| 54 | __be32 tcp_rcv_tsecr; | ||
| 55 | __be32 tcp_rcv_tsval; | ||
| 56 | __be32 tcp_ack; | ||
| 57 | u32 tcp_next_seq; | ||
| 58 | u32 skb_tot_frags_len; | ||
| 59 | u16 ip_tot_len; | ||
| 60 | u16 tcp_saw_tstamp; /* timestamps enabled */ | ||
| 61 | __be16 tcp_window; | ||
| 62 | int pkt_aggr_cnt; /* counts aggregated packets */ | ||
| 63 | int vlan_packet; | ||
| 64 | int mss; | ||
| 65 | int active; | ||
| 66 | }; | ||
| 67 | |||
| 68 | /* | ||
| 69 | * Large Receive Offload (LRO) Manager | ||
| 70 | * | ||
| 71 | * Fields must be set by driver | ||
| 72 | */ | ||
| 73 | |||
| 74 | struct net_lro_mgr { | ||
| 75 | struct net_device *dev; | ||
| 76 | struct net_lro_stats stats; | ||
| 77 | |||
| 78 | /* LRO features */ | ||
| 79 | unsigned long features; | ||
| 80 | #define LRO_F_NAPI 1 /* Pass packets to stack via NAPI */ | ||
| 81 | #define LRO_F_EXTRACT_VLAN_ID 2 /* Set flag if VLAN IDs are extracted | ||
| 82 | from received packets and eth protocol | ||
| 83 | is still ETH_P_8021Q */ | ||
| 84 | |||
| 85 | /* | ||
| 86 | * Set for generated SKBs that are not added to | ||
| 87 | * the frag list in fragmented mode | ||
| 88 | */ | ||
| 89 | u32 ip_summed; | ||
| 90 | u32 ip_summed_aggr; /* Set in aggregated SKBs: CHECKSUM_UNNECESSARY | ||
| 91 | * or CHECKSUM_NONE */ | ||
| 92 | |||
| 93 | int max_desc; /* Max number of LRO descriptors */ | ||
| 94 | int max_aggr; /* Max number of LRO packets to be aggregated */ | ||
| 95 | |||
| 96 | int frag_align_pad; /* Padding required to properly align layer 3 | ||
| 97 | * headers in generated skb when using frags */ | ||
| 98 | |||
| 99 | struct net_lro_desc *lro_arr; /* Array of LRO descriptors */ | ||
| 100 | |||
| 101 | /* | ||
| 102 | * Optimized driver functions | ||
| 103 | * | ||
| 104 | * get_skb_header: returns tcp and ip header for packet in SKB | ||
| 105 | */ | ||
| 106 | int (*get_skb_header)(struct sk_buff *skb, void **ip_hdr, | ||
| 107 | void **tcpudp_hdr, u64 *hdr_flags, void *priv); | ||
| 108 | |||
| 109 | /* hdr_flags: */ | ||
| 110 | #define LRO_IPV4 1 /* ip_hdr is IPv4 header */ | ||
| 111 | #define LRO_TCP 2 /* tcpudp_hdr is TCP header */ | ||
| 112 | |||
| 113 | /* | ||
| 114 | * get_frag_header: returns mac, tcp and ip header for packet in SKB | ||
| 115 | * | ||
| 116 | * @hdr_flags: Indicate what kind of LRO has to be done | ||
| 117 | * (IPv4/IPv6/TCP/UDP) | ||
| 118 | */ | ||
| 119 | int (*get_frag_header)(struct skb_frag_struct *frag, void **mac_hdr, | ||
| 120 | void **ip_hdr, void **tcpudp_hdr, u64 *hdr_flags, | ||
| 121 | void *priv); | ||
| 122 | }; | ||
| 123 | |||
| 124 | /* | ||
| 125 | * Processes a SKB | ||
| 126 | * | ||
| 127 | * @lro_mgr: LRO manager to use | ||
| 128 | * @skb: SKB to aggregate | ||
| 129 | * @priv: Private data that may be used by driver functions | ||
| 130 | * (for example get_tcp_ip_hdr) | ||
| 131 | */ | ||
| 132 | |||
| 133 | void lro_receive_skb(struct net_lro_mgr *lro_mgr, | ||
| 134 | struct sk_buff *skb, | ||
| 135 | void *priv); | ||
| 136 | /* | ||
| 137 | * Forward all aggregated SKBs held by lro_mgr to network stack | ||
| 138 | */ | ||
| 139 | |||
| 140 | void lro_flush_all(struct net_lro_mgr *lro_mgr); | ||
| 141 | |||
| 142 | #endif | ||
diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h index 402753bccafa..7edc14fb66b6 100644 --- a/include/linux/ipv6.h +++ b/include/linux/ipv6.h | |||
| @@ -50,16 +50,19 @@ struct ipv6_devconf { | |||
| 50 | __s32 mc_forwarding; | 50 | __s32 mc_forwarding; |
| 51 | #endif | 51 | #endif |
| 52 | __s32 disable_ipv6; | 52 | __s32 disable_ipv6; |
| 53 | __s32 drop_unicast_in_l2_multicast; | ||
| 53 | __s32 accept_dad; | 54 | __s32 accept_dad; |
| 54 | __s32 force_tllao; | 55 | __s32 force_tllao; |
| 55 | __s32 ndisc_notify; | 56 | __s32 ndisc_notify; |
| 56 | __s32 suppress_frag_ndisc; | 57 | __s32 suppress_frag_ndisc; |
| 57 | __s32 accept_ra_mtu; | 58 | __s32 accept_ra_mtu; |
| 59 | __s32 drop_unsolicited_na; | ||
| 58 | struct ipv6_stable_secret { | 60 | struct ipv6_stable_secret { |
| 59 | bool initialized; | 61 | bool initialized; |
| 60 | struct in6_addr secret; | 62 | struct in6_addr secret; |
| 61 | } stable_secret; | 63 | } stable_secret; |
| 62 | __s32 use_oif_addrs_only; | 64 | __s32 use_oif_addrs_only; |
| 65 | __s32 keep_addr_on_down; | ||
| 63 | void *sysctl; | 66 | void *sysctl; |
| 64 | }; | 67 | }; |
| 65 | 68 | ||
diff --git a/include/linux/kernel.h b/include/linux/kernel.h index f4fa2b29c38c..b82646ee70eb 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h | |||
| @@ -64,7 +64,7 @@ | |||
| 64 | #define round_down(x, y) ((x) & ~__round_mask(x, y)) | 64 | #define round_down(x, y) ((x) & ~__round_mask(x, y)) |
| 65 | 65 | ||
| 66 | #define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f)) | 66 | #define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f)) |
| 67 | #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) | 67 | #define DIV_ROUND_UP __KERNEL_DIV_ROUND_UP |
| 68 | #define DIV_ROUND_UP_ULL(ll,d) \ | 68 | #define DIV_ROUND_UP_ULL(ll,d) \ |
| 69 | ({ unsigned long long _tmp = (ll)+(d)-1; do_div(_tmp, d); _tmp; }) | 69 | ({ unsigned long long _tmp = (ll)+(d)-1; do_div(_tmp, d); _tmp; }) |
| 70 | 70 | ||
diff --git a/include/linux/mbus.h b/include/linux/mbus.h index 1f7bc630d225..ea34a867caa0 100644 --- a/include/linux/mbus.h +++ b/include/linux/mbus.h | |||
| @@ -69,6 +69,9 @@ static inline const struct mbus_dram_target_info *mv_mbus_dram_info_nooverlap(vo | |||
| 69 | int mvebu_mbus_save_cpu_target(u32 *store_addr); | 69 | int mvebu_mbus_save_cpu_target(u32 *store_addr); |
| 70 | void mvebu_mbus_get_pcie_mem_aperture(struct resource *res); | 70 | void mvebu_mbus_get_pcie_mem_aperture(struct resource *res); |
| 71 | void mvebu_mbus_get_pcie_io_aperture(struct resource *res); | 71 | void mvebu_mbus_get_pcie_io_aperture(struct resource *res); |
| 72 | int mvebu_mbus_get_dram_win_info(phys_addr_t phyaddr, u8 *target, u8 *attr); | ||
| 73 | int mvebu_mbus_get_io_win_info(phys_addr_t phyaddr, u32 *size, u8 *target, | ||
| 74 | u8 *attr); | ||
| 72 | int mvebu_mbus_add_window_remap_by_id(unsigned int target, | 75 | int mvebu_mbus_add_window_remap_by_id(unsigned int target, |
| 73 | unsigned int attribute, | 76 | unsigned int attribute, |
| 74 | phys_addr_t base, size_t size, | 77 | phys_addr_t base, size_t size, |
diff --git a/include/linux/mlx4/driver.h b/include/linux/mlx4/driver.h index 2e8af001c5da..bd0e7075ea6d 100644 --- a/include/linux/mlx4/driver.h +++ b/include/linux/mlx4/driver.h | |||
| @@ -33,6 +33,7 @@ | |||
| 33 | #ifndef MLX4_DRIVER_H | 33 | #ifndef MLX4_DRIVER_H |
| 34 | #define MLX4_DRIVER_H | 34 | #define MLX4_DRIVER_H |
| 35 | 35 | ||
| 36 | #include <net/devlink.h> | ||
| 36 | #include <linux/mlx4/device.h> | 37 | #include <linux/mlx4/device.h> |
| 37 | 38 | ||
| 38 | struct mlx4_dev; | 39 | struct mlx4_dev; |
| @@ -89,6 +90,8 @@ int mlx4_port_map_set(struct mlx4_dev *dev, struct mlx4_port_map *v2p); | |||
| 89 | 90 | ||
| 90 | void *mlx4_get_protocol_dev(struct mlx4_dev *dev, enum mlx4_protocol proto, int port); | 91 | void *mlx4_get_protocol_dev(struct mlx4_dev *dev, enum mlx4_protocol proto, int port); |
| 91 | 92 | ||
| 93 | struct devlink_port *mlx4_get_devlink_port(struct mlx4_dev *dev, int port); | ||
| 94 | |||
| 92 | static inline u64 mlx4_mac_to_u64(u8 *addr) | 95 | static inline u64 mlx4_mac_to_u64(u8 *addr) |
| 93 | { | 96 | { |
| 94 | u64 mac = 0; | 97 | u64 mac = 0; |
diff --git a/include/linux/mlx5/device.h b/include/linux/mlx5/device.h index 9566b3b3b2c5..02ac3000ee3c 100644 --- a/include/linux/mlx5/device.h +++ b/include/linux/mlx5/device.h | |||
| @@ -374,6 +374,12 @@ enum { | |||
| 374 | }; | 374 | }; |
| 375 | 375 | ||
| 376 | enum { | 376 | enum { |
| 377 | MLX5_BW_NO_LIMIT = 0, | ||
| 378 | MLX5_100_MBPS_UNIT = 3, | ||
| 379 | MLX5_GBPS_UNIT = 4, | ||
| 380 | }; | ||
| 381 | |||
| 382 | enum { | ||
| 377 | MLX5_MAX_PAGE_SHIFT = 31 | 383 | MLX5_MAX_PAGE_SHIFT = 31 |
| 378 | }; | 384 | }; |
| 379 | 385 | ||
| @@ -1200,6 +1206,17 @@ enum { | |||
| 1200 | MLX5_RQC_RQ_TYPE_MEMORY_RQ_RPM = 0x1, | 1206 | MLX5_RQC_RQ_TYPE_MEMORY_RQ_RPM = 0x1, |
| 1201 | }; | 1207 | }; |
| 1202 | 1208 | ||
| 1209 | enum mlx5_wol_mode { | ||
| 1210 | MLX5_WOL_DISABLE = 0, | ||
| 1211 | MLX5_WOL_SECURED_MAGIC = 1 << 1, | ||
| 1212 | MLX5_WOL_MAGIC = 1 << 2, | ||
| 1213 | MLX5_WOL_ARP = 1 << 3, | ||
| 1214 | MLX5_WOL_BROADCAST = 1 << 4, | ||
| 1215 | MLX5_WOL_MULTICAST = 1 << 5, | ||
| 1216 | MLX5_WOL_UNICAST = 1 << 6, | ||
| 1217 | MLX5_WOL_PHY_ACTIVITY = 1 << 7, | ||
| 1218 | }; | ||
| 1219 | |||
| 1203 | /* MLX5 DEV CAPs */ | 1220 | /* MLX5 DEV CAPs */ |
| 1204 | 1221 | ||
| 1205 | /* TODO: EAT.ME */ | 1222 | /* TODO: EAT.ME */ |
diff --git a/include/linux/mlx5/driver.h b/include/linux/mlx5/driver.h index 9108904a6a56..3a954465b2bf 100644 --- a/include/linux/mlx5/driver.h +++ b/include/linux/mlx5/driver.h | |||
| @@ -54,7 +54,7 @@ enum { | |||
| 54 | /* one minute for the sake of bringup. Generally, commands must always | 54 | /* one minute for the sake of bringup. Generally, commands must always |
| 55 | * complete and we may need to increase this timeout value | 55 | * complete and we may need to increase this timeout value |
| 56 | */ | 56 | */ |
| 57 | MLX5_CMD_TIMEOUT_MSEC = 7200 * 1000, | 57 | MLX5_CMD_TIMEOUT_MSEC = 60 * 1000, |
| 58 | MLX5_CMD_WQ_MAX_NAME = 32, | 58 | MLX5_CMD_WQ_MAX_NAME = 32, |
| 59 | }; | 59 | }; |
| 60 | 60 | ||
| @@ -99,6 +99,8 @@ enum { | |||
| 99 | }; | 99 | }; |
| 100 | 100 | ||
| 101 | enum { | 101 | enum { |
| 102 | MLX5_REG_QETCR = 0x4005, | ||
| 103 | MLX5_REG_QTCT = 0x400a, | ||
| 102 | MLX5_REG_PCAP = 0x5001, | 104 | MLX5_REG_PCAP = 0x5001, |
| 103 | MLX5_REG_PMTU = 0x5003, | 105 | MLX5_REG_PMTU = 0x5003, |
| 104 | MLX5_REG_PTYS = 0x5004, | 106 | MLX5_REG_PTYS = 0x5004, |
| @@ -458,8 +460,6 @@ struct mlx5_priv { | |||
| 458 | struct mlx5_uuar_info uuari; | 460 | struct mlx5_uuar_info uuari; |
| 459 | MLX5_DECLARE_DOORBELL_LOCK(cq_uar_lock); | 461 | MLX5_DECLARE_DOORBELL_LOCK(cq_uar_lock); |
| 460 | 462 | ||
| 461 | struct io_mapping *bf_mapping; | ||
| 462 | |||
| 463 | /* pages stuff */ | 463 | /* pages stuff */ |
| 464 | struct workqueue_struct *pg_wq; | 464 | struct workqueue_struct *pg_wq; |
| 465 | struct rb_root page_root; | 465 | struct rb_root page_root; |
| @@ -717,7 +717,8 @@ int mlx5_cmd_alloc_uar(struct mlx5_core_dev *dev, u32 *uarn); | |||
| 717 | int mlx5_cmd_free_uar(struct mlx5_core_dev *dev, u32 uarn); | 717 | int mlx5_cmd_free_uar(struct mlx5_core_dev *dev, u32 uarn); |
| 718 | int mlx5_alloc_uuars(struct mlx5_core_dev *dev, struct mlx5_uuar_info *uuari); | 718 | int mlx5_alloc_uuars(struct mlx5_core_dev *dev, struct mlx5_uuar_info *uuari); |
| 719 | int mlx5_free_uuars(struct mlx5_core_dev *dev, struct mlx5_uuar_info *uuari); | 719 | int mlx5_free_uuars(struct mlx5_core_dev *dev, struct mlx5_uuar_info *uuari); |
| 720 | int mlx5_alloc_map_uar(struct mlx5_core_dev *mdev, struct mlx5_uar *uar); | 720 | int mlx5_alloc_map_uar(struct mlx5_core_dev *mdev, struct mlx5_uar *uar, |
| 721 | bool map_wc); | ||
| 721 | void mlx5_unmap_free_uar(struct mlx5_core_dev *mdev, struct mlx5_uar *uar); | 722 | void mlx5_unmap_free_uar(struct mlx5_core_dev *mdev, struct mlx5_uar *uar); |
| 722 | void mlx5_health_cleanup(struct mlx5_core_dev *dev); | 723 | void mlx5_health_cleanup(struct mlx5_core_dev *dev); |
| 723 | int mlx5_health_init(struct mlx5_core_dev *dev); | 724 | int mlx5_health_init(struct mlx5_core_dev *dev); |
| @@ -796,37 +797,6 @@ int mlx5_core_access_reg(struct mlx5_core_dev *dev, void *data_in, | |||
| 796 | int size_in, void *data_out, int size_out, | 797 | int size_in, void *data_out, int size_out, |
| 797 | u16 reg_num, int arg, int write); | 798 | u16 reg_num, int arg, int write); |
| 798 | 799 | ||
| 799 | int mlx5_set_port_caps(struct mlx5_core_dev *dev, u8 port_num, u32 caps); | ||
| 800 | int mlx5_query_port_ptys(struct mlx5_core_dev *dev, u32 *ptys, | ||
| 801 | int ptys_size, int proto_mask, u8 local_port); | ||
| 802 | int mlx5_query_port_proto_cap(struct mlx5_core_dev *dev, | ||
| 803 | u32 *proto_cap, int proto_mask); | ||
| 804 | int mlx5_query_port_proto_admin(struct mlx5_core_dev *dev, | ||
| 805 | u32 *proto_admin, int proto_mask); | ||
| 806 | int mlx5_query_port_link_width_oper(struct mlx5_core_dev *dev, | ||
| 807 | u8 *link_width_oper, u8 local_port); | ||
| 808 | int mlx5_query_port_proto_oper(struct mlx5_core_dev *dev, | ||
| 809 | u8 *proto_oper, int proto_mask, | ||
| 810 | u8 local_port); | ||
| 811 | int mlx5_set_port_proto(struct mlx5_core_dev *dev, u32 proto_admin, | ||
| 812 | int proto_mask); | ||
| 813 | int mlx5_set_port_admin_status(struct mlx5_core_dev *dev, | ||
| 814 | enum mlx5_port_status status); | ||
| 815 | int mlx5_query_port_admin_status(struct mlx5_core_dev *dev, | ||
| 816 | enum mlx5_port_status *status); | ||
| 817 | |||
| 818 | int mlx5_set_port_mtu(struct mlx5_core_dev *dev, int mtu, u8 port); | ||
| 819 | void mlx5_query_port_max_mtu(struct mlx5_core_dev *dev, int *max_mtu, u8 port); | ||
| 820 | void mlx5_query_port_oper_mtu(struct mlx5_core_dev *dev, int *oper_mtu, | ||
| 821 | u8 port); | ||
| 822 | |||
| 823 | int mlx5_query_port_vl_hw_cap(struct mlx5_core_dev *dev, | ||
| 824 | u8 *vl_hw_cap, u8 local_port); | ||
| 825 | |||
| 826 | int mlx5_set_port_pause(struct mlx5_core_dev *dev, u32 rx_pause, u32 tx_pause); | ||
| 827 | int mlx5_query_port_pause(struct mlx5_core_dev *dev, | ||
| 828 | u32 *rx_pause, u32 *tx_pause); | ||
| 829 | |||
| 830 | int mlx5_debug_eq_add(struct mlx5_core_dev *dev, struct mlx5_eq *eq); | 800 | int mlx5_debug_eq_add(struct mlx5_core_dev *dev, struct mlx5_eq *eq); |
| 831 | void mlx5_debug_eq_remove(struct mlx5_core_dev *dev, struct mlx5_eq *eq); | 801 | void mlx5_debug_eq_remove(struct mlx5_core_dev *dev, struct mlx5_eq *eq); |
| 832 | int mlx5_core_eq_query(struct mlx5_core_dev *dev, struct mlx5_eq *eq, | 802 | int mlx5_core_eq_query(struct mlx5_core_dev *dev, struct mlx5_eq *eq, |
diff --git a/include/linux/mlx5/mlx5_ifc.h b/include/linux/mlx5/mlx5_ifc.h index 9b8a02b7880f..e52730e01ed6 100644 --- a/include/linux/mlx5/mlx5_ifc.h +++ b/include/linux/mlx5/mlx5_ifc.h | |||
| @@ -166,6 +166,8 @@ enum { | |||
| 166 | MLX5_CMD_OP_SET_L2_TABLE_ENTRY = 0x829, | 166 | MLX5_CMD_OP_SET_L2_TABLE_ENTRY = 0x829, |
| 167 | MLX5_CMD_OP_QUERY_L2_TABLE_ENTRY = 0x82a, | 167 | MLX5_CMD_OP_QUERY_L2_TABLE_ENTRY = 0x82a, |
| 168 | MLX5_CMD_OP_DELETE_L2_TABLE_ENTRY = 0x82b, | 168 | MLX5_CMD_OP_DELETE_L2_TABLE_ENTRY = 0x82b, |
| 169 | MLX5_CMD_OP_SET_WOL_ROL = 0x830, | ||
| 170 | MLX5_CMD_OP_QUERY_WOL_ROL = 0x831, | ||
| 169 | MLX5_CMD_OP_CREATE_TIR = 0x900, | 171 | MLX5_CMD_OP_CREATE_TIR = 0x900, |
| 170 | MLX5_CMD_OP_MODIFY_TIR = 0x901, | 172 | MLX5_CMD_OP_MODIFY_TIR = 0x901, |
| 171 | MLX5_CMD_OP_DESTROY_TIR = 0x902, | 173 | MLX5_CMD_OP_DESTROY_TIR = 0x902, |
| @@ -730,7 +732,19 @@ struct mlx5_ifc_cmd_hca_cap_bits { | |||
| 730 | 732 | ||
| 731 | u8 reserved_at_1bf[0x3]; | 733 | u8 reserved_at_1bf[0x3]; |
| 732 | u8 log_max_msg[0x5]; | 734 | u8 log_max_msg[0x5]; |
| 733 | u8 reserved_at_1c7[0x18]; | 735 | u8 reserved_at_1c7[0x4]; |
| 736 | u8 max_tc[0x4]; | ||
| 737 | u8 reserved_at_1cf[0x6]; | ||
| 738 | u8 rol_s[0x1]; | ||
| 739 | u8 rol_g[0x1]; | ||
| 740 | u8 reserved_at_1d7[0x1]; | ||
| 741 | u8 wol_s[0x1]; | ||
| 742 | u8 wol_g[0x1]; | ||
| 743 | u8 wol_a[0x1]; | ||
| 744 | u8 wol_b[0x1]; | ||
| 745 | u8 wol_m[0x1]; | ||
| 746 | u8 wol_u[0x1]; | ||
| 747 | u8 wol_p[0x1]; | ||
| 734 | 748 | ||
| 735 | u8 stat_rate_support[0x10]; | 749 | u8 stat_rate_support[0x10]; |
| 736 | u8 reserved_at_1ef[0xc]; | 750 | u8 reserved_at_1ef[0xc]; |
| @@ -6911,6 +6925,54 @@ struct mlx5_ifc_mtt_bits { | |||
| 6911 | u8 rd_en[0x1]; | 6925 | u8 rd_en[0x1]; |
| 6912 | }; | 6926 | }; |
| 6913 | 6927 | ||
| 6928 | struct mlx5_ifc_query_wol_rol_out_bits { | ||
| 6929 | u8 status[0x8]; | ||
| 6930 | u8 reserved_at_8[0x18]; | ||
| 6931 | |||
| 6932 | u8 syndrome[0x20]; | ||
| 6933 | |||
| 6934 | u8 reserved_at_40[0x10]; | ||
| 6935 | u8 rol_mode[0x8]; | ||
| 6936 | u8 wol_mode[0x8]; | ||
| 6937 | |||
| 6938 | u8 reserved_at_60[0x20]; | ||
| 6939 | }; | ||
| 6940 | |||
| 6941 | struct mlx5_ifc_query_wol_rol_in_bits { | ||
| 6942 | u8 opcode[0x10]; | ||
| 6943 | u8 reserved_at_10[0x10]; | ||
| 6944 | |||
| 6945 | u8 reserved_at_20[0x10]; | ||
| 6946 | u8 op_mod[0x10]; | ||
| 6947 | |||
| 6948 | u8 reserved_at_40[0x40]; | ||
| 6949 | }; | ||
| 6950 | |||
| 6951 | struct mlx5_ifc_set_wol_rol_out_bits { | ||
| 6952 | u8 status[0x8]; | ||
| 6953 | u8 reserved_at_8[0x18]; | ||
| 6954 | |||
| 6955 | u8 syndrome[0x20]; | ||
| 6956 | |||
| 6957 | u8 reserved_at_40[0x40]; | ||
| 6958 | }; | ||
| 6959 | |||
| 6960 | struct mlx5_ifc_set_wol_rol_in_bits { | ||
| 6961 | u8 opcode[0x10]; | ||
| 6962 | u8 reserved_at_10[0x10]; | ||
| 6963 | |||
| 6964 | u8 reserved_at_20[0x10]; | ||
| 6965 | u8 op_mod[0x10]; | ||
| 6966 | |||
| 6967 | u8 rol_mode_valid[0x1]; | ||
| 6968 | u8 wol_mode_valid[0x1]; | ||
| 6969 | u8 reserved_at_42[0xe]; | ||
| 6970 | u8 rol_mode[0x8]; | ||
| 6971 | u8 wol_mode[0x8]; | ||
| 6972 | |||
| 6973 | u8 reserved_at_60[0x20]; | ||
| 6974 | }; | ||
| 6975 | |||
| 6914 | enum { | 6976 | enum { |
| 6915 | MLX5_INITIAL_SEG_NIC_INTERFACE_FULL_DRIVER = 0x0, | 6977 | MLX5_INITIAL_SEG_NIC_INTERFACE_FULL_DRIVER = 0x0, |
| 6916 | MLX5_INITIAL_SEG_NIC_INTERFACE_DISABLED = 0x1, | 6978 | MLX5_INITIAL_SEG_NIC_INTERFACE_DISABLED = 0x1, |
| @@ -7102,4 +7164,49 @@ struct mlx5_ifc_modify_flow_table_in_bits { | |||
| 7102 | u8 reserved_at_100[0x100]; | 7164 | u8 reserved_at_100[0x100]; |
| 7103 | }; | 7165 | }; |
| 7104 | 7166 | ||
| 7167 | struct mlx5_ifc_ets_tcn_config_reg_bits { | ||
| 7168 | u8 g[0x1]; | ||
| 7169 | u8 b[0x1]; | ||
| 7170 | u8 r[0x1]; | ||
| 7171 | u8 reserved_at_3[0x9]; | ||
| 7172 | u8 group[0x4]; | ||
| 7173 | u8 reserved_at_10[0x9]; | ||
| 7174 | u8 bw_allocation[0x7]; | ||
| 7175 | |||
| 7176 | u8 reserved_at_20[0xc]; | ||
| 7177 | u8 max_bw_units[0x4]; | ||
| 7178 | u8 reserved_at_30[0x8]; | ||
| 7179 | u8 max_bw_value[0x8]; | ||
| 7180 | }; | ||
| 7181 | |||
| 7182 | struct mlx5_ifc_ets_global_config_reg_bits { | ||
| 7183 | u8 reserved_at_0[0x2]; | ||
| 7184 | u8 r[0x1]; | ||
| 7185 | u8 reserved_at_3[0x1d]; | ||
| 7186 | |||
| 7187 | u8 reserved_at_20[0xc]; | ||
| 7188 | u8 max_bw_units[0x4]; | ||
| 7189 | u8 reserved_at_30[0x8]; | ||
| 7190 | u8 max_bw_value[0x8]; | ||
| 7191 | }; | ||
| 7192 | |||
| 7193 | struct mlx5_ifc_qetc_reg_bits { | ||
| 7194 | u8 reserved_at_0[0x8]; | ||
| 7195 | u8 port_number[0x8]; | ||
| 7196 | u8 reserved_at_10[0x30]; | ||
| 7197 | |||
| 7198 | struct mlx5_ifc_ets_tcn_config_reg_bits tc_configuration[0x8]; | ||
| 7199 | struct mlx5_ifc_ets_global_config_reg_bits global_configuration; | ||
| 7200 | }; | ||
| 7201 | |||
| 7202 | struct mlx5_ifc_qtct_reg_bits { | ||
| 7203 | u8 reserved_at_0[0x8]; | ||
| 7204 | u8 port_number[0x8]; | ||
| 7205 | u8 reserved_at_10[0xd]; | ||
| 7206 | u8 prio[0x3]; | ||
| 7207 | |||
| 7208 | u8 reserved_at_20[0x1d]; | ||
| 7209 | u8 tclass[0x3]; | ||
| 7210 | }; | ||
| 7211 | |||
| 7105 | #endif /* MLX5_IFC_H */ | 7212 | #endif /* MLX5_IFC_H */ |
diff --git a/include/linux/mlx5/port.h b/include/linux/mlx5/port.h new file mode 100644 index 000000000000..a1d145abd4eb --- /dev/null +++ b/include/linux/mlx5/port.h | |||
| @@ -0,0 +1,87 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (c) 2016, Mellanox Technologies. All rights reserved. | ||
| 3 | * | ||
| 4 | * This software is available to you under a choice of one of two | ||
| 5 | * licenses. You may choose to be licensed under the terms of the GNU | ||
| 6 | * General Public License (GPL) Version 2, available from the file | ||
| 7 | * COPYING in the main directory of this source tree, or the | ||
| 8 | * OpenIB.org BSD license below: | ||
| 9 | * | ||
| 10 | * Redistribution and use in source and binary forms, with or | ||
| 11 | * without modification, are permitted provided that the following | ||
| 12 | * conditions are met: | ||
| 13 | * | ||
| 14 | * - Redistributions of source code must retain the above | ||
| 15 | * copyright notice, this list of conditions and the following | ||
| 16 | * disclaimer. | ||
| 17 | * | ||
| 18 | * - Redistributions in binary form must reproduce the above | ||
| 19 | * copyright notice, this list of conditions and the following | ||
| 20 | * disclaimer in the documentation and/or other materials | ||
| 21 | * provided with the distribution. | ||
| 22 | * | ||
| 23 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||
| 24 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||
| 25 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||
| 26 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS | ||
| 27 | * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | ||
| 28 | * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||
| 29 | * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||
| 30 | * SOFTWARE. | ||
| 31 | */ | ||
| 32 | |||
| 33 | #ifndef __MLX5_PORT_H__ | ||
| 34 | #define __MLX5_PORT_H__ | ||
| 35 | |||
| 36 | #include <linux/mlx5/driver.h> | ||
| 37 | |||
| 38 | int mlx5_set_port_caps(struct mlx5_core_dev *dev, u8 port_num, u32 caps); | ||
| 39 | int mlx5_query_port_ptys(struct mlx5_core_dev *dev, u32 *ptys, | ||
| 40 | int ptys_size, int proto_mask, u8 local_port); | ||
| 41 | int mlx5_query_port_proto_cap(struct mlx5_core_dev *dev, | ||
| 42 | u32 *proto_cap, int proto_mask); | ||
| 43 | int mlx5_query_port_proto_admin(struct mlx5_core_dev *dev, | ||
| 44 | u32 *proto_admin, int proto_mask); | ||
| 45 | int mlx5_query_port_link_width_oper(struct mlx5_core_dev *dev, | ||
| 46 | u8 *link_width_oper, u8 local_port); | ||
| 47 | int mlx5_query_port_proto_oper(struct mlx5_core_dev *dev, | ||
| 48 | u8 *proto_oper, int proto_mask, | ||
| 49 | u8 local_port); | ||
| 50 | int mlx5_set_port_proto(struct mlx5_core_dev *dev, u32 proto_admin, | ||
| 51 | int proto_mask); | ||
| 52 | int mlx5_set_port_admin_status(struct mlx5_core_dev *dev, | ||
| 53 | enum mlx5_port_status status); | ||
| 54 | int mlx5_query_port_admin_status(struct mlx5_core_dev *dev, | ||
| 55 | enum mlx5_port_status *status); | ||
| 56 | |||
| 57 | int mlx5_set_port_mtu(struct mlx5_core_dev *dev, int mtu, u8 port); | ||
| 58 | void mlx5_query_port_max_mtu(struct mlx5_core_dev *dev, int *max_mtu, u8 port); | ||
| 59 | void mlx5_query_port_oper_mtu(struct mlx5_core_dev *dev, int *oper_mtu, | ||
| 60 | u8 port); | ||
| 61 | |||
| 62 | int mlx5_query_port_vl_hw_cap(struct mlx5_core_dev *dev, | ||
| 63 | u8 *vl_hw_cap, u8 local_port); | ||
| 64 | |||
| 65 | int mlx5_set_port_pause(struct mlx5_core_dev *dev, u32 rx_pause, u32 tx_pause); | ||
| 66 | int mlx5_query_port_pause(struct mlx5_core_dev *dev, | ||
| 67 | u32 *rx_pause, u32 *tx_pause); | ||
| 68 | |||
| 69 | int mlx5_set_port_pfc(struct mlx5_core_dev *dev, u8 pfc_en_tx, u8 pfc_en_rx); | ||
| 70 | int mlx5_query_port_pfc(struct mlx5_core_dev *dev, u8 *pfc_en_tx, | ||
| 71 | u8 *pfc_en_rx); | ||
| 72 | |||
| 73 | int mlx5_max_tc(struct mlx5_core_dev *mdev); | ||
| 74 | |||
| 75 | int mlx5_set_port_prio_tc(struct mlx5_core_dev *mdev, u8 *prio_tc); | ||
| 76 | int mlx5_set_port_tc_group(struct mlx5_core_dev *mdev, u8 *tc_group); | ||
| 77 | int mlx5_set_port_tc_bw_alloc(struct mlx5_core_dev *mdev, u8 *tc_bw); | ||
| 78 | int mlx5_modify_port_ets_rate_limit(struct mlx5_core_dev *mdev, | ||
| 79 | u8 *max_bw_value, | ||
| 80 | u8 *max_bw_unit); | ||
| 81 | int mlx5_query_port_ets_rate_limit(struct mlx5_core_dev *mdev, | ||
| 82 | u8 *max_bw_value, | ||
| 83 | u8 *max_bw_unit); | ||
| 84 | int mlx5_set_port_wol(struct mlx5_core_dev *mdev, u8 wol_mode); | ||
| 85 | int mlx5_query_port_wol(struct mlx5_core_dev *mdev, u8 *wol_mode); | ||
| 86 | |||
| 87 | #endif /* __MLX5_PORT_H__ */ | ||
diff --git a/include/linux/net.h b/include/linux/net.h index 0b4ac7da583a..49175e4ced11 100644 --- a/include/linux/net.h +++ b/include/linux/net.h | |||
| @@ -215,6 +215,7 @@ int __sock_create(struct net *net, int family, int type, int proto, | |||
| 215 | int sock_create(int family, int type, int proto, struct socket **res); | 215 | int sock_create(int family, int type, int proto, struct socket **res); |
| 216 | int sock_create_kern(struct net *net, int family, int type, int proto, struct socket **res); | 216 | int sock_create_kern(struct net *net, int family, int type, int proto, struct socket **res); |
| 217 | int sock_create_lite(int family, int type, int proto, struct socket **res); | 217 | int sock_create_lite(int family, int type, int proto, struct socket **res); |
| 218 | struct socket *sock_alloc(void); | ||
| 218 | void sock_release(struct socket *sock); | 219 | void sock_release(struct socket *sock); |
| 219 | int sock_sendmsg(struct socket *sock, struct msghdr *msg); | 220 | int sock_sendmsg(struct socket *sock, struct msghdr *msg); |
| 220 | int sock_recvmsg(struct socket *sock, struct msghdr *msg, size_t size, | 221 | int sock_recvmsg(struct socket *sock, struct msghdr *msg, size_t size, |
diff --git a/include/linux/netdev_features.h b/include/linux/netdev_features.h index d9654f0eecb3..a734bf43d190 100644 --- a/include/linux/netdev_features.h +++ b/include/linux/netdev_features.h | |||
| @@ -67,6 +67,8 @@ enum { | |||
| 67 | NETIF_F_HW_L2FW_DOFFLOAD_BIT, /* Allow L2 Forwarding in Hardware */ | 67 | NETIF_F_HW_L2FW_DOFFLOAD_BIT, /* Allow L2 Forwarding in Hardware */ |
| 68 | NETIF_F_BUSY_POLL_BIT, /* Busy poll */ | 68 | NETIF_F_BUSY_POLL_BIT, /* Busy poll */ |
| 69 | 69 | ||
| 70 | NETIF_F_HW_TC_BIT, /* Offload TC infrastructure */ | ||
| 71 | |||
| 70 | /* | 72 | /* |
| 71 | * Add your fresh new feature above and remember to update | 73 | * Add your fresh new feature above and remember to update |
| 72 | * netdev_features_strings[] in net/core/ethtool.c and maybe | 74 | * netdev_features_strings[] in net/core/ethtool.c and maybe |
| @@ -124,6 +126,7 @@ enum { | |||
| 124 | #define NETIF_F_HW_VLAN_STAG_TX __NETIF_F(HW_VLAN_STAG_TX) | 126 | #define NETIF_F_HW_VLAN_STAG_TX __NETIF_F(HW_VLAN_STAG_TX) |
| 125 | #define NETIF_F_HW_L2FW_DOFFLOAD __NETIF_F(HW_L2FW_DOFFLOAD) | 127 | #define NETIF_F_HW_L2FW_DOFFLOAD __NETIF_F(HW_L2FW_DOFFLOAD) |
| 126 | #define NETIF_F_BUSY_POLL __NETIF_F(BUSY_POLL) | 128 | #define NETIF_F_BUSY_POLL __NETIF_F(BUSY_POLL) |
| 129 | #define NETIF_F_HW_TC __NETIF_F(HW_TC) | ||
| 127 | 130 | ||
| 128 | #define for_each_netdev_feature(mask_addr, bit) \ | 131 | #define for_each_netdev_feature(mask_addr, bit) \ |
| 129 | for_each_set_bit(bit, (unsigned long *)mask_addr, NETDEV_FEATURE_COUNT) | 132 | for_each_set_bit(bit, (unsigned long *)mask_addr, NETDEV_FEATURE_COUNT) |
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 5440b7b705eb..be693b34662f 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
| @@ -51,6 +51,7 @@ | |||
| 51 | #include <linux/neighbour.h> | 51 | #include <linux/neighbour.h> |
| 52 | #include <uapi/linux/netdevice.h> | 52 | #include <uapi/linux/netdevice.h> |
| 53 | #include <uapi/linux/if_bonding.h> | 53 | #include <uapi/linux/if_bonding.h> |
| 54 | #include <uapi/linux/pkt_cls.h> | ||
| 54 | 55 | ||
| 55 | struct netpoll_info; | 56 | struct netpoll_info; |
| 56 | struct device; | 57 | struct device; |
| @@ -267,6 +268,7 @@ struct header_ops { | |||
| 267 | void (*cache_update)(struct hh_cache *hh, | 268 | void (*cache_update)(struct hh_cache *hh, |
| 268 | const struct net_device *dev, | 269 | const struct net_device *dev, |
| 269 | const unsigned char *haddr); | 270 | const unsigned char *haddr); |
| 271 | bool (*validate)(const char *ll_header, unsigned int len); | ||
| 270 | }; | 272 | }; |
| 271 | 273 | ||
| 272 | /* These flag bits are private to the generic network queueing | 274 | /* These flag bits are private to the generic network queueing |
| @@ -778,6 +780,27 @@ static inline bool netdev_phys_item_id_same(struct netdev_phys_item_id *a, | |||
| 778 | typedef u16 (*select_queue_fallback_t)(struct net_device *dev, | 780 | typedef u16 (*select_queue_fallback_t)(struct net_device *dev, |
| 779 | struct sk_buff *skb); | 781 | struct sk_buff *skb); |
| 780 | 782 | ||
| 783 | /* These structures hold the attributes of qdisc and classifiers | ||
| 784 | * that are being passed to the netdevice through the setup_tc op. | ||
| 785 | */ | ||
| 786 | enum { | ||
| 787 | TC_SETUP_MQPRIO, | ||
| 788 | TC_SETUP_CLSU32, | ||
| 789 | TC_SETUP_CLSFLOWER, | ||
| 790 | }; | ||
| 791 | |||
| 792 | struct tc_cls_u32_offload; | ||
| 793 | |||
| 794 | struct tc_to_netdev { | ||
| 795 | unsigned int type; | ||
| 796 | union { | ||
| 797 | u8 tc; | ||
| 798 | struct tc_cls_u32_offload *cls_u32; | ||
| 799 | struct tc_cls_flower_offload *cls_flower; | ||
| 800 | }; | ||
| 801 | }; | ||
| 802 | |||
| 803 | |||
| 781 | /* | 804 | /* |
| 782 | * This structure defines the management hooks for network devices. | 805 | * This structure defines the management hooks for network devices. |
| 783 | * The following hooks can be defined; unless noted otherwise, they are | 806 | * The following hooks can be defined; unless noted otherwise, they are |
| @@ -1073,6 +1096,12 @@ typedef u16 (*select_queue_fallback_t)(struct net_device *dev, | |||
| 1073 | * This function is used to get egress tunnel information for given skb. | 1096 | * This function is used to get egress tunnel information for given skb. |
| 1074 | * This is useful for retrieving outer tunnel header parameters while | 1097 | * This is useful for retrieving outer tunnel header parameters while |
| 1075 | * sampling packet. | 1098 | * sampling packet. |
| 1099 | * void (*ndo_set_rx_headroom)(struct net_device *dev, int needed_headroom); | ||
| 1100 | * This function is used to specify the headroom that the skb must | ||
| 1101 | * consider when allocation skb during packet reception. Setting | ||
| 1102 | * appropriate rx headroom value allows avoiding skb head copy on | ||
| 1103 | * forward. Setting a negative value reset the rx headroom to the | ||
| 1104 | * default value. | ||
| 1076 | * | 1105 | * |
| 1077 | */ | 1106 | */ |
| 1078 | struct net_device_ops { | 1107 | struct net_device_ops { |
| @@ -1150,7 +1179,10 @@ struct net_device_ops { | |||
| 1150 | int (*ndo_set_vf_rss_query_en)( | 1179 | int (*ndo_set_vf_rss_query_en)( |
| 1151 | struct net_device *dev, | 1180 | struct net_device *dev, |
| 1152 | int vf, bool setting); | 1181 | int vf, bool setting); |
| 1153 | int (*ndo_setup_tc)(struct net_device *dev, u8 tc); | 1182 | int (*ndo_setup_tc)(struct net_device *dev, |
| 1183 | u32 handle, | ||
| 1184 | __be16 protocol, | ||
| 1185 | struct tc_to_netdev *tc); | ||
| 1154 | #if IS_ENABLED(CONFIG_FCOE) | 1186 | #if IS_ENABLED(CONFIG_FCOE) |
| 1155 | int (*ndo_fcoe_enable)(struct net_device *dev); | 1187 | int (*ndo_fcoe_enable)(struct net_device *dev); |
| 1156 | int (*ndo_fcoe_disable)(struct net_device *dev); | 1188 | int (*ndo_fcoe_disable)(struct net_device *dev); |
| @@ -1255,6 +1287,8 @@ struct net_device_ops { | |||
| 1255 | bool proto_down); | 1287 | bool proto_down); |
| 1256 | int (*ndo_fill_metadata_dst)(struct net_device *dev, | 1288 | int (*ndo_fill_metadata_dst)(struct net_device *dev, |
| 1257 | struct sk_buff *skb); | 1289 | struct sk_buff *skb); |
| 1290 | void (*ndo_set_rx_headroom)(struct net_device *dev, | ||
| 1291 | int needed_headroom); | ||
| 1258 | }; | 1292 | }; |
| 1259 | 1293 | ||
| 1260 | /** | 1294 | /** |
| @@ -1291,6 +1325,10 @@ struct net_device_ops { | |||
| 1291 | * @IFF_OPENVSWITCH: device is a Open vSwitch master | 1325 | * @IFF_OPENVSWITCH: device is a Open vSwitch master |
| 1292 | * @IFF_L3MDEV_SLAVE: device is enslaved to an L3 master device | 1326 | * @IFF_L3MDEV_SLAVE: device is enslaved to an L3 master device |
| 1293 | * @IFF_TEAM: device is a team device | 1327 | * @IFF_TEAM: device is a team device |
| 1328 | * @IFF_RXFH_CONFIGURED: device has had Rx Flow indirection table configured | ||
| 1329 | * @IFF_PHONY_HEADROOM: the headroom value is controlled by an external | ||
| 1330 | * entity (i.e. the master device for bridged veth) | ||
| 1331 | * @IFF_MACSEC: device is a MACsec device | ||
| 1294 | */ | 1332 | */ |
| 1295 | enum netdev_priv_flags { | 1333 | enum netdev_priv_flags { |
| 1296 | IFF_802_1Q_VLAN = 1<<0, | 1334 | IFF_802_1Q_VLAN = 1<<0, |
| @@ -1318,6 +1356,9 @@ enum netdev_priv_flags { | |||
| 1318 | IFF_OPENVSWITCH = 1<<22, | 1356 | IFF_OPENVSWITCH = 1<<22, |
| 1319 | IFF_L3MDEV_SLAVE = 1<<23, | 1357 | IFF_L3MDEV_SLAVE = 1<<23, |
| 1320 | IFF_TEAM = 1<<24, | 1358 | IFF_TEAM = 1<<24, |
| 1359 | IFF_RXFH_CONFIGURED = 1<<25, | ||
| 1360 | IFF_PHONY_HEADROOM = 1<<26, | ||
| 1361 | IFF_MACSEC = 1<<27, | ||
| 1321 | }; | 1362 | }; |
| 1322 | 1363 | ||
| 1323 | #define IFF_802_1Q_VLAN IFF_802_1Q_VLAN | 1364 | #define IFF_802_1Q_VLAN IFF_802_1Q_VLAN |
| @@ -1345,6 +1386,8 @@ enum netdev_priv_flags { | |||
| 1345 | #define IFF_OPENVSWITCH IFF_OPENVSWITCH | 1386 | #define IFF_OPENVSWITCH IFF_OPENVSWITCH |
| 1346 | #define IFF_L3MDEV_SLAVE IFF_L3MDEV_SLAVE | 1387 | #define IFF_L3MDEV_SLAVE IFF_L3MDEV_SLAVE |
| 1347 | #define IFF_TEAM IFF_TEAM | 1388 | #define IFF_TEAM IFF_TEAM |
| 1389 | #define IFF_RXFH_CONFIGURED IFF_RXFH_CONFIGURED | ||
| 1390 | #define IFF_MACSEC IFF_MACSEC | ||
| 1348 | 1391 | ||
| 1349 | /** | 1392 | /** |
| 1350 | * struct net_device - The DEVICE structure. | 1393 | * struct net_device - The DEVICE structure. |
| @@ -1397,6 +1440,8 @@ enum netdev_priv_flags { | |||
| 1397 | * do not use this in drivers | 1440 | * do not use this in drivers |
| 1398 | * @tx_dropped: Dropped packets by core network, | 1441 | * @tx_dropped: Dropped packets by core network, |
| 1399 | * do not use this in drivers | 1442 | * do not use this in drivers |
| 1443 | * @rx_nohandler: nohandler dropped packets by core network on | ||
| 1444 | * inactive devices, do not use this in drivers | ||
| 1400 | * | 1445 | * |
| 1401 | * @wireless_handlers: List of functions to handle Wireless Extensions, | 1446 | * @wireless_handlers: List of functions to handle Wireless Extensions, |
| 1402 | * instead of ioctl, | 1447 | * instead of ioctl, |
| @@ -1420,8 +1465,7 @@ enum netdev_priv_flags { | |||
| 1420 | * @dma: DMA channel | 1465 | * @dma: DMA channel |
| 1421 | * @mtu: Interface MTU value | 1466 | * @mtu: Interface MTU value |
| 1422 | * @type: Interface hardware type | 1467 | * @type: Interface hardware type |
| 1423 | * @hard_header_len: Hardware header length, which means that this is the | 1468 | * @hard_header_len: Maximum hardware header length. |
| 1424 | * minimum size of a packet. | ||
| 1425 | * | 1469 | * |
| 1426 | * @needed_headroom: Extra headroom the hardware may need, but not in all | 1470 | * @needed_headroom: Extra headroom the hardware may need, but not in all |
| 1427 | * cases can this be guaranteed | 1471 | * cases can this be guaranteed |
| @@ -1611,6 +1655,7 @@ struct net_device { | |||
| 1611 | 1655 | ||
| 1612 | atomic_long_t rx_dropped; | 1656 | atomic_long_t rx_dropped; |
| 1613 | atomic_long_t tx_dropped; | 1657 | atomic_long_t tx_dropped; |
| 1658 | atomic_long_t rx_nohandler; | ||
| 1614 | 1659 | ||
| 1615 | #ifdef CONFIG_WIRELESS_EXT | 1660 | #ifdef CONFIG_WIRELESS_EXT |
| 1616 | const struct iw_handler_def * wireless_handlers; | 1661 | const struct iw_handler_def * wireless_handlers; |
| @@ -1908,6 +1953,26 @@ struct netdev_queue *netdev_pick_tx(struct net_device *dev, | |||
| 1908 | struct sk_buff *skb, | 1953 | struct sk_buff *skb, |
| 1909 | void *accel_priv); | 1954 | void *accel_priv); |
| 1910 | 1955 | ||
| 1956 | /* returns the headroom that the master device needs to take in account | ||
| 1957 | * when forwarding to this dev | ||
| 1958 | */ | ||
| 1959 | static inline unsigned netdev_get_fwd_headroom(struct net_device *dev) | ||
| 1960 | { | ||
| 1961 | return dev->priv_flags & IFF_PHONY_HEADROOM ? 0 : dev->needed_headroom; | ||
| 1962 | } | ||
| 1963 | |||
| 1964 | static inline void netdev_set_rx_headroom(struct net_device *dev, int new_hr) | ||
| 1965 | { | ||
| 1966 | if (dev->netdev_ops->ndo_set_rx_headroom) | ||
| 1967 | dev->netdev_ops->ndo_set_rx_headroom(dev, new_hr); | ||
| 1968 | } | ||
| 1969 | |||
| 1970 | /* set the device rx headroom to the dev's default */ | ||
| 1971 | static inline void netdev_reset_rx_headroom(struct net_device *dev) | ||
| 1972 | { | ||
| 1973 | netdev_set_rx_headroom(dev, -1); | ||
| 1974 | } | ||
| 1975 | |||
| 1911 | /* | 1976 | /* |
| 1912 | * Net namespace inlines | 1977 | * Net namespace inlines |
| 1913 | */ | 1978 | */ |
| @@ -2627,6 +2692,24 @@ static inline int dev_parse_header(const struct sk_buff *skb, | |||
| 2627 | return dev->header_ops->parse(skb, haddr); | 2692 | return dev->header_ops->parse(skb, haddr); |
| 2628 | } | 2693 | } |
| 2629 | 2694 | ||
| 2695 | /* ll_header must have at least hard_header_len allocated */ | ||
| 2696 | static inline bool dev_validate_header(const struct net_device *dev, | ||
| 2697 | char *ll_header, int len) | ||
| 2698 | { | ||
| 2699 | if (likely(len >= dev->hard_header_len)) | ||
| 2700 | return true; | ||
| 2701 | |||
| 2702 | if (capable(CAP_SYS_RAWIO)) { | ||
| 2703 | memset(ll_header + len, 0, dev->hard_header_len - len); | ||
| 2704 | return true; | ||
| 2705 | } | ||
| 2706 | |||
| 2707 | if (dev->header_ops && dev->header_ops->validate) | ||
| 2708 | return dev->header_ops->validate(ll_header, len); | ||
| 2709 | |||
| 2710 | return false; | ||
| 2711 | } | ||
| 2712 | |||
| 2630 | typedef int gifconf_func_t(struct net_device * dev, char __user * bufptr, int len); | 2713 | typedef int gifconf_func_t(struct net_device * dev, char __user * bufptr, int len); |
| 2631 | int register_gifconf(unsigned int family, gifconf_func_t *gifconf); | 2714 | int register_gifconf(unsigned int family, gifconf_func_t *gifconf); |
| 2632 | static inline int unregister_gifconf(unsigned int family) | 2715 | static inline int unregister_gifconf(unsigned int family) |
| @@ -3741,7 +3824,7 @@ void netdev_lower_state_changed(struct net_device *lower_dev, | |||
| 3741 | 3824 | ||
| 3742 | /* RSS keys are 40 or 52 bytes long */ | 3825 | /* RSS keys are 40 or 52 bytes long */ |
| 3743 | #define NETDEV_RSS_KEY_LEN 52 | 3826 | #define NETDEV_RSS_KEY_LEN 52 |
| 3744 | extern u8 netdev_rss_key[NETDEV_RSS_KEY_LEN]; | 3827 | extern u8 netdev_rss_key[NETDEV_RSS_KEY_LEN] __read_mostly; |
| 3745 | void netdev_rss_key_fill(void *buffer, size_t len); | 3828 | void netdev_rss_key_fill(void *buffer, size_t len); |
| 3746 | 3829 | ||
| 3747 | int dev_get_nest_level(struct net_device *dev, | 3830 | int dev_get_nest_level(struct net_device *dev, |
| @@ -3965,6 +4048,11 @@ static inline void skb_gso_error_unwind(struct sk_buff *skb, __be16 protocol, | |||
| 3965 | skb->mac_len = mac_len; | 4048 | skb->mac_len = mac_len; |
| 3966 | } | 4049 | } |
| 3967 | 4050 | ||
| 4051 | static inline bool netif_is_macsec(const struct net_device *dev) | ||
| 4052 | { | ||
| 4053 | return dev->priv_flags & IFF_MACSEC; | ||
| 4054 | } | ||
| 4055 | |||
| 3968 | static inline bool netif_is_macvlan(const struct net_device *dev) | 4056 | static inline bool netif_is_macvlan(const struct net_device *dev) |
| 3969 | { | 4057 | { |
| 3970 | return dev->priv_flags & IFF_MACVLAN; | 4058 | return dev->priv_flags & IFF_MACVLAN; |
| @@ -4045,6 +4133,11 @@ static inline bool netif_is_lag_port(const struct net_device *dev) | |||
| 4045 | return netif_is_bond_slave(dev) || netif_is_team_port(dev); | 4133 | return netif_is_bond_slave(dev) || netif_is_team_port(dev); |
| 4046 | } | 4134 | } |
| 4047 | 4135 | ||
| 4136 | static inline bool netif_is_rxfh_configured(const struct net_device *dev) | ||
| 4137 | { | ||
| 4138 | return dev->priv_flags & IFF_RXFH_CONFIGURED; | ||
| 4139 | } | ||
| 4140 | |||
| 4048 | /* This device needs to keep skb dst for qdisc enqueue or ndo_start_xmit() */ | 4141 | /* This device needs to keep skb dst for qdisc enqueue or ndo_start_xmit() */ |
| 4049 | static inline void netif_keep_dst(struct net_device *dev) | 4142 | static inline void netif_keep_dst(struct net_device *dev) |
| 4050 | { | 4143 | { |
diff --git a/include/linux/netfilter.h b/include/linux/netfilter.h index 0ad556726181..9230f9aee896 100644 --- a/include/linux/netfilter.h +++ b/include/linux/netfilter.h | |||
| @@ -141,22 +141,6 @@ void nf_unregister_sockopt(struct nf_sockopt_ops *reg); | |||
| 141 | 141 | ||
| 142 | #ifdef HAVE_JUMP_LABEL | 142 | #ifdef HAVE_JUMP_LABEL |
| 143 | extern struct static_key nf_hooks_needed[NFPROTO_NUMPROTO][NF_MAX_HOOKS]; | 143 | extern struct static_key nf_hooks_needed[NFPROTO_NUMPROTO][NF_MAX_HOOKS]; |
| 144 | |||
| 145 | static inline bool nf_hook_list_active(struct list_head *hook_list, | ||
| 146 | u_int8_t pf, unsigned int hook) | ||
| 147 | { | ||
| 148 | if (__builtin_constant_p(pf) && | ||
| 149 | __builtin_constant_p(hook)) | ||
| 150 | return static_key_false(&nf_hooks_needed[pf][hook]); | ||
| 151 | |||
| 152 | return !list_empty(hook_list); | ||
| 153 | } | ||
| 154 | #else | ||
| 155 | static inline bool nf_hook_list_active(struct list_head *hook_list, | ||
| 156 | u_int8_t pf, unsigned int hook) | ||
| 157 | { | ||
| 158 | return !list_empty(hook_list); | ||
| 159 | } | ||
| 160 | #endif | 144 | #endif |
| 161 | 145 | ||
| 162 | int nf_hook_slow(struct sk_buff *skb, struct nf_hook_state *state); | 146 | int nf_hook_slow(struct sk_buff *skb, struct nf_hook_state *state); |
| @@ -177,9 +161,18 @@ static inline int nf_hook_thresh(u_int8_t pf, unsigned int hook, | |||
| 177 | int (*okfn)(struct net *, struct sock *, struct sk_buff *), | 161 | int (*okfn)(struct net *, struct sock *, struct sk_buff *), |
| 178 | int thresh) | 162 | int thresh) |
| 179 | { | 163 | { |
| 180 | struct list_head *hook_list = &net->nf.hooks[pf][hook]; | 164 | struct list_head *hook_list; |
| 165 | |||
| 166 | #ifdef HAVE_JUMP_LABEL | ||
| 167 | if (__builtin_constant_p(pf) && | ||
| 168 | __builtin_constant_p(hook) && | ||
| 169 | !static_key_false(&nf_hooks_needed[pf][hook])) | ||
| 170 | return 1; | ||
| 171 | #endif | ||
| 172 | |||
| 173 | hook_list = &net->nf.hooks[pf][hook]; | ||
| 181 | 174 | ||
| 182 | if (nf_hook_list_active(hook_list, pf, hook)) { | 175 | if (!list_empty(hook_list)) { |
| 183 | struct nf_hook_state state; | 176 | struct nf_hook_state state; |
| 184 | 177 | ||
| 185 | nf_hook_state_init(&state, hook_list, hook, thresh, | 178 | nf_hook_state_init(&state, hook_list, hook, thresh, |
diff --git a/include/linux/netfilter/nfnetlink.h b/include/linux/netfilter/nfnetlink.h index ba0d9789eb6e..1d82dd5e9a08 100644 --- a/include/linux/netfilter/nfnetlink.h +++ b/include/linux/netfilter/nfnetlink.h | |||
| @@ -34,8 +34,6 @@ int nfnetlink_subsys_register(const struct nfnetlink_subsystem *n); | |||
| 34 | int nfnetlink_subsys_unregister(const struct nfnetlink_subsystem *n); | 34 | int nfnetlink_subsys_unregister(const struct nfnetlink_subsystem *n); |
| 35 | 35 | ||
| 36 | int nfnetlink_has_listeners(struct net *net, unsigned int group); | 36 | int nfnetlink_has_listeners(struct net *net, unsigned int group); |
| 37 | struct sk_buff *nfnetlink_alloc_skb(struct net *net, unsigned int size, | ||
| 38 | u32 dst_portid, gfp_t gfp_mask); | ||
| 39 | int nfnetlink_send(struct sk_buff *skb, struct net *net, u32 portid, | 37 | int nfnetlink_send(struct sk_buff *skb, struct net *net, u32 portid, |
| 40 | unsigned int group, int echo, gfp_t flags); | 38 | unsigned int group, int echo, gfp_t flags); |
| 41 | int nfnetlink_set_err(struct net *net, u32 portid, u32 group, int error); | 39 | int nfnetlink_set_err(struct net *net, u32 portid, u32 group, int error); |
diff --git a/include/linux/netfilter/x_tables.h b/include/linux/netfilter/x_tables.h index c5577410c25d..80a305b85323 100644 --- a/include/linux/netfilter/x_tables.h +++ b/include/linux/netfilter/x_tables.h | |||
| @@ -200,6 +200,9 @@ struct xt_table { | |||
| 200 | u_int8_t af; /* address/protocol family */ | 200 | u_int8_t af; /* address/protocol family */ |
| 201 | int priority; /* hook order */ | 201 | int priority; /* hook order */ |
| 202 | 202 | ||
| 203 | /* called when table is needed in the given netns */ | ||
| 204 | int (*table_init)(struct net *net); | ||
| 205 | |||
| 203 | /* A unique name... */ | 206 | /* A unique name... */ |
| 204 | const char name[XT_TABLE_MAXNAMELEN]; | 207 | const char name[XT_TABLE_MAXNAMELEN]; |
| 205 | }; | 208 | }; |
| @@ -408,8 +411,7 @@ xt_get_per_cpu_counter(struct xt_counters *cnt, unsigned int cpu) | |||
| 408 | return cnt; | 411 | return cnt; |
| 409 | } | 412 | } |
| 410 | 413 | ||
| 411 | struct nf_hook_ops *xt_hook_link(const struct xt_table *, nf_hookfn *); | 414 | struct nf_hook_ops *xt_hook_ops_alloc(const struct xt_table *, nf_hookfn *); |
| 412 | void xt_hook_unlink(const struct xt_table *, struct nf_hook_ops *); | ||
| 413 | 415 | ||
| 414 | #ifdef CONFIG_COMPAT | 416 | #ifdef CONFIG_COMPAT |
| 415 | #include <net/compat.h> | 417 | #include <net/compat.h> |
diff --git a/include/linux/netfilter_arp/arp_tables.h b/include/linux/netfilter_arp/arp_tables.h index 6f074db2f23d..029b95e8924e 100644 --- a/include/linux/netfilter_arp/arp_tables.h +++ b/include/linux/netfilter_arp/arp_tables.h | |||
| @@ -48,10 +48,11 @@ struct arpt_error { | |||
| 48 | } | 48 | } |
| 49 | 49 | ||
| 50 | extern void *arpt_alloc_initial_table(const struct xt_table *); | 50 | extern void *arpt_alloc_initial_table(const struct xt_table *); |
| 51 | extern struct xt_table *arpt_register_table(struct net *net, | 51 | int arpt_register_table(struct net *net, const struct xt_table *table, |
| 52 | const struct xt_table *table, | 52 | const struct arpt_replace *repl, |
| 53 | const struct arpt_replace *repl); | 53 | const struct nf_hook_ops *ops, struct xt_table **res); |
| 54 | extern void arpt_unregister_table(struct xt_table *table); | 54 | void arpt_unregister_table(struct net *net, struct xt_table *table, |
| 55 | const struct nf_hook_ops *ops); | ||
| 55 | extern unsigned int arpt_do_table(struct sk_buff *skb, | 56 | extern unsigned int arpt_do_table(struct sk_buff *skb, |
| 56 | const struct nf_hook_state *state, | 57 | const struct nf_hook_state *state, |
| 57 | struct xt_table *table); | 58 | struct xt_table *table); |
diff --git a/include/linux/netfilter_ipv4/ip_tables.h b/include/linux/netfilter_ipv4/ip_tables.h index aa598f942c01..7bfc5893ec31 100644 --- a/include/linux/netfilter_ipv4/ip_tables.h +++ b/include/linux/netfilter_ipv4/ip_tables.h | |||
| @@ -24,10 +24,11 @@ | |||
| 24 | 24 | ||
| 25 | extern void ipt_init(void) __init; | 25 | extern void ipt_init(void) __init; |
| 26 | 26 | ||
| 27 | extern struct xt_table *ipt_register_table(struct net *net, | 27 | int ipt_register_table(struct net *net, const struct xt_table *table, |
| 28 | const struct xt_table *table, | 28 | const struct ipt_replace *repl, |
| 29 | const struct ipt_replace *repl); | 29 | const struct nf_hook_ops *ops, struct xt_table **res); |
| 30 | extern void ipt_unregister_table(struct net *net, struct xt_table *table); | 30 | void ipt_unregister_table(struct net *net, struct xt_table *table, |
| 31 | const struct nf_hook_ops *ops); | ||
| 31 | 32 | ||
| 32 | /* Standard entry. */ | 33 | /* Standard entry. */ |
| 33 | struct ipt_standard { | 34 | struct ipt_standard { |
diff --git a/include/linux/netfilter_ipv6/ip6_tables.h b/include/linux/netfilter_ipv6/ip6_tables.h index 0f76e5c674f9..b21c392d6012 100644 --- a/include/linux/netfilter_ipv6/ip6_tables.h +++ b/include/linux/netfilter_ipv6/ip6_tables.h | |||
| @@ -25,10 +25,11 @@ | |||
| 25 | extern void ip6t_init(void) __init; | 25 | extern void ip6t_init(void) __init; |
| 26 | 26 | ||
| 27 | extern void *ip6t_alloc_initial_table(const struct xt_table *); | 27 | extern void *ip6t_alloc_initial_table(const struct xt_table *); |
| 28 | extern struct xt_table *ip6t_register_table(struct net *net, | 28 | int ip6t_register_table(struct net *net, const struct xt_table *table, |
| 29 | const struct xt_table *table, | 29 | const struct ip6t_replace *repl, |
| 30 | const struct ip6t_replace *repl); | 30 | const struct nf_hook_ops *ops, struct xt_table **res); |
| 31 | extern void ip6t_unregister_table(struct net *net, struct xt_table *table); | 31 | void ip6t_unregister_table(struct net *net, struct xt_table *table, |
| 32 | const struct nf_hook_ops *ops); | ||
| 32 | extern unsigned int ip6t_do_table(struct sk_buff *skb, | 33 | extern unsigned int ip6t_do_table(struct sk_buff *skb, |
| 33 | const struct nf_hook_state *state, | 34 | const struct nf_hook_state *state, |
| 34 | struct xt_table *table); | 35 | struct xt_table *table); |
diff --git a/include/linux/netlink.h b/include/linux/netlink.h index 0b41959aab9f..da14ab61f363 100644 --- a/include/linux/netlink.h +++ b/include/linux/netlink.h | |||
| @@ -69,16 +69,6 @@ extern void __netlink_clear_multicast_users(struct sock *sk, unsigned int group) | |||
| 69 | extern void netlink_ack(struct sk_buff *in_skb, struct nlmsghdr *nlh, int err); | 69 | extern void netlink_ack(struct sk_buff *in_skb, struct nlmsghdr *nlh, int err); |
| 70 | extern int netlink_has_listeners(struct sock *sk, unsigned int group); | 70 | extern int netlink_has_listeners(struct sock *sk, unsigned int group); |
| 71 | 71 | ||
| 72 | extern struct sk_buff *__netlink_alloc_skb(struct sock *ssk, unsigned int size, | ||
| 73 | unsigned int ldiff, u32 dst_portid, | ||
| 74 | gfp_t gfp_mask); | ||
| 75 | static inline struct sk_buff * | ||
| 76 | netlink_alloc_skb(struct sock *ssk, unsigned int size, u32 dst_portid, | ||
| 77 | gfp_t gfp_mask) | ||
| 78 | { | ||
| 79 | return __netlink_alloc_skb(ssk, size, 0, dst_portid, gfp_mask); | ||
| 80 | } | ||
| 81 | |||
| 82 | extern int netlink_unicast(struct sock *ssk, struct sk_buff *skb, __u32 portid, int nonblock); | 72 | extern int netlink_unicast(struct sock *ssk, struct sk_buff *skb, __u32 portid, int nonblock); |
| 83 | extern int netlink_broadcast(struct sock *ssk, struct sk_buff *skb, __u32 portid, | 73 | extern int netlink_broadcast(struct sock *ssk, struct sk_buff *skb, __u32 portid, |
| 84 | __u32 group, gfp_t allocation); | 74 | __u32 group, gfp_t allocation); |
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 79ec7bbf0155..78fda2a69ab8 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h | |||
| @@ -966,11 +966,20 @@ DECLARE_PER_CPU(struct perf_callchain_entry, perf_callchain_entry); | |||
| 966 | 966 | ||
| 967 | extern void perf_callchain_user(struct perf_callchain_entry *entry, struct pt_regs *regs); | 967 | extern void perf_callchain_user(struct perf_callchain_entry *entry, struct pt_regs *regs); |
| 968 | extern void perf_callchain_kernel(struct perf_callchain_entry *entry, struct pt_regs *regs); | 968 | extern void perf_callchain_kernel(struct perf_callchain_entry *entry, struct pt_regs *regs); |
| 969 | extern struct perf_callchain_entry * | ||
| 970 | get_perf_callchain(struct pt_regs *regs, u32 init_nr, bool kernel, bool user, | ||
| 971 | bool crosstask, bool add_mark); | ||
| 972 | extern int get_callchain_buffers(void); | ||
| 973 | extern void put_callchain_buffers(void); | ||
| 969 | 974 | ||
| 970 | static inline void perf_callchain_store(struct perf_callchain_entry *entry, u64 ip) | 975 | static inline int perf_callchain_store(struct perf_callchain_entry *entry, u64 ip) |
| 971 | { | 976 | { |
| 972 | if (entry->nr < PERF_MAX_STACK_DEPTH) | 977 | if (entry->nr < PERF_MAX_STACK_DEPTH) { |
| 973 | entry->ip[entry->nr++] = ip; | 978 | entry->ip[entry->nr++] = ip; |
| 979 | return 0; | ||
| 980 | } else { | ||
| 981 | return -1; /* no more room, stop walking the stack */ | ||
| 982 | } | ||
| 974 | } | 983 | } |
| 975 | 984 | ||
| 976 | extern int sysctl_perf_event_paranoid; | 985 | extern int sysctl_perf_event_paranoid; |
diff --git a/include/linux/phy.h b/include/linux/phy.h index d6f3641e7933..2abd7918f64f 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h | |||
| @@ -327,8 +327,6 @@ struct phy_c45_device_ids { | |||
| 327 | /* phy_device: An instance of a PHY | 327 | /* phy_device: An instance of a PHY |
| 328 | * | 328 | * |
| 329 | * drv: Pointer to the driver for this PHY instance | 329 | * drv: Pointer to the driver for this PHY instance |
| 330 | * bus: Pointer to the bus this PHY is on | ||
| 331 | * dev: driver model device structure for this PHY | ||
| 332 | * phy_id: UID for this device found during discovery | 330 | * phy_id: UID for this device found during discovery |
| 333 | * c45_ids: 802.3-c45 Device Identifers if is_c45. | 331 | * c45_ids: 802.3-c45 Device Identifers if is_c45. |
| 334 | * is_c45: Set to true if this phy uses clause 45 addressing. | 332 | * is_c45: Set to true if this phy uses clause 45 addressing. |
| @@ -338,7 +336,6 @@ struct phy_c45_device_ids { | |||
| 338 | * suspended: Set to true if this phy has been suspended successfully. | 336 | * suspended: Set to true if this phy has been suspended successfully. |
| 339 | * state: state of the PHY for management purposes | 337 | * state: state of the PHY for management purposes |
| 340 | * dev_flags: Device-specific flags used by the PHY driver. | 338 | * dev_flags: Device-specific flags used by the PHY driver. |
| 341 | * addr: Bus address of PHY | ||
| 342 | * link_timeout: The number of timer firings to wait before the | 339 | * link_timeout: The number of timer firings to wait before the |
| 343 | * giving up on the current attempt at acquiring a link | 340 | * giving up on the current attempt at acquiring a link |
| 344 | * irq: IRQ number of the PHY's interrupt (-1 if none) | 341 | * irq: IRQ number of the PHY's interrupt (-1 if none) |
diff --git a/include/linux/phy_fixed.h b/include/linux/phy_fixed.h index 2400d2ea4f34..1d41ec44e39d 100644 --- a/include/linux/phy_fixed.h +++ b/include/linux/phy_fixed.h | |||
| @@ -19,7 +19,7 @@ extern struct phy_device *fixed_phy_register(unsigned int irq, | |||
| 19 | struct fixed_phy_status *status, | 19 | struct fixed_phy_status *status, |
| 20 | int link_gpio, | 20 | int link_gpio, |
| 21 | struct device_node *np); | 21 | struct device_node *np); |
| 22 | extern void fixed_phy_del(int phy_addr); | 22 | extern void fixed_phy_unregister(struct phy_device *phydev); |
| 23 | extern int fixed_phy_set_link_update(struct phy_device *phydev, | 23 | extern int fixed_phy_set_link_update(struct phy_device *phydev, |
| 24 | int (*link_update)(struct net_device *, | 24 | int (*link_update)(struct net_device *, |
| 25 | struct fixed_phy_status *)); | 25 | struct fixed_phy_status *)); |
| @@ -40,9 +40,8 @@ static inline struct phy_device *fixed_phy_register(unsigned int irq, | |||
| 40 | { | 40 | { |
| 41 | return ERR_PTR(-ENODEV); | 41 | return ERR_PTR(-ENODEV); |
| 42 | } | 42 | } |
| 43 | static inline int fixed_phy_del(int phy_addr) | 43 | static inline void fixed_phy_unregister(struct phy_device *phydev) |
| 44 | { | 44 | { |
| 45 | return -ENODEV; | ||
| 46 | } | 45 | } |
| 47 | static inline int fixed_phy_set_link_update(struct phy_device *phydev, | 46 | static inline int fixed_phy_set_link_update(struct phy_device *phydev, |
| 48 | int (*link_update)(struct net_device *, | 47 | int (*link_update)(struct net_device *, |
diff --git a/include/linux/platform_data/brcmfmac-sdio.h b/include/linux/platform_data/brcmfmac-sdio.h deleted file mode 100644 index e75dcbf2b230..000000000000 --- a/include/linux/platform_data/brcmfmac-sdio.h +++ /dev/null | |||
| @@ -1,135 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (c) 2013 Broadcom Corporation | ||
| 3 | * | ||
| 4 | * Permission to use, copy, modify, and/or distribute this software for any | ||
| 5 | * purpose with or without fee is hereby granted, provided that the above | ||
| 6 | * copyright notice and this permission notice appear in all copies. | ||
| 7 | * | ||
| 8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
| 9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
| 10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY | ||
| 11 | * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
| 12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION | ||
| 13 | * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN | ||
| 14 | * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
| 15 | */ | ||
| 16 | |||
| 17 | #ifndef _LINUX_BRCMFMAC_PLATFORM_H | ||
| 18 | #define _LINUX_BRCMFMAC_PLATFORM_H | ||
| 19 | |||
| 20 | /* | ||
| 21 | * Platform specific driver functions and data. Through the platform specific | ||
| 22 | * device data functions can be provided to help the brcmfmac driver to | ||
| 23 | * operate with the device in combination with the used platform. | ||
| 24 | * | ||
| 25 | * Use the platform data in the following (similar) way: | ||
| 26 | * | ||
| 27 | * | ||
| 28 | #include <brcmfmac_platform.h> | ||
| 29 | |||
| 30 | |||
| 31 | static void brcmfmac_power_on(void) | ||
| 32 | { | ||
| 33 | } | ||
| 34 | |||
| 35 | static void brcmfmac_power_off(void) | ||
| 36 | { | ||
| 37 | } | ||
| 38 | |||
| 39 | static void brcmfmac_reset(void) | ||
| 40 | { | ||
| 41 | } | ||
| 42 | |||
| 43 | static struct brcmfmac_sdio_platform_data brcmfmac_sdio_pdata = { | ||
| 44 | .power_on = brcmfmac_power_on, | ||
| 45 | .power_off = brcmfmac_power_off, | ||
| 46 | .reset = brcmfmac_reset | ||
| 47 | }; | ||
| 48 | |||
| 49 | static struct platform_device brcmfmac_device = { | ||
| 50 | .name = BRCMFMAC_SDIO_PDATA_NAME, | ||
| 51 | .id = PLATFORM_DEVID_NONE, | ||
| 52 | .dev.platform_data = &brcmfmac_sdio_pdata | ||
| 53 | }; | ||
| 54 | |||
| 55 | void __init brcmfmac_init_pdata(void) | ||
| 56 | { | ||
| 57 | brcmfmac_sdio_pdata.oob_irq_supported = true; | ||
| 58 | brcmfmac_sdio_pdata.oob_irq_nr = gpio_to_irq(GPIO_BRCMF_SDIO_OOB); | ||
| 59 | brcmfmac_sdio_pdata.oob_irq_flags = IORESOURCE_IRQ | | ||
| 60 | IORESOURCE_IRQ_HIGHLEVEL; | ||
| 61 | platform_device_register(&brcmfmac_device); | ||
| 62 | } | ||
| 63 | * | ||
| 64 | * | ||
| 65 | * Note: the brcmfmac can be loaded as module or be statically built-in into | ||
| 66 | * the kernel. If built-in then do note that it uses module_init (and | ||
| 67 | * module_exit) routines which equal device_initcall. So if you intend to | ||
| 68 | * create a module with the platform specific data for the brcmfmac and have | ||
| 69 | * it built-in to the kernel then use a higher initcall then device_initcall | ||
| 70 | * (see init.h). If this is not done then brcmfmac will load without problems | ||
| 71 | * but will not pickup the platform data. | ||
| 72 | * | ||
| 73 | * When the driver does not "detect" platform driver data then it will continue | ||
| 74 | * without reporting anything and just assume there is no data needed. Which is | ||
| 75 | * probably true for most platforms. | ||
| 76 | * | ||
| 77 | * Explanation of the platform_data fields: | ||
| 78 | * | ||
| 79 | * drive_strength: is the preferred drive_strength to be used for the SDIO | ||
| 80 | * pins. If 0 then a default value will be used. This is the target drive | ||
| 81 | * strength, the exact drive strength which will be used depends on the | ||
| 82 | * capabilities of the device. | ||
| 83 | * | ||
| 84 | * oob_irq_supported: does the board have support for OOB interrupts. SDIO | ||
| 85 | * in-band interrupts are relatively slow and for having less overhead on | ||
| 86 | * interrupt processing an out of band interrupt can be used. If the HW | ||
| 87 | * supports this then enable this by setting this field to true and configure | ||
| 88 | * the oob related fields. | ||
| 89 | * | ||
| 90 | * oob_irq_nr, oob_irq_flags: the OOB interrupt information. The values are | ||
| 91 | * used for registering the irq using request_irq function. | ||
| 92 | * | ||
| 93 | * broken_sg_support: flag for broken sg list support of SDIO host controller. | ||
| 94 | * Set this to true if the SDIO host controller has higher align requirement | ||
| 95 | * than 32 bytes for each scatterlist item. | ||
| 96 | * | ||
| 97 | * sd_head_align: alignment requirement for start of data buffer | ||
| 98 | * | ||
| 99 | * sd_sgentry_align: length alignment requirement for each sg entry | ||
| 100 | * | ||
| 101 | * power_on: This function is called by the brcmfmac when the module gets | ||
| 102 | * loaded. This can be particularly useful for low power devices. The platform | ||
| 103 | * spcific routine may for example decide to power up the complete device. | ||
| 104 | * If there is no use-case for this function then provide NULL. | ||
| 105 | * | ||
| 106 | * power_off: This function is called by the brcmfmac when the module gets | ||
| 107 | * unloaded. At this point the device can be powered down or otherwise be reset. | ||
| 108 | * So if an actual power_off is not supported but reset is then reset the device | ||
| 109 | * when this function gets called. This can be particularly useful for low power | ||
| 110 | * devices. If there is no use-case for this function (either power-down or | ||
| 111 | * reset) then provide NULL. | ||
| 112 | * | ||
| 113 | * reset: This function can get called if the device communication broke down. | ||
| 114 | * This functionality is particularly useful in case of SDIO type devices. It is | ||
| 115 | * possible to reset a dongle via sdio data interface, but it requires that | ||
| 116 | * this is fully functional. This function is chip/module specific and this | ||
| 117 | * function should return only after the complete reset has completed. | ||
| 118 | */ | ||
| 119 | |||
| 120 | #define BRCMFMAC_SDIO_PDATA_NAME "brcmfmac_sdio" | ||
| 121 | |||
| 122 | struct brcmfmac_sdio_platform_data { | ||
| 123 | unsigned int drive_strength; | ||
| 124 | bool oob_irq_supported; | ||
| 125 | unsigned int oob_irq_nr; | ||
| 126 | unsigned long oob_irq_flags; | ||
| 127 | bool broken_sg_support; | ||
| 128 | unsigned short sd_head_align; | ||
| 129 | unsigned short sd_sgentry_align; | ||
| 130 | void (*power_on)(void); | ||
| 131 | void (*power_off)(void); | ||
| 132 | void (*reset)(void); | ||
| 133 | }; | ||
| 134 | |||
| 135 | #endif /* _LINUX_BRCMFMAC_PLATFORM_H */ | ||
diff --git a/include/linux/platform_data/brcmfmac.h b/include/linux/platform_data/brcmfmac.h new file mode 100644 index 000000000000..1d30bf278231 --- /dev/null +++ b/include/linux/platform_data/brcmfmac.h | |||
| @@ -0,0 +1,185 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (c) 201 Broadcom Corporation | ||
| 3 | * | ||
| 4 | * Permission to use, copy, modify, and/or distribute this software for any | ||
| 5 | * purpose with or without fee is hereby granted, provided that the above | ||
| 6 | * copyright notice and this permission notice appear in all copies. | ||
| 7 | * | ||
| 8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
| 9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
| 10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY | ||
| 11 | * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
| 12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION | ||
| 13 | * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN | ||
| 14 | * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
| 15 | */ | ||
| 16 | |||
| 17 | #ifndef _LINUX_BRCMFMAC_PLATFORM_H | ||
| 18 | #define _LINUX_BRCMFMAC_PLATFORM_H | ||
| 19 | |||
| 20 | |||
| 21 | #define BRCMFMAC_PDATA_NAME "brcmfmac" | ||
| 22 | |||
| 23 | #define BRCMFMAC_COUNTRY_BUF_SZ 4 | ||
| 24 | |||
| 25 | |||
| 26 | /* | ||
| 27 | * Platform specific driver functions and data. Through the platform specific | ||
| 28 | * device data functions and data can be provided to help the brcmfmac driver to | ||
| 29 | * operate with the device in combination with the used platform. | ||
| 30 | */ | ||
| 31 | |||
| 32 | |||
| 33 | /** | ||
| 34 | * Note: the brcmfmac can be loaded as module or be statically built-in into | ||
| 35 | * the kernel. If built-in then do note that it uses module_init (and | ||
| 36 | * module_exit) routines which equal device_initcall. So if you intend to | ||
| 37 | * create a module with the platform specific data for the brcmfmac and have | ||
| 38 | * it built-in to the kernel then use a higher initcall then device_initcall | ||
| 39 | * (see init.h). If this is not done then brcmfmac will load without problems | ||
| 40 | * but will not pickup the platform data. | ||
| 41 | * | ||
| 42 | * When the driver does not "detect" platform driver data then it will continue | ||
| 43 | * without reporting anything and just assume there is no data needed. Which is | ||
| 44 | * probably true for most platforms. | ||
| 45 | */ | ||
| 46 | |||
| 47 | /** | ||
| 48 | * enum brcmf_bus_type - Bus type identifier. Currently SDIO, USB and PCIE are | ||
| 49 | * supported. | ||
| 50 | */ | ||
| 51 | enum brcmf_bus_type { | ||
| 52 | BRCMF_BUSTYPE_SDIO, | ||
| 53 | BRCMF_BUSTYPE_USB, | ||
| 54 | BRCMF_BUSTYPE_PCIE | ||
| 55 | }; | ||
| 56 | |||
| 57 | |||
| 58 | /** | ||
| 59 | * struct brcmfmac_sdio_pd - SDIO Device specific platform data. | ||
| 60 | * | ||
| 61 | * @txglomsz: SDIO txglom size. Use 0 if default of driver is to be | ||
| 62 | * used. | ||
| 63 | * @drive_strength: is the preferred drive_strength to be used for the SDIO | ||
| 64 | * pins. If 0 then a default value will be used. This is | ||
| 65 | * the target drive strength, the exact drive strength | ||
| 66 | * which will be used depends on the capabilities of the | ||
| 67 | * device. | ||
| 68 | * @oob_irq_supported: does the board have support for OOB interrupts. SDIO | ||
| 69 | * in-band interrupts are relatively slow and for having | ||
| 70 | * less overhead on interrupt processing an out of band | ||
| 71 | * interrupt can be used. If the HW supports this then | ||
| 72 | * enable this by setting this field to true and configure | ||
| 73 | * the oob related fields. | ||
| 74 | * @oob_irq_nr, | ||
| 75 | * @oob_irq_flags: the OOB interrupt information. The values are used for | ||
| 76 | * registering the irq using request_irq function. | ||
| 77 | * @broken_sg_support: flag for broken sg list support of SDIO host controller. | ||
| 78 | * Set this to true if the SDIO host controller has higher | ||
| 79 | * align requirement than 32 bytes for each scatterlist | ||
| 80 | * item. | ||
| 81 | * @sd_head_align: alignment requirement for start of data buffer. | ||
| 82 | * @sd_sgentry_align: length alignment requirement for each sg entry. | ||
| 83 | * @reset: This function can get called if the device communication | ||
| 84 | * broke down. This functionality is particularly useful in | ||
| 85 | * case of SDIO type devices. It is possible to reset a | ||
| 86 | * dongle via sdio data interface, but it requires that | ||
| 87 | * this is fully functional. This function is chip/module | ||
| 88 | * specific and this function should return only after the | ||
| 89 | * complete reset has completed. | ||
| 90 | */ | ||
| 91 | struct brcmfmac_sdio_pd { | ||
| 92 | int txglomsz; | ||
| 93 | unsigned int drive_strength; | ||
| 94 | bool oob_irq_supported; | ||
| 95 | unsigned int oob_irq_nr; | ||
| 96 | unsigned long oob_irq_flags; | ||
| 97 | bool broken_sg_support; | ||
| 98 | unsigned short sd_head_align; | ||
| 99 | unsigned short sd_sgentry_align; | ||
| 100 | void (*reset)(void); | ||
| 101 | }; | ||
| 102 | |||
| 103 | /** | ||
| 104 | * struct brcmfmac_pd_cc_entry - Struct for translating user space country code | ||
| 105 | * (iso3166) to firmware country code and | ||
| 106 | * revision. | ||
| 107 | * | ||
| 108 | * @iso3166: iso3166 alpha 2 country code string. | ||
| 109 | * @cc: firmware country code string. | ||
| 110 | * @rev: firmware country code revision. | ||
| 111 | */ | ||
| 112 | struct brcmfmac_pd_cc_entry { | ||
| 113 | char iso3166[BRCMFMAC_COUNTRY_BUF_SZ]; | ||
| 114 | char cc[BRCMFMAC_COUNTRY_BUF_SZ]; | ||
| 115 | s32 rev; | ||
| 116 | }; | ||
| 117 | |||
| 118 | /** | ||
| 119 | * struct brcmfmac_pd_cc - Struct for translating country codes as set by user | ||
| 120 | * space to a country code and rev which can be used by | ||
| 121 | * firmware. | ||
| 122 | * | ||
| 123 | * @table_size: number of entries in table (> 0) | ||
| 124 | * @table: array of 1 or more elements with translation information. | ||
| 125 | */ | ||
| 126 | struct brcmfmac_pd_cc { | ||
| 127 | int table_size; | ||
| 128 | struct brcmfmac_pd_cc_entry table[0]; | ||
| 129 | }; | ||
| 130 | |||
| 131 | /** | ||
| 132 | * struct brcmfmac_pd_device - Device specific platform data. (id/rev/bus_type) | ||
| 133 | * is the unique identifier of the device. | ||
| 134 | * | ||
| 135 | * @id: ID of the device for which this data is. In case of SDIO | ||
| 136 | * or PCIE this is the chipid as identified by chip.c In | ||
| 137 | * case of USB this is the chipid as identified by the | ||
| 138 | * device query. | ||
| 139 | * @rev: chip revision, see id. | ||
| 140 | * @bus_type: The type of bus. Some chipid/rev exist for different bus | ||
| 141 | * types. Each bus type has its own set of settings. | ||
| 142 | * @feature_disable: Bitmask of features to disable (override), See feature.c | ||
| 143 | * in brcmfmac for details. | ||
| 144 | * @country_codes: If available, pointer to struct for translating country | ||
| 145 | * codes. | ||
| 146 | * @bus: Bus specific (union) device settings. Currently only | ||
| 147 | * SDIO. | ||
| 148 | */ | ||
| 149 | struct brcmfmac_pd_device { | ||
| 150 | unsigned int id; | ||
| 151 | unsigned int rev; | ||
| 152 | enum brcmf_bus_type bus_type; | ||
| 153 | unsigned int feature_disable; | ||
| 154 | struct brcmfmac_pd_cc *country_codes; | ||
| 155 | union { | ||
| 156 | struct brcmfmac_sdio_pd sdio; | ||
| 157 | } bus; | ||
| 158 | }; | ||
| 159 | |||
| 160 | /** | ||
| 161 | * struct brcmfmac_platform_data - BRCMFMAC specific platform data. | ||
| 162 | * | ||
| 163 | * @power_on: This function is called by the brcmfmac driver when the module | ||
| 164 | * gets loaded. This can be particularly useful for low power | ||
| 165 | * devices. The platform spcific routine may for example decide to | ||
| 166 | * power up the complete device. If there is no use-case for this | ||
| 167 | * function then provide NULL. | ||
| 168 | * @power_off: This function is called by the brcmfmac when the module gets | ||
| 169 | * unloaded. At this point the devices can be powered down or | ||
| 170 | * otherwise be reset. So if an actual power_off is not supported | ||
| 171 | * but reset is supported by the devices then reset the devices | ||
| 172 | * when this function gets called. This can be particularly useful | ||
| 173 | * for low power devices. If there is no use-case for this | ||
| 174 | * function then provide NULL. | ||
| 175 | */ | ||
| 176 | struct brcmfmac_platform_data { | ||
| 177 | void (*power_on)(void); | ||
| 178 | void (*power_off)(void); | ||
| 179 | char *fw_alternative_path; | ||
| 180 | int device_count; | ||
| 181 | struct brcmfmac_pd_device devices[0]; | ||
| 182 | }; | ||
| 183 | |||
| 184 | |||
| 185 | #endif /* _LINUX_BRCMFMAC_PLATFORM_H */ | ||
diff --git a/include/linux/platform_data/microread.h b/include/linux/platform_data/microread.h deleted file mode 100644 index ca13992089b8..000000000000 --- a/include/linux/platform_data/microread.h +++ /dev/null | |||
| @@ -1,35 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Driver include for the Inside Secure microread NFC Chip. | ||
| 3 | * | ||
| 4 | * Copyright (C) 2011 Tieto Poland | ||
| 5 | * Copyright (C) 2012 Intel Corporation. All rights reserved. | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or | ||
| 8 | * modify it under the terms of the GNU General Public License | ||
| 9 | * version 2 as published by the Free Software Foundation. | ||
| 10 | * | ||
| 11 | * This program is distributed in the hope that it will be useful, | ||
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 14 | * GNU General Public License for more details. | ||
| 15 | * | ||
| 16 | * You should have received a copy of the GNU General Public License | ||
| 17 | * along with this program; if not, write to the Free Software | ||
| 18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 19 | */ | ||
| 20 | |||
| 21 | #ifndef _MICROREAD_H | ||
| 22 | #define _MICROREAD_H | ||
| 23 | |||
| 24 | #include <linux/i2c.h> | ||
| 25 | |||
| 26 | #define MICROREAD_DRIVER_NAME "microread" | ||
| 27 | |||
| 28 | /* board config platform data for microread */ | ||
| 29 | struct microread_nfc_platform_data { | ||
| 30 | unsigned int rst_gpio; | ||
| 31 | unsigned int irq_gpio; | ||
| 32 | unsigned int ioh_gpio; | ||
| 33 | }; | ||
| 34 | |||
| 35 | #endif /* _MICROREAD_H */ | ||
diff --git a/include/linux/qed/common_hsi.h b/include/linux/qed/common_hsi.h index 1d1ba2c5ee7a..53ecb37ae563 100644 --- a/include/linux/qed/common_hsi.h +++ b/include/linux/qed/common_hsi.h | |||
| @@ -11,9 +11,11 @@ | |||
| 11 | 11 | ||
| 12 | #define CORE_SPQE_PAGE_SIZE_BYTES 4096 | 12 | #define CORE_SPQE_PAGE_SIZE_BYTES 4096 |
| 13 | 13 | ||
| 14 | #define X_FINAL_CLEANUP_AGG_INT 1 | ||
| 15 | |||
| 14 | #define FW_MAJOR_VERSION 8 | 16 | #define FW_MAJOR_VERSION 8 |
| 15 | #define FW_MINOR_VERSION 4 | 17 | #define FW_MINOR_VERSION 7 |
| 16 | #define FW_REVISION_VERSION 2 | 18 | #define FW_REVISION_VERSION 3 |
| 17 | #define FW_ENGINEERING_VERSION 0 | 19 | #define FW_ENGINEERING_VERSION 0 |
| 18 | 20 | ||
| 19 | /***********************/ | 21 | /***********************/ |
| @@ -152,6 +154,9 @@ | |||
| 152 | /* number of queues in a PF queue group */ | 154 | /* number of queues in a PF queue group */ |
| 153 | #define QM_PF_QUEUE_GROUP_SIZE 8 | 155 | #define QM_PF_QUEUE_GROUP_SIZE 8 |
| 154 | 156 | ||
| 157 | /* the size of a single queue element in bytes */ | ||
| 158 | #define QM_PQ_ELEMENT_SIZE 4 | ||
| 159 | |||
| 155 | /* base number of Tx PQs in the CM PQ representation. | 160 | /* base number of Tx PQs in the CM PQ representation. |
| 156 | * should be used when storing PQ IDs in CM PQ registers and context | 161 | * should be used when storing PQ IDs in CM PQ registers and context |
| 157 | */ | 162 | */ |
| @@ -285,6 +290,16 @@ | |||
| 285 | #define PXP_NUM_ILT_RECORDS_K2 11000 | 290 | #define PXP_NUM_ILT_RECORDS_K2 11000 |
| 286 | #define MAX_NUM_ILT_RECORDS MAX(PXP_NUM_ILT_RECORDS_BB, PXP_NUM_ILT_RECORDS_K2) | 291 | #define MAX_NUM_ILT_RECORDS MAX(PXP_NUM_ILT_RECORDS_BB, PXP_NUM_ILT_RECORDS_K2) |
| 287 | 292 | ||
| 293 | #define SDM_COMP_TYPE_NONE 0 | ||
| 294 | #define SDM_COMP_TYPE_WAKE_THREAD 1 | ||
| 295 | #define SDM_COMP_TYPE_AGG_INT 2 | ||
| 296 | #define SDM_COMP_TYPE_CM 3 | ||
| 297 | #define SDM_COMP_TYPE_LOADER 4 | ||
| 298 | #define SDM_COMP_TYPE_PXP 5 | ||
| 299 | #define SDM_COMP_TYPE_INDICATE_ERROR 6 | ||
| 300 | #define SDM_COMP_TYPE_RELEASE_THREAD 7 | ||
| 301 | #define SDM_COMP_TYPE_RAM 8 | ||
| 302 | |||
| 288 | /******************/ | 303 | /******************/ |
| 289 | /* PBF CONSTANTS */ | 304 | /* PBF CONSTANTS */ |
| 290 | /******************/ | 305 | /******************/ |
| @@ -335,7 +350,7 @@ struct event_ring_entry { | |||
| 335 | 350 | ||
| 336 | /* Multi function mode */ | 351 | /* Multi function mode */ |
| 337 | enum mf_mode { | 352 | enum mf_mode { |
| 338 | SF, | 353 | ERROR_MODE /* Unsupported mode */, |
| 339 | MF_OVLAN, | 354 | MF_OVLAN, |
| 340 | MF_NPAR, | 355 | MF_NPAR, |
| 341 | MAX_MF_MODE | 356 | MAX_MF_MODE |
| @@ -606,4 +621,19 @@ struct status_block { | |||
| 606 | #define STATUS_BLOCK_ZERO_PAD3_SHIFT 24 | 621 | #define STATUS_BLOCK_ZERO_PAD3_SHIFT 24 |
| 607 | }; | 622 | }; |
| 608 | 623 | ||
| 624 | struct tunnel_parsing_flags { | ||
| 625 | u8 flags; | ||
| 626 | #define TUNNEL_PARSING_FLAGS_TYPE_MASK 0x3 | ||
| 627 | #define TUNNEL_PARSING_FLAGS_TYPE_SHIFT 0 | ||
| 628 | #define TUNNEL_PARSING_FLAGS_TENNANT_ID_EXIST_MASK 0x1 | ||
| 629 | #define TUNNEL_PARSING_FLAGS_TENNANT_ID_EXIST_SHIFT 2 | ||
| 630 | #define TUNNEL_PARSING_FLAGS_NEXT_PROTOCOL_MASK 0x3 | ||
| 631 | #define TUNNEL_PARSING_FLAGS_NEXT_PROTOCOL_SHIFT 3 | ||
| 632 | #define TUNNEL_PARSING_FLAGS_FIRSTHDRIPMATCH_MASK 0x1 | ||
| 633 | #define TUNNEL_PARSING_FLAGS_FIRSTHDRIPMATCH_SHIFT 5 | ||
| 634 | #define TUNNEL_PARSING_FLAGS_IPV4_FRAGMENT_MASK 0x1 | ||
| 635 | #define TUNNEL_PARSING_FLAGS_IPV4_FRAGMENT_SHIFT 6 | ||
| 636 | #define TUNNEL_PARSING_FLAGS_IPV4_OPTIONS_MASK 0x1 | ||
| 637 | #define TUNNEL_PARSING_FLAGS_IPV4_OPTIONS_SHIFT 7 | ||
| 638 | }; | ||
| 609 | #endif /* __COMMON_HSI__ */ | 639 | #endif /* __COMMON_HSI__ */ |
diff --git a/include/linux/qed/eth_common.h b/include/linux/qed/eth_common.h index 320b3373ac1d..092cb0c1afcb 100644 --- a/include/linux/qed/eth_common.h +++ b/include/linux/qed/eth_common.h | |||
| @@ -17,10 +17,8 @@ | |||
| 17 | #define ETH_MAX_RAMROD_PER_CON 8 | 17 | #define ETH_MAX_RAMROD_PER_CON 8 |
| 18 | #define ETH_TX_BD_PAGE_SIZE_BYTES 4096 | 18 | #define ETH_TX_BD_PAGE_SIZE_BYTES 4096 |
| 19 | #define ETH_RX_BD_PAGE_SIZE_BYTES 4096 | 19 | #define ETH_RX_BD_PAGE_SIZE_BYTES 4096 |
| 20 | #define ETH_RX_SGE_PAGE_SIZE_BYTES 4096 | ||
| 21 | #define ETH_RX_CQE_PAGE_SIZE_BYTES 4096 | 20 | #define ETH_RX_CQE_PAGE_SIZE_BYTES 4096 |
| 22 | #define ETH_RX_NUM_NEXT_PAGE_BDS 2 | 21 | #define ETH_RX_NUM_NEXT_PAGE_BDS 2 |
| 23 | #define ETH_RX_NUM_NEXT_PAGE_SGES 2 | ||
| 24 | 22 | ||
| 25 | #define ETH_TX_MIN_BDS_PER_NON_LSO_PKT 1 | 23 | #define ETH_TX_MIN_BDS_PER_NON_LSO_PKT 1 |
| 26 | #define ETH_TX_MAX_BDS_PER_NON_LSO_PACKET 18 | 24 | #define ETH_TX_MAX_BDS_PER_NON_LSO_PACKET 18 |
| @@ -34,7 +32,8 @@ | |||
| 34 | 32 | ||
| 35 | #define ETH_NUM_STATISTIC_COUNTERS MAX_NUM_VPORTS | 33 | #define ETH_NUM_STATISTIC_COUNTERS MAX_NUM_VPORTS |
| 36 | 34 | ||
| 37 | #define ETH_REG_CQE_PBL_SIZE 3 | 35 | /* Maximum number of buffers, used for RX packet placement */ |
| 36 | #define ETH_RX_MAX_BUFF_PER_PKT 5 | ||
| 38 | 37 | ||
| 39 | /* num of MAC/VLAN filters */ | 38 | /* num of MAC/VLAN filters */ |
| 40 | #define ETH_NUM_MAC_FILTERS 512 | 39 | #define ETH_NUM_MAC_FILTERS 512 |
| @@ -54,9 +53,9 @@ | |||
| 54 | 53 | ||
| 55 | /* TPA constants */ | 54 | /* TPA constants */ |
| 56 | #define ETH_TPA_MAX_AGGS_NUM 64 | 55 | #define ETH_TPA_MAX_AGGS_NUM 64 |
| 57 | #define ETH_TPA_CQE_START_SGL_SIZE 3 | 56 | #define ETH_TPA_CQE_START_LEN_LIST_SIZE ETH_RX_MAX_BUFF_PER_PKT |
| 58 | #define ETH_TPA_CQE_CONT_SGL_SIZE 6 | 57 | #define ETH_TPA_CQE_CONT_LEN_LIST_SIZE 6 |
| 59 | #define ETH_TPA_CQE_END_SGL_SIZE 4 | 58 | #define ETH_TPA_CQE_END_LEN_LIST_SIZE 4 |
| 60 | 59 | ||
| 61 | /* Queue Zone sizes */ | 60 | /* Queue Zone sizes */ |
| 62 | #define TSTORM_QZONE_SIZE 0 | 61 | #define TSTORM_QZONE_SIZE 0 |
| @@ -74,18 +73,18 @@ struct coalescing_timeset { | |||
| 74 | 73 | ||
| 75 | struct eth_tx_1st_bd_flags { | 74 | struct eth_tx_1st_bd_flags { |
| 76 | u8 bitfields; | 75 | u8 bitfields; |
| 76 | #define ETH_TX_1ST_BD_FLAGS_START_BD_MASK 0x1 | ||
| 77 | #define ETH_TX_1ST_BD_FLAGS_START_BD_SHIFT 0 | ||
| 77 | #define ETH_TX_1ST_BD_FLAGS_FORCE_VLAN_MODE_MASK 0x1 | 78 | #define ETH_TX_1ST_BD_FLAGS_FORCE_VLAN_MODE_MASK 0x1 |
| 78 | #define ETH_TX_1ST_BD_FLAGS_FORCE_VLAN_MODE_SHIFT 0 | 79 | #define ETH_TX_1ST_BD_FLAGS_FORCE_VLAN_MODE_SHIFT 1 |
| 79 | #define ETH_TX_1ST_BD_FLAGS_IP_CSUM_MASK 0x1 | 80 | #define ETH_TX_1ST_BD_FLAGS_IP_CSUM_MASK 0x1 |
| 80 | #define ETH_TX_1ST_BD_FLAGS_IP_CSUM_SHIFT 1 | 81 | #define ETH_TX_1ST_BD_FLAGS_IP_CSUM_SHIFT 2 |
| 81 | #define ETH_TX_1ST_BD_FLAGS_L4_CSUM_MASK 0x1 | 82 | #define ETH_TX_1ST_BD_FLAGS_L4_CSUM_MASK 0x1 |
| 82 | #define ETH_TX_1ST_BD_FLAGS_L4_CSUM_SHIFT 2 | 83 | #define ETH_TX_1ST_BD_FLAGS_L4_CSUM_SHIFT 3 |
| 83 | #define ETH_TX_1ST_BD_FLAGS_VLAN_INSERTION_MASK 0x1 | 84 | #define ETH_TX_1ST_BD_FLAGS_VLAN_INSERTION_MASK 0x1 |
| 84 | #define ETH_TX_1ST_BD_FLAGS_VLAN_INSERTION_SHIFT 3 | 85 | #define ETH_TX_1ST_BD_FLAGS_VLAN_INSERTION_SHIFT 4 |
| 85 | #define ETH_TX_1ST_BD_FLAGS_LSO_MASK 0x1 | 86 | #define ETH_TX_1ST_BD_FLAGS_LSO_MASK 0x1 |
| 86 | #define ETH_TX_1ST_BD_FLAGS_LSO_SHIFT 4 | 87 | #define ETH_TX_1ST_BD_FLAGS_LSO_SHIFT 5 |
| 87 | #define ETH_TX_1ST_BD_FLAGS_START_BD_MASK 0x1 | ||
| 88 | #define ETH_TX_1ST_BD_FLAGS_START_BD_SHIFT 5 | ||
| 89 | #define ETH_TX_1ST_BD_FLAGS_TUNN_IP_CSUM_MASK 0x1 | 88 | #define ETH_TX_1ST_BD_FLAGS_TUNN_IP_CSUM_MASK 0x1 |
| 90 | #define ETH_TX_1ST_BD_FLAGS_TUNN_IP_CSUM_SHIFT 6 | 89 | #define ETH_TX_1ST_BD_FLAGS_TUNN_IP_CSUM_SHIFT 6 |
| 91 | #define ETH_TX_1ST_BD_FLAGS_TUNN_L4_CSUM_MASK 0x1 | 90 | #define ETH_TX_1ST_BD_FLAGS_TUNN_L4_CSUM_MASK 0x1 |
| @@ -97,38 +96,44 @@ struct eth_tx_data_1st_bd { | |||
| 97 | __le16 vlan; | 96 | __le16 vlan; |
| 98 | u8 nbds; | 97 | u8 nbds; |
| 99 | struct eth_tx_1st_bd_flags bd_flags; | 98 | struct eth_tx_1st_bd_flags bd_flags; |
| 100 | __le16 fw_use_only; | 99 | __le16 bitfields; |
| 100 | #define ETH_TX_DATA_1ST_BD_TUNN_CFG_OVERRIDE_MASK 0x1 | ||
| 101 | #define ETH_TX_DATA_1ST_BD_TUNN_CFG_OVERRIDE_SHIFT 0 | ||
| 102 | #define ETH_TX_DATA_1ST_BD_RESERVED0_MASK 0x1 | ||
| 103 | #define ETH_TX_DATA_1ST_BD_RESERVED0_SHIFT 1 | ||
| 104 | #define ETH_TX_DATA_1ST_BD_FW_USE_ONLY_MASK 0x3FFF | ||
| 105 | #define ETH_TX_DATA_1ST_BD_FW_USE_ONLY_SHIFT 2 | ||
| 101 | }; | 106 | }; |
| 102 | 107 | ||
| 103 | /* The parsing information data for the second tx bd of a given packet. */ | 108 | /* The parsing information data for the second tx bd of a given packet. */ |
| 104 | struct eth_tx_data_2nd_bd { | 109 | struct eth_tx_data_2nd_bd { |
| 105 | __le16 tunn_ip_size; | 110 | __le16 tunn_ip_size; |
| 106 | __le16 bitfields; | 111 | __le16 bitfields1; |
| 107 | #define ETH_TX_DATA_2ND_BD_L4_HDR_START_OFFSET_W_MASK 0x1FFF | ||
| 108 | #define ETH_TX_DATA_2ND_BD_L4_HDR_START_OFFSET_W_SHIFT 0 | ||
| 109 | #define ETH_TX_DATA_2ND_BD_RESERVED0_MASK 0x7 | ||
| 110 | #define ETH_TX_DATA_2ND_BD_RESERVED0_SHIFT 13 | ||
| 111 | __le16 bitfields2; | ||
| 112 | #define ETH_TX_DATA_2ND_BD_TUNN_INNER_L2_HDR_SIZE_W_MASK 0xF | 112 | #define ETH_TX_DATA_2ND_BD_TUNN_INNER_L2_HDR_SIZE_W_MASK 0xF |
| 113 | #define ETH_TX_DATA_2ND_BD_TUNN_INNER_L2_HDR_SIZE_W_SHIFT 0 | 113 | #define ETH_TX_DATA_2ND_BD_TUNN_INNER_L2_HDR_SIZE_W_SHIFT 0 |
| 114 | #define ETH_TX_DATA_2ND_BD_TUNN_INNER_ETH_TYPE_MASK 0x3 | 114 | #define ETH_TX_DATA_2ND_BD_TUNN_INNER_ETH_TYPE_MASK 0x3 |
| 115 | #define ETH_TX_DATA_2ND_BD_TUNN_INNER_ETH_TYPE_SHIFT 4 | 115 | #define ETH_TX_DATA_2ND_BD_TUNN_INNER_ETH_TYPE_SHIFT 4 |
| 116 | #define ETH_TX_DATA_2ND_BD_DEST_PORT_MODE_MASK 0x3 | 116 | #define ETH_TX_DATA_2ND_BD_DEST_PORT_MODE_MASK 0x3 |
| 117 | #define ETH_TX_DATA_2ND_BD_DEST_PORT_MODE_SHIFT 6 | 117 | #define ETH_TX_DATA_2ND_BD_DEST_PORT_MODE_SHIFT 6 |
| 118 | #define ETH_TX_DATA_2ND_BD_START_BD_MASK 0x1 | ||
| 119 | #define ETH_TX_DATA_2ND_BD_START_BD_SHIFT 8 | ||
| 118 | #define ETH_TX_DATA_2ND_BD_TUNN_TYPE_MASK 0x3 | 120 | #define ETH_TX_DATA_2ND_BD_TUNN_TYPE_MASK 0x3 |
| 119 | #define ETH_TX_DATA_2ND_BD_TUNN_TYPE_SHIFT 8 | 121 | #define ETH_TX_DATA_2ND_BD_TUNN_TYPE_SHIFT 9 |
| 120 | #define ETH_TX_DATA_2ND_BD_TUNN_INNER_IPV6_MASK 0x1 | 122 | #define ETH_TX_DATA_2ND_BD_TUNN_INNER_IPV6_MASK 0x1 |
| 121 | #define ETH_TX_DATA_2ND_BD_TUNN_INNER_IPV6_SHIFT 10 | 123 | #define ETH_TX_DATA_2ND_BD_TUNN_INNER_IPV6_SHIFT 11 |
| 122 | #define ETH_TX_DATA_2ND_BD_IPV6_EXT_MASK 0x1 | 124 | #define ETH_TX_DATA_2ND_BD_IPV6_EXT_MASK 0x1 |
| 123 | #define ETH_TX_DATA_2ND_BD_IPV6_EXT_SHIFT 11 | 125 | #define ETH_TX_DATA_2ND_BD_IPV6_EXT_SHIFT 12 |
| 124 | #define ETH_TX_DATA_2ND_BD_TUNN_IPV6_EXT_MASK 0x1 | 126 | #define ETH_TX_DATA_2ND_BD_TUNN_IPV6_EXT_MASK 0x1 |
| 125 | #define ETH_TX_DATA_2ND_BD_TUNN_IPV6_EXT_SHIFT 12 | 127 | #define ETH_TX_DATA_2ND_BD_TUNN_IPV6_EXT_SHIFT 13 |
| 126 | #define ETH_TX_DATA_2ND_BD_L4_UDP_MASK 0x1 | 128 | #define ETH_TX_DATA_2ND_BD_L4_UDP_MASK 0x1 |
| 127 | #define ETH_TX_DATA_2ND_BD_L4_UDP_SHIFT 13 | 129 | #define ETH_TX_DATA_2ND_BD_L4_UDP_SHIFT 14 |
| 128 | #define ETH_TX_DATA_2ND_BD_L4_PSEUDO_CSUM_MODE_MASK 0x1 | 130 | #define ETH_TX_DATA_2ND_BD_L4_PSEUDO_CSUM_MODE_MASK 0x1 |
| 129 | #define ETH_TX_DATA_2ND_BD_L4_PSEUDO_CSUM_MODE_SHIFT 14 | 131 | #define ETH_TX_DATA_2ND_BD_L4_PSEUDO_CSUM_MODE_SHIFT 15 |
| 130 | #define ETH_TX_DATA_2ND_BD_RESERVED1_MASK 0x1 | 132 | __le16 bitfields2; |
| 131 | #define ETH_TX_DATA_2ND_BD_RESERVED1_SHIFT 15 | 133 | #define ETH_TX_DATA_2ND_BD_L4_HDR_START_OFFSET_W_MASK 0x1FFF |
| 134 | #define ETH_TX_DATA_2ND_BD_L4_HDR_START_OFFSET_W_SHIFT 0 | ||
| 135 | #define ETH_TX_DATA_2ND_BD_RESERVED0_MASK 0x7 | ||
| 136 | #define ETH_TX_DATA_2ND_BD_RESERVED0_SHIFT 13 | ||
| 132 | }; | 137 | }; |
| 133 | 138 | ||
| 134 | /* Regular ETH Rx FP CQE. */ | 139 | /* Regular ETH Rx FP CQE. */ |
| @@ -145,11 +150,68 @@ struct eth_fast_path_rx_reg_cqe { | |||
| 145 | struct parsing_and_err_flags pars_flags; | 150 | struct parsing_and_err_flags pars_flags; |
| 146 | __le16 vlan_tag; | 151 | __le16 vlan_tag; |
| 147 | __le32 rss_hash; | 152 | __le32 rss_hash; |
| 148 | __le16 len_on_bd; | 153 | __le16 len_on_first_bd; |
| 149 | u8 placement_offset; | 154 | u8 placement_offset; |
| 150 | u8 reserved; | 155 | struct tunnel_parsing_flags tunnel_pars_flags; |
| 151 | __le16 pbl[ETH_REG_CQE_PBL_SIZE]; | 156 | u8 bd_num; |
| 152 | u8 reserved1[10]; | 157 | u8 reserved[7]; |
| 158 | u32 fw_debug; | ||
| 159 | u8 reserved1[3]; | ||
| 160 | u8 flags; | ||
| 161 | #define ETH_FAST_PATH_RX_REG_CQE_VALID_MASK 0x1 | ||
| 162 | #define ETH_FAST_PATH_RX_REG_CQE_VALID_SHIFT 0 | ||
| 163 | #define ETH_FAST_PATH_RX_REG_CQE_VALID_TOGGLE_MASK 0x1 | ||
| 164 | #define ETH_FAST_PATH_RX_REG_CQE_VALID_TOGGLE_SHIFT 1 | ||
| 165 | #define ETH_FAST_PATH_RX_REG_CQE_RESERVED2_MASK 0x3F | ||
| 166 | #define ETH_FAST_PATH_RX_REG_CQE_RESERVED2_SHIFT 2 | ||
| 167 | }; | ||
| 168 | |||
| 169 | /* TPA-continue ETH Rx FP CQE. */ | ||
| 170 | struct eth_fast_path_rx_tpa_cont_cqe { | ||
| 171 | u8 type; | ||
| 172 | u8 tpa_agg_index; | ||
| 173 | __le16 len_list[ETH_TPA_CQE_CONT_LEN_LIST_SIZE]; | ||
| 174 | u8 reserved[5]; | ||
| 175 | u8 reserved1; | ||
| 176 | __le16 reserved2[ETH_TPA_CQE_CONT_LEN_LIST_SIZE]; | ||
| 177 | }; | ||
| 178 | |||
| 179 | /* TPA-end ETH Rx FP CQE. */ | ||
| 180 | struct eth_fast_path_rx_tpa_end_cqe { | ||
| 181 | u8 type; | ||
| 182 | u8 tpa_agg_index; | ||
| 183 | __le16 total_packet_len; | ||
| 184 | u8 num_of_bds; | ||
| 185 | u8 end_reason; | ||
| 186 | __le16 num_of_coalesced_segs; | ||
| 187 | __le32 ts_delta; | ||
| 188 | __le16 len_list[ETH_TPA_CQE_END_LEN_LIST_SIZE]; | ||
| 189 | u8 reserved1[3]; | ||
| 190 | u8 reserved2; | ||
| 191 | __le16 reserved3[ETH_TPA_CQE_END_LEN_LIST_SIZE]; | ||
| 192 | }; | ||
| 193 | |||
| 194 | /* TPA-start ETH Rx FP CQE. */ | ||
| 195 | struct eth_fast_path_rx_tpa_start_cqe { | ||
| 196 | u8 type; | ||
| 197 | u8 bitfields; | ||
| 198 | #define ETH_FAST_PATH_RX_TPA_START_CQE_RSS_HASH_TYPE_MASK 0x7 | ||
| 199 | #define ETH_FAST_PATH_RX_TPA_START_CQE_RSS_HASH_TYPE_SHIFT 0 | ||
| 200 | #define ETH_FAST_PATH_RX_TPA_START_CQE_TC_MASK 0xF | ||
| 201 | #define ETH_FAST_PATH_RX_TPA_START_CQE_TC_SHIFT 3 | ||
| 202 | #define ETH_FAST_PATH_RX_TPA_START_CQE_RESERVED0_MASK 0x1 | ||
| 203 | #define ETH_FAST_PATH_RX_TPA_START_CQE_RESERVED0_SHIFT 7 | ||
| 204 | __le16 seg_len; | ||
| 205 | struct parsing_and_err_flags pars_flags; | ||
| 206 | __le16 vlan_tag; | ||
| 207 | __le32 rss_hash; | ||
| 208 | __le16 len_on_first_bd; | ||
| 209 | u8 placement_offset; | ||
| 210 | struct tunnel_parsing_flags tunnel_pars_flags; | ||
| 211 | u8 tpa_agg_index; | ||
| 212 | u8 header_len; | ||
| 213 | __le16 ext_bd_len_list[ETH_TPA_CQE_START_LEN_LIST_SIZE]; | ||
| 214 | u32 fw_debug; | ||
| 153 | }; | 215 | }; |
| 154 | 216 | ||
| 155 | /* The L4 pseudo checksum mode for Ethernet */ | 217 | /* The L4 pseudo checksum mode for Ethernet */ |
| @@ -168,13 +230,26 @@ struct eth_slow_path_rx_cqe { | |||
| 168 | u8 type; | 230 | u8 type; |
| 169 | u8 ramrod_cmd_id; | 231 | u8 ramrod_cmd_id; |
| 170 | u8 error_flag; | 232 | u8 error_flag; |
| 171 | u8 reserved[27]; | 233 | u8 reserved[25]; |
| 172 | __le16 echo; | 234 | __le16 echo; |
| 235 | u8 reserved1; | ||
| 236 | u8 flags; | ||
| 237 | /* for PMD mode - valid indication */ | ||
| 238 | #define ETH_SLOW_PATH_RX_CQE_VALID_MASK 0x1 | ||
| 239 | #define ETH_SLOW_PATH_RX_CQE_VALID_SHIFT 0 | ||
| 240 | /* for PMD mode - valid toggle indication */ | ||
| 241 | #define ETH_SLOW_PATH_RX_CQE_VALID_TOGGLE_MASK 0x1 | ||
| 242 | #define ETH_SLOW_PATH_RX_CQE_VALID_TOGGLE_SHIFT 1 | ||
| 243 | #define ETH_SLOW_PATH_RX_CQE_RESERVED2_MASK 0x3F | ||
| 244 | #define ETH_SLOW_PATH_RX_CQE_RESERVED2_SHIFT 2 | ||
| 173 | }; | 245 | }; |
| 174 | 246 | ||
| 175 | /* union for all ETH Rx CQE types */ | 247 | /* union for all ETH Rx CQE types */ |
| 176 | union eth_rx_cqe { | 248 | union eth_rx_cqe { |
| 177 | struct eth_fast_path_rx_reg_cqe fast_path_regular; | 249 | struct eth_fast_path_rx_reg_cqe fast_path_regular; |
| 250 | struct eth_fast_path_rx_tpa_start_cqe fast_path_tpa_start; | ||
| 251 | struct eth_fast_path_rx_tpa_cont_cqe fast_path_tpa_cont; | ||
| 252 | struct eth_fast_path_rx_tpa_end_cqe fast_path_tpa_end; | ||
| 178 | struct eth_slow_path_rx_cqe slow_path; | 253 | struct eth_slow_path_rx_cqe slow_path; |
| 179 | }; | 254 | }; |
| 180 | 255 | ||
| @@ -183,15 +258,18 @@ enum eth_rx_cqe_type { | |||
| 183 | ETH_RX_CQE_TYPE_UNUSED, | 258 | ETH_RX_CQE_TYPE_UNUSED, |
| 184 | ETH_RX_CQE_TYPE_REGULAR, | 259 | ETH_RX_CQE_TYPE_REGULAR, |
| 185 | ETH_RX_CQE_TYPE_SLOW_PATH, | 260 | ETH_RX_CQE_TYPE_SLOW_PATH, |
| 261 | ETH_RX_CQE_TYPE_TPA_START, | ||
| 262 | ETH_RX_CQE_TYPE_TPA_CONT, | ||
| 263 | ETH_RX_CQE_TYPE_TPA_END, | ||
| 186 | MAX_ETH_RX_CQE_TYPE | 264 | MAX_ETH_RX_CQE_TYPE |
| 187 | }; | 265 | }; |
| 188 | 266 | ||
| 189 | /* ETH Rx producers data */ | 267 | /* ETH Rx producers data */ |
| 190 | struct eth_rx_prod_data { | 268 | struct eth_rx_prod_data { |
| 191 | __le16 bd_prod; | 269 | __le16 bd_prod; |
| 192 | __le16 sge_prod; | ||
| 193 | __le16 cqe_prod; | 270 | __le16 cqe_prod; |
| 194 | __le16 reserved; | 271 | __le16 reserved; |
| 272 | __le16 reserved1; | ||
| 195 | }; | 273 | }; |
| 196 | 274 | ||
| 197 | /* The first tx bd of a given packet */ | 275 | /* The first tx bd of a given packet */ |
| @@ -211,12 +289,17 @@ struct eth_tx_2nd_bd { | |||
| 211 | /* The parsing information data for the third tx bd of a given packet. */ | 289 | /* The parsing information data for the third tx bd of a given packet. */ |
| 212 | struct eth_tx_data_3rd_bd { | 290 | struct eth_tx_data_3rd_bd { |
| 213 | __le16 lso_mss; | 291 | __le16 lso_mss; |
| 214 | u8 bitfields; | 292 | __le16 bitfields; |
| 215 | #define ETH_TX_DATA_3RD_BD_TCP_HDR_LEN_DW_MASK 0xF | 293 | #define ETH_TX_DATA_3RD_BD_TCP_HDR_LEN_DW_MASK 0xF |
| 216 | #define ETH_TX_DATA_3RD_BD_TCP_HDR_LEN_DW_SHIFT 0 | 294 | #define ETH_TX_DATA_3RD_BD_TCP_HDR_LEN_DW_SHIFT 0 |
| 217 | #define ETH_TX_DATA_3RD_BD_HDR_NBD_MASK 0xF | 295 | #define ETH_TX_DATA_3RD_BD_HDR_NBD_MASK 0xF |
| 218 | #define ETH_TX_DATA_3RD_BD_HDR_NBD_SHIFT 4 | 296 | #define ETH_TX_DATA_3RD_BD_HDR_NBD_SHIFT 4 |
| 219 | u8 resereved0[3]; | 297 | #define ETH_TX_DATA_3RD_BD_START_BD_MASK 0x1 |
| 298 | #define ETH_TX_DATA_3RD_BD_START_BD_SHIFT 8 | ||
| 299 | #define ETH_TX_DATA_3RD_BD_RESERVED0_MASK 0x7F | ||
| 300 | #define ETH_TX_DATA_3RD_BD_RESERVED0_SHIFT 9 | ||
| 301 | u8 tunn_l4_hdr_start_offset_w; | ||
| 302 | u8 tunn_hdr_size_w; | ||
| 220 | }; | 303 | }; |
| 221 | 304 | ||
| 222 | /* The third tx bd of a given packet */ | 305 | /* The third tx bd of a given packet */ |
| @@ -226,12 +309,24 @@ struct eth_tx_3rd_bd { | |||
| 226 | struct eth_tx_data_3rd_bd data; | 309 | struct eth_tx_data_3rd_bd data; |
| 227 | }; | 310 | }; |
| 228 | 311 | ||
| 312 | /* Complementary information for the regular tx bd of a given packet. */ | ||
| 313 | struct eth_tx_data_bd { | ||
| 314 | __le16 reserved0; | ||
| 315 | __le16 bitfields; | ||
| 316 | #define ETH_TX_DATA_BD_RESERVED1_MASK 0xFF | ||
| 317 | #define ETH_TX_DATA_BD_RESERVED1_SHIFT 0 | ||
| 318 | #define ETH_TX_DATA_BD_START_BD_MASK 0x1 | ||
| 319 | #define ETH_TX_DATA_BD_START_BD_SHIFT 8 | ||
| 320 | #define ETH_TX_DATA_BD_RESERVED2_MASK 0x7F | ||
| 321 | #define ETH_TX_DATA_BD_RESERVED2_SHIFT 9 | ||
| 322 | __le16 reserved3; | ||
| 323 | }; | ||
| 324 | |||
| 229 | /* The common non-special TX BD ring element */ | 325 | /* The common non-special TX BD ring element */ |
| 230 | struct eth_tx_bd { | 326 | struct eth_tx_bd { |
| 231 | struct regpair addr; | 327 | struct regpair addr; |
| 232 | __le16 nbytes; | 328 | __le16 nbytes; |
| 233 | __le16 reserved0; | 329 | struct eth_tx_data_bd data; |
| 234 | __le32 reserved1; | ||
| 235 | }; | 330 | }; |
| 236 | 331 | ||
| 237 | union eth_tx_bd_types { | 332 | union eth_tx_bd_types { |
diff --git a/include/linux/qed/qed_chain.h b/include/linux/qed/qed_chain.h index 41b9049b57e2..5f8fcaaa6504 100644 --- a/include/linux/qed/qed_chain.h +++ b/include/linux/qed/qed_chain.h | |||
| @@ -19,6 +19,10 @@ | |||
| 19 | /* dma_addr_t manip */ | 19 | /* dma_addr_t manip */ |
| 20 | #define DMA_LO_LE(x) cpu_to_le32(lower_32_bits(x)) | 20 | #define DMA_LO_LE(x) cpu_to_le32(lower_32_bits(x)) |
| 21 | #define DMA_HI_LE(x) cpu_to_le32(upper_32_bits(x)) | 21 | #define DMA_HI_LE(x) cpu_to_le32(upper_32_bits(x)) |
| 22 | #define DMA_REGPAIR_LE(x, val) do { \ | ||
| 23 | (x).hi = DMA_HI_LE((val)); \ | ||
| 24 | (x).lo = DMA_LO_LE((val)); \ | ||
| 25 | } while (0) | ||
| 22 | 26 | ||
| 23 | #define HILO_GEN(hi, lo, type) ((((type)(hi)) << 32) + (lo)) | 27 | #define HILO_GEN(hi, lo, type) ((((type)(hi)) << 32) + (lo)) |
| 24 | #define HILO_DMA(hi, lo) HILO_GEN(hi, lo, dma_addr_t) | 28 | #define HILO_DMA(hi, lo) HILO_GEN(hi, lo, dma_addr_t) |
diff --git a/include/linux/qed/qed_eth_if.h b/include/linux/qed/qed_eth_if.h index 81ab178e31c1..e1d69834a11f 100644 --- a/include/linux/qed/qed_eth_if.h +++ b/include/linux/qed/qed_eth_if.h | |||
| @@ -33,10 +33,20 @@ struct qed_update_vport_params { | |||
| 33 | u8 vport_id; | 33 | u8 vport_id; |
| 34 | u8 update_vport_active_flg; | 34 | u8 update_vport_active_flg; |
| 35 | u8 vport_active_flg; | 35 | u8 vport_active_flg; |
| 36 | u8 update_accept_any_vlan_flg; | ||
| 37 | u8 accept_any_vlan; | ||
| 36 | u8 update_rss_flg; | 38 | u8 update_rss_flg; |
| 37 | struct qed_update_vport_rss_params rss_params; | 39 | struct qed_update_vport_rss_params rss_params; |
| 38 | }; | 40 | }; |
| 39 | 41 | ||
| 42 | struct qed_start_vport_params { | ||
| 43 | bool remove_inner_vlan; | ||
| 44 | bool gro_enable; | ||
| 45 | bool drop_ttl0; | ||
| 46 | u8 vport_id; | ||
| 47 | u16 mtu; | ||
| 48 | }; | ||
| 49 | |||
| 40 | struct qed_stop_rxq_params { | 50 | struct qed_stop_rxq_params { |
| 41 | u8 rss_id; | 51 | u8 rss_id; |
| 42 | u8 rx_queue_id; | 52 | u8 rx_queue_id; |
| @@ -116,9 +126,7 @@ struct qed_eth_ops { | |||
| 116 | void *cookie); | 126 | void *cookie); |
| 117 | 127 | ||
| 118 | int (*vport_start)(struct qed_dev *cdev, | 128 | int (*vport_start)(struct qed_dev *cdev, |
| 119 | u8 vport_id, u16 mtu, | 129 | struct qed_start_vport_params *params); |
| 120 | u8 drop_ttl0_flg, | ||
| 121 | u8 inner_vlan_removal_en_flg); | ||
| 122 | 130 | ||
| 123 | int (*vport_stop)(struct qed_dev *cdev, | 131 | int (*vport_stop)(struct qed_dev *cdev, |
| 124 | u8 vport_id); | 132 | u8 vport_id); |
diff --git a/include/linux/qed/qed_if.h b/include/linux/qed/qed_if.h index d4a32e878180..1f7599c77cd4 100644 --- a/include/linux/qed/qed_if.h +++ b/include/linux/qed/qed_if.h | |||
| @@ -80,7 +80,7 @@ struct qed_dev_info { | |||
| 80 | u8 num_hwfns; | 80 | u8 num_hwfns; |
| 81 | 81 | ||
| 82 | u8 hw_mac[ETH_ALEN]; | 82 | u8 hw_mac[ETH_ALEN]; |
| 83 | bool is_mf; | 83 | bool is_mf_default; |
| 84 | 84 | ||
| 85 | /* FW version */ | 85 | /* FW version */ |
| 86 | u16 fw_major; | 86 | u16 fw_major; |
| @@ -360,6 +360,12 @@ enum DP_MODULE { | |||
| 360 | /* to be added...up to 0x8000000 */ | 360 | /* to be added...up to 0x8000000 */ |
| 361 | }; | 361 | }; |
| 362 | 362 | ||
| 363 | enum qed_mf_mode { | ||
| 364 | QED_MF_DEFAULT, | ||
| 365 | QED_MF_OVLAN, | ||
| 366 | QED_MF_NPAR, | ||
| 367 | }; | ||
| 368 | |||
| 363 | struct qed_eth_stats { | 369 | struct qed_eth_stats { |
| 364 | u64 no_buff_discards; | 370 | u64 no_buff_discards; |
| 365 | u64 packet_too_big_discard; | 371 | u64 packet_too_big_discard; |
| @@ -440,6 +446,12 @@ struct qed_eth_stats { | |||
| 440 | #define RX_PI 0 | 446 | #define RX_PI 0 |
| 441 | #define TX_PI(tc) (RX_PI + 1 + tc) | 447 | #define TX_PI(tc) (RX_PI + 1 + tc) |
| 442 | 448 | ||
| 449 | struct qed_sb_cnt_info { | ||
| 450 | int sb_cnt; | ||
| 451 | int sb_iov_cnt; | ||
| 452 | int sb_free_blk; | ||
| 453 | }; | ||
| 454 | |||
| 443 | static inline u16 qed_sb_update_sb_idx(struct qed_sb_info *sb_info) | 455 | static inline u16 qed_sb_update_sb_idx(struct qed_sb_info *sb_info) |
| 444 | { | 456 | { |
| 445 | u32 prod = 0; | 457 | u32 prod = 0; |
diff --git a/include/linux/rculist.h b/include/linux/rculist.h index 14ec1652daf4..17d4f849c65e 100644 --- a/include/linux/rculist.h +++ b/include/linux/rculist.h | |||
| @@ -319,6 +319,27 @@ static inline void list_splice_tail_init_rcu(struct list_head *list, | |||
| 319 | }) | 319 | }) |
| 320 | 320 | ||
| 321 | /** | 321 | /** |
| 322 | * list_next_or_null_rcu - get the first element from a list | ||
| 323 | * @head: the head for the list. | ||
| 324 | * @ptr: the list head to take the next element from. | ||
| 325 | * @type: the type of the struct this is embedded in. | ||
| 326 | * @member: the name of the list_head within the struct. | ||
| 327 | * | ||
| 328 | * Note that if the ptr is at the end of the list, NULL is returned. | ||
| 329 | * | ||
| 330 | * This primitive may safely run concurrently with the _rcu list-mutation | ||
| 331 | * primitives such as list_add_rcu() as long as it's guarded by rcu_read_lock(). | ||
| 332 | */ | ||
| 333 | #define list_next_or_null_rcu(head, ptr, type, member) \ | ||
| 334 | ({ \ | ||
| 335 | struct list_head *__head = (head); \ | ||
| 336 | struct list_head *__ptr = (ptr); \ | ||
| 337 | struct list_head *__next = READ_ONCE(__ptr->next); \ | ||
| 338 | likely(__next != __head) ? list_entry_rcu(__next, type, \ | ||
| 339 | member) : NULL; \ | ||
| 340 | }) | ||
| 341 | |||
| 342 | /** | ||
| 322 | * list_for_each_entry_rcu - iterate over rcu list of given type | 343 | * list_for_each_entry_rcu - iterate over rcu list of given type |
| 323 | * @pos: the type * to use as a loop cursor. | 344 | * @pos: the type * to use as a loop cursor. |
| 324 | * @head: the head for your list. | 345 | * @head: the head for your list. |
diff --git a/include/linux/rfkill-gpio.h b/include/linux/rfkill-gpio.h deleted file mode 100644 index 20bcb55498cd..000000000000 --- a/include/linux/rfkill-gpio.h +++ /dev/null | |||
| @@ -1,37 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (c) 2011, NVIDIA Corporation. | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify | ||
| 5 | * it under the terms of the GNU General Public License as published by | ||
| 6 | * the Free Software Foundation; either version 2 of the License, or | ||
| 7 | * (at your option) any later version. | ||
| 8 | * | ||
| 9 | * This program is distributed in the hope that it will be useful, but WITHOUT | ||
| 10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
| 11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
| 12 | * more details. | ||
| 13 | * | ||
| 14 | * You should have received a copy of the GNU General Public License along | ||
| 15 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
| 16 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | ||
| 17 | */ | ||
| 18 | |||
| 19 | |||
| 20 | #ifndef __RFKILL_GPIO_H | ||
| 21 | #define __RFKILL_GPIO_H | ||
| 22 | |||
| 23 | #include <linux/types.h> | ||
| 24 | #include <linux/rfkill.h> | ||
| 25 | |||
| 26 | /** | ||
| 27 | * struct rfkill_gpio_platform_data - platform data for rfkill gpio device. | ||
| 28 | * for unused gpio's, the expected value is -1. | ||
| 29 | * @name: name for the gpio rf kill instance | ||
| 30 | */ | ||
| 31 | |||
| 32 | struct rfkill_gpio_platform_data { | ||
| 33 | char *name; | ||
| 34 | enum rfkill_type type; | ||
| 35 | }; | ||
| 36 | |||
| 37 | #endif /* __RFKILL_GPIO_H */ | ||
diff --git a/include/linux/rfkill.h b/include/linux/rfkill.h index d9010789b4e8..e6a0031d1b1f 100644 --- a/include/linux/rfkill.h +++ b/include/linux/rfkill.h | |||
| @@ -104,7 +104,8 @@ int __must_check rfkill_register(struct rfkill *rfkill); | |||
| 104 | * | 104 | * |
| 105 | * Pause polling -- say transmitter is off for other reasons. | 105 | * Pause polling -- say transmitter is off for other reasons. |
| 106 | * NOTE: not necessary for suspend/resume -- in that case the | 106 | * NOTE: not necessary for suspend/resume -- in that case the |
| 107 | * core stops polling anyway | 107 | * core stops polling anyway (but will also correctly handle |
| 108 | * the case of polling having been paused before suspend.) | ||
| 108 | */ | 109 | */ |
| 109 | void rfkill_pause_polling(struct rfkill *rfkill); | 110 | void rfkill_pause_polling(struct rfkill *rfkill); |
| 110 | 111 | ||
| @@ -212,6 +213,15 @@ void rfkill_set_states(struct rfkill *rfkill, bool sw, bool hw); | |||
| 212 | * @rfkill: rfkill struct to query | 213 | * @rfkill: rfkill struct to query |
| 213 | */ | 214 | */ |
| 214 | bool rfkill_blocked(struct rfkill *rfkill); | 215 | bool rfkill_blocked(struct rfkill *rfkill); |
| 216 | |||
| 217 | /** | ||
| 218 | * rfkill_find_type - Helpper for finding rfkill type by name | ||
| 219 | * @name: the name of the type | ||
| 220 | * | ||
| 221 | * Returns enum rfkill_type that conrresponds the name. | ||
| 222 | */ | ||
| 223 | enum rfkill_type rfkill_find_type(const char *name); | ||
| 224 | |||
| 215 | #else /* !RFKILL */ | 225 | #else /* !RFKILL */ |
| 216 | static inline struct rfkill * __must_check | 226 | static inline struct rfkill * __must_check |
| 217 | rfkill_alloc(const char *name, | 227 | rfkill_alloc(const char *name, |
| @@ -268,6 +278,12 @@ static inline bool rfkill_blocked(struct rfkill *rfkill) | |||
| 268 | { | 278 | { |
| 269 | return false; | 279 | return false; |
| 270 | } | 280 | } |
| 281 | |||
| 282 | static inline enum rfkill_type rfkill_find_type(const char *name) | ||
| 283 | { | ||
| 284 | return RFKILL_TYPE_ALL; | ||
| 285 | } | ||
| 286 | |||
| 271 | #endif /* RFKILL || RFKILL_MODULE */ | 287 | #endif /* RFKILL || RFKILL_MODULE */ |
| 272 | 288 | ||
| 273 | 289 | ||
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index d3fcd4591ce4..15d0df943466 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h | |||
| @@ -1161,10 +1161,6 @@ static inline void skb_copy_hash(struct sk_buff *to, const struct sk_buff *from) | |||
| 1161 | to->l4_hash = from->l4_hash; | 1161 | to->l4_hash = from->l4_hash; |
| 1162 | }; | 1162 | }; |
| 1163 | 1163 | ||
| 1164 | static inline void skb_sender_cpu_clear(struct sk_buff *skb) | ||
| 1165 | { | ||
| 1166 | } | ||
| 1167 | |||
| 1168 | #ifdef NET_SKBUFF_DATA_USES_OFFSET | 1164 | #ifdef NET_SKBUFF_DATA_USES_OFFSET |
| 1169 | static inline unsigned char *skb_end_pointer(const struct sk_buff *skb) | 1165 | static inline unsigned char *skb_end_pointer(const struct sk_buff *skb) |
| 1170 | { | 1166 | { |
| @@ -2186,6 +2182,11 @@ static inline int skb_checksum_start_offset(const struct sk_buff *skb) | |||
| 2186 | return skb->csum_start - skb_headroom(skb); | 2182 | return skb->csum_start - skb_headroom(skb); |
| 2187 | } | 2183 | } |
| 2188 | 2184 | ||
| 2185 | static inline unsigned char *skb_checksum_start(const struct sk_buff *skb) | ||
| 2186 | { | ||
| 2187 | return skb->head + skb->csum_start; | ||
| 2188 | } | ||
| 2189 | |||
| 2189 | static inline int skb_transport_offset(const struct sk_buff *skb) | 2190 | static inline int skb_transport_offset(const struct sk_buff *skb) |
| 2190 | { | 2191 | { |
| 2191 | return skb_transport_header(skb) - skb->data; | 2192 | return skb_transport_header(skb) - skb->data; |
| @@ -2424,6 +2425,10 @@ static inline struct sk_buff *napi_alloc_skb(struct napi_struct *napi, | |||
| 2424 | { | 2425 | { |
| 2425 | return __napi_alloc_skb(napi, length, GFP_ATOMIC); | 2426 | return __napi_alloc_skb(napi, length, GFP_ATOMIC); |
| 2426 | } | 2427 | } |
| 2428 | void napi_consume_skb(struct sk_buff *skb, int budget); | ||
| 2429 | |||
| 2430 | void __kfree_skb_flush(void); | ||
| 2431 | void __kfree_skb_defer(struct sk_buff *skb); | ||
| 2427 | 2432 | ||
| 2428 | /** | 2433 | /** |
| 2429 | * __dev_alloc_pages - allocate page for network Rx | 2434 | * __dev_alloc_pages - allocate page for network Rx |
| @@ -2646,6 +2651,13 @@ static inline int skb_clone_writable(const struct sk_buff *skb, unsigned int len | |||
| 2646 | skb_headroom(skb) + len <= skb->hdr_len; | 2651 | skb_headroom(skb) + len <= skb->hdr_len; |
| 2647 | } | 2652 | } |
| 2648 | 2653 | ||
| 2654 | static inline int skb_try_make_writable(struct sk_buff *skb, | ||
| 2655 | unsigned int write_len) | ||
| 2656 | { | ||
| 2657 | return skb_cloned(skb) && !skb_clone_writable(skb, write_len) && | ||
| 2658 | pskb_expand_head(skb, 0, 0, GFP_ATOMIC); | ||
| 2659 | } | ||
| 2660 | |||
| 2649 | static inline int __skb_cow(struct sk_buff *skb, unsigned int headroom, | 2661 | static inline int __skb_cow(struct sk_buff *skb, unsigned int headroom, |
| 2650 | int cloned) | 2662 | int cloned) |
| 2651 | { | 2663 | { |
| @@ -3574,6 +3586,7 @@ static inline struct sec_path *skb_sec_path(struct sk_buff *skb) | |||
| 3574 | struct skb_gso_cb { | 3586 | struct skb_gso_cb { |
| 3575 | int mac_offset; | 3587 | int mac_offset; |
| 3576 | int encap_level; | 3588 | int encap_level; |
| 3589 | __wsum csum; | ||
| 3577 | __u16 csum_start; | 3590 | __u16 csum_start; |
| 3578 | }; | 3591 | }; |
| 3579 | #define SKB_SGO_CB_OFFSET 32 | 3592 | #define SKB_SGO_CB_OFFSET 32 |
| @@ -3600,6 +3613,16 @@ static inline int gso_pskb_expand_head(struct sk_buff *skb, int extra) | |||
| 3600 | return 0; | 3613 | return 0; |
| 3601 | } | 3614 | } |
| 3602 | 3615 | ||
| 3616 | static inline void gso_reset_checksum(struct sk_buff *skb, __wsum res) | ||
| 3617 | { | ||
| 3618 | /* Do not update partial checksums if remote checksum is enabled. */ | ||
| 3619 | if (skb->remcsum_offload) | ||
| 3620 | return; | ||
| 3621 | |||
| 3622 | SKB_GSO_CB(skb)->csum = res; | ||
| 3623 | SKB_GSO_CB(skb)->csum_start = skb_checksum_start(skb) - skb->head; | ||
| 3624 | } | ||
| 3625 | |||
| 3603 | /* Compute the checksum for a gso segment. First compute the checksum value | 3626 | /* Compute the checksum for a gso segment. First compute the checksum value |
| 3604 | * from the start of transport header to SKB_GSO_CB(skb)->csum_start, and | 3627 | * from the start of transport header to SKB_GSO_CB(skb)->csum_start, and |
| 3605 | * then add in skb->csum (checksum from csum_start to end of packet). | 3628 | * then add in skb->csum (checksum from csum_start to end of packet). |
| @@ -3610,15 +3633,14 @@ static inline int gso_pskb_expand_head(struct sk_buff *skb, int extra) | |||
| 3610 | */ | 3633 | */ |
| 3611 | static inline __sum16 gso_make_checksum(struct sk_buff *skb, __wsum res) | 3634 | static inline __sum16 gso_make_checksum(struct sk_buff *skb, __wsum res) |
| 3612 | { | 3635 | { |
| 3613 | int plen = SKB_GSO_CB(skb)->csum_start - skb_headroom(skb) - | 3636 | unsigned char *csum_start = skb_transport_header(skb); |
| 3614 | skb_transport_offset(skb); | 3637 | int plen = (skb->head + SKB_GSO_CB(skb)->csum_start) - csum_start; |
| 3615 | __wsum partial; | 3638 | __wsum partial = SKB_GSO_CB(skb)->csum; |
| 3616 | 3639 | ||
| 3617 | partial = csum_partial(skb_transport_header(skb), plen, skb->csum); | 3640 | SKB_GSO_CB(skb)->csum = res; |
| 3618 | skb->csum = res; | 3641 | SKB_GSO_CB(skb)->csum_start = csum_start - skb->head; |
| 3619 | SKB_GSO_CB(skb)->csum_start -= plen; | ||
| 3620 | 3642 | ||
| 3621 | return csum_fold(partial); | 3643 | return csum_fold(csum_partial(csum_start, plen, partial)); |
| 3622 | } | 3644 | } |
| 3623 | 3645 | ||
| 3624 | static inline bool skb_is_gso(const struct sk_buff *skb) | 3646 | static inline bool skb_is_gso(const struct sk_buff *skb) |
| @@ -3708,5 +3730,30 @@ static inline unsigned int skb_gso_network_seglen(const struct sk_buff *skb) | |||
| 3708 | return hdr_len + skb_gso_transport_seglen(skb); | 3730 | return hdr_len + skb_gso_transport_seglen(skb); |
| 3709 | } | 3731 | } |
| 3710 | 3732 | ||
| 3733 | /* Local Checksum Offload. | ||
| 3734 | * Compute outer checksum based on the assumption that the | ||
| 3735 | * inner checksum will be offloaded later. | ||
| 3736 | * See Documentation/networking/checksum-offloads.txt for | ||
| 3737 | * explanation of how this works. | ||
| 3738 | * Fill in outer checksum adjustment (e.g. with sum of outer | ||
| 3739 | * pseudo-header) before calling. | ||
| 3740 | * Also ensure that inner checksum is in linear data area. | ||
| 3741 | */ | ||
| 3742 | static inline __wsum lco_csum(struct sk_buff *skb) | ||
| 3743 | { | ||
| 3744 | unsigned char *csum_start = skb_checksum_start(skb); | ||
| 3745 | unsigned char *l4_hdr = skb_transport_header(skb); | ||
| 3746 | __wsum partial; | ||
| 3747 | |||
| 3748 | /* Start with complement of inner checksum adjustment */ | ||
| 3749 | partial = ~csum_unfold(*(__force __sum16 *)(csum_start + | ||
| 3750 | skb->csum_offset)); | ||
| 3751 | |||
| 3752 | /* Add in checksum of our headers (incl. outer checksum | ||
| 3753 | * adjustment filled in by caller) and return result. | ||
| 3754 | */ | ||
| 3755 | return csum_partial(l4_hdr, csum_start - l4_hdr, partial); | ||
| 3756 | } | ||
| 3757 | |||
| 3711 | #endif /* __KERNEL__ */ | 3758 | #endif /* __KERNEL__ */ |
| 3712 | #endif /* _LINUX_SKBUFF_H */ | 3759 | #endif /* _LINUX_SKBUFF_H */ |
diff --git a/include/linux/socket.h b/include/linux/socket.h index 5bf59c8493b7..73bf6c6a833b 100644 --- a/include/linux/socket.h +++ b/include/linux/socket.h | |||
| @@ -200,7 +200,9 @@ struct ucred { | |||
| 200 | #define AF_ALG 38 /* Algorithm sockets */ | 200 | #define AF_ALG 38 /* Algorithm sockets */ |
| 201 | #define AF_NFC 39 /* NFC sockets */ | 201 | #define AF_NFC 39 /* NFC sockets */ |
| 202 | #define AF_VSOCK 40 /* vSockets */ | 202 | #define AF_VSOCK 40 /* vSockets */ |
| 203 | #define AF_MAX 41 /* For now.. */ | 203 | #define AF_KCM 41 /* Kernel Connection Multiplexor*/ |
| 204 | |||
| 205 | #define AF_MAX 42 /* For now.. */ | ||
| 204 | 206 | ||
| 205 | /* Protocol families, same as address families. */ | 207 | /* Protocol families, same as address families. */ |
| 206 | #define PF_UNSPEC AF_UNSPEC | 208 | #define PF_UNSPEC AF_UNSPEC |
| @@ -246,6 +248,7 @@ struct ucred { | |||
| 246 | #define PF_ALG AF_ALG | 248 | #define PF_ALG AF_ALG |
| 247 | #define PF_NFC AF_NFC | 249 | #define PF_NFC AF_NFC |
| 248 | #define PF_VSOCK AF_VSOCK | 250 | #define PF_VSOCK AF_VSOCK |
| 251 | #define PF_KCM AF_KCM | ||
| 249 | #define PF_MAX AF_MAX | 252 | #define PF_MAX AF_MAX |
| 250 | 253 | ||
| 251 | /* Maximum queue length specifiable by listen. */ | 254 | /* Maximum queue length specifiable by listen. */ |
| @@ -274,6 +277,7 @@ struct ucred { | |||
| 274 | #define MSG_MORE 0x8000 /* Sender will send more */ | 277 | #define MSG_MORE 0x8000 /* Sender will send more */ |
| 275 | #define MSG_WAITFORONE 0x10000 /* recvmmsg(): block until 1+ packets avail */ | 278 | #define MSG_WAITFORONE 0x10000 /* recvmmsg(): block until 1+ packets avail */ |
| 276 | #define MSG_SENDPAGE_NOTLAST 0x20000 /* sendpage() internal : not the last page */ | 279 | #define MSG_SENDPAGE_NOTLAST 0x20000 /* sendpage() internal : not the last page */ |
| 280 | #define MSG_BATCH 0x40000 /* sendmmsg(): more messages coming */ | ||
| 277 | #define MSG_EOF MSG_FIN | 281 | #define MSG_EOF MSG_FIN |
| 278 | 282 | ||
| 279 | #define MSG_FASTOPEN 0x20000000 /* Send data in TCP SYN */ | 283 | #define MSG_FASTOPEN 0x20000000 /* Send data in TCP SYN */ |
| @@ -322,6 +326,7 @@ struct ucred { | |||
| 322 | #define SOL_CAIF 278 | 326 | #define SOL_CAIF 278 |
| 323 | #define SOL_ALG 279 | 327 | #define SOL_ALG 279 |
| 324 | #define SOL_NFC 280 | 328 | #define SOL_NFC 280 |
| 329 | #define SOL_KCM 281 | ||
| 325 | 330 | ||
| 326 | /* IPX options */ | 331 | /* IPX options */ |
| 327 | #define IPX_TYPE 1 | 332 | #define IPX_TYPE 1 |
diff --git a/include/linux/stmmac.h b/include/linux/stmmac.h index 881a79d52467..4bcf5a61aada 100644 --- a/include/linux/stmmac.h +++ b/include/linux/stmmac.h | |||
| @@ -90,7 +90,21 @@ struct stmmac_dma_cfg { | |||
| 90 | int pbl; | 90 | int pbl; |
| 91 | int fixed_burst; | 91 | int fixed_burst; |
| 92 | int mixed_burst; | 92 | int mixed_burst; |
| 93 | int burst_len; | 93 | bool aal; |
| 94 | }; | ||
| 95 | |||
| 96 | #define AXI_BLEN 7 | ||
| 97 | struct stmmac_axi { | ||
| 98 | bool axi_lpi_en; | ||
| 99 | bool axi_xit_frm; | ||
| 100 | u32 axi_wr_osr_lmt; | ||
| 101 | u32 axi_rd_osr_lmt; | ||
| 102 | bool axi_kbbe; | ||
| 103 | bool axi_axi_all; | ||
| 104 | u32 axi_blen[AXI_BLEN]; | ||
| 105 | bool axi_fb; | ||
| 106 | bool axi_mb; | ||
| 107 | bool axi_rb; | ||
| 94 | }; | 108 | }; |
| 95 | 109 | ||
| 96 | struct plat_stmmacenet_data { | 110 | struct plat_stmmacenet_data { |
| @@ -123,5 +137,6 @@ struct plat_stmmacenet_data { | |||
| 123 | int (*init)(struct platform_device *pdev, void *priv); | 137 | int (*init)(struct platform_device *pdev, void *priv); |
| 124 | void (*exit)(struct platform_device *pdev, void *priv); | 138 | void (*exit)(struct platform_device *pdev, void *priv); |
| 125 | void *bsp_priv; | 139 | void *bsp_priv; |
| 140 | struct stmmac_axi *axi; | ||
| 126 | }; | 141 | }; |
| 127 | #endif | 142 | #endif |
diff --git a/include/linux/tcp.h b/include/linux/tcp.h index b386361ba3e8..7be9b1242354 100644 --- a/include/linux/tcp.h +++ b/include/linux/tcp.h | |||
| @@ -29,9 +29,14 @@ static inline struct tcphdr *tcp_hdr(const struct sk_buff *skb) | |||
| 29 | return (struct tcphdr *)skb_transport_header(skb); | 29 | return (struct tcphdr *)skb_transport_header(skb); |
| 30 | } | 30 | } |
| 31 | 31 | ||
| 32 | static inline unsigned int __tcp_hdrlen(const struct tcphdr *th) | ||
| 33 | { | ||
| 34 | return th->doff * 4; | ||
| 35 | } | ||
| 36 | |||
| 32 | static inline unsigned int tcp_hdrlen(const struct sk_buff *skb) | 37 | static inline unsigned int tcp_hdrlen(const struct sk_buff *skb) |
| 33 | { | 38 | { |
| 34 | return tcp_hdr(skb)->doff * 4; | 39 | return __tcp_hdrlen(tcp_hdr(skb)); |
| 35 | } | 40 | } |
| 36 | 41 | ||
| 37 | static inline struct tcphdr *inner_tcp_hdr(const struct sk_buff *skb) | 42 | static inline struct tcphdr *inner_tcp_hdr(const struct sk_buff *skb) |
| @@ -153,6 +158,9 @@ struct tcp_sock { | |||
| 153 | u32 segs_in; /* RFC4898 tcpEStatsPerfSegsIn | 158 | u32 segs_in; /* RFC4898 tcpEStatsPerfSegsIn |
| 154 | * total number of segments in. | 159 | * total number of segments in. |
| 155 | */ | 160 | */ |
| 161 | u32 data_segs_in; /* RFC4898 tcpEStatsPerfDataSegsIn | ||
| 162 | * total number of data segments in. | ||
| 163 | */ | ||
| 156 | u32 rcv_nxt; /* What we want to receive next */ | 164 | u32 rcv_nxt; /* What we want to receive next */ |
| 157 | u32 copied_seq; /* Head of yet unread data */ | 165 | u32 copied_seq; /* Head of yet unread data */ |
| 158 | u32 rcv_wup; /* rcv_nxt on last window update sent */ | 166 | u32 rcv_wup; /* rcv_nxt on last window update sent */ |
| @@ -160,6 +168,9 @@ struct tcp_sock { | |||
| 160 | u32 segs_out; /* RFC4898 tcpEStatsPerfSegsOut | 168 | u32 segs_out; /* RFC4898 tcpEStatsPerfSegsOut |
| 161 | * The total number of segments sent. | 169 | * The total number of segments sent. |
| 162 | */ | 170 | */ |
| 171 | u32 data_segs_out; /* RFC4898 tcpEStatsPerfDataSegsOut | ||
| 172 | * total number of data segments sent. | ||
| 173 | */ | ||
| 163 | u64 bytes_acked; /* RFC4898 tcpEStatsAppHCThruOctetsAcked | 174 | u64 bytes_acked; /* RFC4898 tcpEStatsAppHCThruOctetsAcked |
| 164 | * sum(delta(snd_una)), or how many bytes | 175 | * sum(delta(snd_una)), or how many bytes |
| 165 | * were acked. | 176 | * were acked. |
| @@ -256,6 +267,7 @@ struct tcp_sock { | |||
| 256 | u32 prr_delivered; /* Number of newly delivered packets to | 267 | u32 prr_delivered; /* Number of newly delivered packets to |
| 257 | * receiver in Recovery. */ | 268 | * receiver in Recovery. */ |
| 258 | u32 prr_out; /* Total number of pkts sent during Recovery. */ | 269 | u32 prr_out; /* Total number of pkts sent during Recovery. */ |
| 270 | u32 delivered; /* Total data packets delivered incl. rexmits */ | ||
| 259 | 271 | ||
| 260 | u32 rcv_wnd; /* Current receiver window */ | 272 | u32 rcv_wnd; /* Current receiver window */ |
| 261 | u32 write_seq; /* Tail(+1) of data held in tcp send buffer */ | 273 | u32 write_seq; /* Tail(+1) of data held in tcp send buffer */ |
diff --git a/include/net/6lowpan.h b/include/net/6lowpan.h index 2f6a3f2233ed..da3a77d25fcb 100644 --- a/include/net/6lowpan.h +++ b/include/net/6lowpan.h | |||
| @@ -75,6 +75,8 @@ | |||
| 75 | #define LOWPAN_IPHC_MAX_HC_BUF_LEN (sizeof(struct ipv6hdr) + \ | 75 | #define LOWPAN_IPHC_MAX_HC_BUF_LEN (sizeof(struct ipv6hdr) + \ |
| 76 | LOWPAN_IPHC_MAX_HEADER_LEN + \ | 76 | LOWPAN_IPHC_MAX_HEADER_LEN + \ |
| 77 | LOWPAN_NHC_MAX_HDR_LEN) | 77 | LOWPAN_NHC_MAX_HDR_LEN) |
| 78 | /* SCI/DCI is 4 bit width, so we have maximum 16 entries */ | ||
| 79 | #define LOWPAN_IPHC_CTX_TABLE_SIZE (1 << 4) | ||
| 78 | 80 | ||
| 79 | #define LOWPAN_DISPATCH_IPV6 0x41 /* 01000001 = 65 */ | 81 | #define LOWPAN_DISPATCH_IPV6 0x41 /* 01000001 = 65 */ |
| 80 | #define LOWPAN_DISPATCH_IPHC 0x60 /* 011xxxxx = ... */ | 82 | #define LOWPAN_DISPATCH_IPHC 0x60 /* 011xxxxx = ... */ |
| @@ -98,9 +100,39 @@ enum lowpan_lltypes { | |||
| 98 | LOWPAN_LLTYPE_IEEE802154, | 100 | LOWPAN_LLTYPE_IEEE802154, |
| 99 | }; | 101 | }; |
| 100 | 102 | ||
| 103 | enum lowpan_iphc_ctx_flags { | ||
| 104 | LOWPAN_IPHC_CTX_FLAG_ACTIVE, | ||
| 105 | LOWPAN_IPHC_CTX_FLAG_COMPRESSION, | ||
| 106 | }; | ||
| 107 | |||
| 108 | struct lowpan_iphc_ctx { | ||
| 109 | u8 id; | ||
| 110 | struct in6_addr pfx; | ||
| 111 | u8 plen; | ||
| 112 | unsigned long flags; | ||
| 113 | }; | ||
| 114 | |||
| 115 | struct lowpan_iphc_ctx_table { | ||
| 116 | spinlock_t lock; | ||
| 117 | const struct lowpan_iphc_ctx_ops *ops; | ||
| 118 | struct lowpan_iphc_ctx table[LOWPAN_IPHC_CTX_TABLE_SIZE]; | ||
| 119 | }; | ||
| 120 | |||
| 121 | static inline bool lowpan_iphc_ctx_is_active(const struct lowpan_iphc_ctx *ctx) | ||
| 122 | { | ||
| 123 | return test_bit(LOWPAN_IPHC_CTX_FLAG_ACTIVE, &ctx->flags); | ||
| 124 | } | ||
| 125 | |||
| 126 | static inline bool | ||
| 127 | lowpan_iphc_ctx_is_compression(const struct lowpan_iphc_ctx *ctx) | ||
| 128 | { | ||
| 129 | return test_bit(LOWPAN_IPHC_CTX_FLAG_COMPRESSION, &ctx->flags); | ||
| 130 | } | ||
| 131 | |||
| 101 | struct lowpan_priv { | 132 | struct lowpan_priv { |
| 102 | enum lowpan_lltypes lltype; | 133 | enum lowpan_lltypes lltype; |
| 103 | struct dentry *iface_debugfs; | 134 | struct dentry *iface_debugfs; |
| 135 | struct lowpan_iphc_ctx_table ctx; | ||
| 104 | 136 | ||
| 105 | /* must be last */ | 137 | /* must be last */ |
| 106 | u8 priv[0] __aligned(sizeof(void *)); | 138 | u8 priv[0] __aligned(sizeof(void *)); |
diff --git a/include/net/act_api.h b/include/net/act_api.h index 9d446f136607..2a19fe111c78 100644 --- a/include/net/act_api.h +++ b/include/net/act_api.h | |||
| @@ -7,6 +7,8 @@ | |||
| 7 | 7 | ||
| 8 | #include <net/sch_generic.h> | 8 | #include <net/sch_generic.h> |
| 9 | #include <net/pkt_sched.h> | 9 | #include <net/pkt_sched.h> |
| 10 | #include <net/net_namespace.h> | ||
| 11 | #include <net/netns/generic.h> | ||
| 10 | 12 | ||
| 11 | struct tcf_common { | 13 | struct tcf_common { |
| 12 | struct hlist_node tcfc_head; | 14 | struct hlist_node tcfc_head; |
| @@ -65,11 +67,6 @@ static inline int tcf_hashinfo_init(struct tcf_hashinfo *hf, unsigned int mask) | |||
| 65 | return 0; | 67 | return 0; |
| 66 | } | 68 | } |
| 67 | 69 | ||
| 68 | static inline void tcf_hashinfo_destroy(struct tcf_hashinfo *hf) | ||
| 69 | { | ||
| 70 | kfree(hf->htab); | ||
| 71 | } | ||
| 72 | |||
| 73 | /* Update lastuse only if needed, to avoid dirtying a cache line. | 70 | /* Update lastuse only if needed, to avoid dirtying a cache line. |
| 74 | * We use a temp variable to avoid fetching jiffies twice. | 71 | * We use a temp variable to avoid fetching jiffies twice. |
| 75 | */ | 72 | */ |
| @@ -81,42 +78,76 @@ static inline void tcf_lastuse_update(struct tcf_t *tm) | |||
| 81 | tm->lastuse = now; | 78 | tm->lastuse = now; |
| 82 | } | 79 | } |
| 83 | 80 | ||
| 84 | #ifdef CONFIG_NET_CLS_ACT | ||
| 85 | |||
| 86 | #define ACT_P_CREATED 1 | ||
| 87 | #define ACT_P_DELETED 1 | ||
| 88 | |||
| 89 | struct tc_action { | 81 | struct tc_action { |
| 90 | void *priv; | 82 | void *priv; |
| 91 | const struct tc_action_ops *ops; | 83 | const struct tc_action_ops *ops; |
| 92 | __u32 type; /* for backward compat(TCA_OLD_COMPAT) */ | 84 | __u32 type; /* for backward compat(TCA_OLD_COMPAT) */ |
| 93 | __u32 order; | 85 | __u32 order; |
| 94 | struct list_head list; | 86 | struct list_head list; |
| 87 | struct tcf_hashinfo *hinfo; | ||
| 95 | }; | 88 | }; |
| 96 | 89 | ||
| 90 | #ifdef CONFIG_NET_CLS_ACT | ||
| 91 | |||
| 92 | #define ACT_P_CREATED 1 | ||
| 93 | #define ACT_P_DELETED 1 | ||
| 94 | |||
| 97 | struct tc_action_ops { | 95 | struct tc_action_ops { |
| 98 | struct list_head head; | 96 | struct list_head head; |
| 99 | struct tcf_hashinfo *hinfo; | ||
| 100 | char kind[IFNAMSIZ]; | 97 | char kind[IFNAMSIZ]; |
| 101 | __u32 type; /* TBD to match kind */ | 98 | __u32 type; /* TBD to match kind */ |
| 102 | struct module *owner; | 99 | struct module *owner; |
| 103 | int (*act)(struct sk_buff *, const struct tc_action *, struct tcf_result *); | 100 | int (*act)(struct sk_buff *, const struct tc_action *, struct tcf_result *); |
| 104 | int (*dump)(struct sk_buff *, struct tc_action *, int, int); | 101 | int (*dump)(struct sk_buff *, struct tc_action *, int, int); |
| 105 | void (*cleanup)(struct tc_action *, int bind); | 102 | void (*cleanup)(struct tc_action *, int bind); |
| 106 | int (*lookup)(struct tc_action *, u32); | 103 | int (*lookup)(struct net *, struct tc_action *, u32); |
| 107 | int (*init)(struct net *net, struct nlattr *nla, | 104 | int (*init)(struct net *net, struct nlattr *nla, |
| 108 | struct nlattr *est, struct tc_action *act, int ovr, | 105 | struct nlattr *est, struct tc_action *act, int ovr, |
| 109 | int bind); | 106 | int bind); |
| 110 | int (*walk)(struct sk_buff *, struct netlink_callback *, int, struct tc_action *); | 107 | int (*walk)(struct net *, struct sk_buff *, |
| 108 | struct netlink_callback *, int, struct tc_action *); | ||
| 109 | }; | ||
| 110 | |||
| 111 | struct tc_action_net { | ||
| 112 | struct tcf_hashinfo *hinfo; | ||
| 113 | const struct tc_action_ops *ops; | ||
| 111 | }; | 114 | }; |
| 112 | 115 | ||
| 113 | int tcf_hash_search(struct tc_action *a, u32 index); | 116 | static inline |
| 114 | u32 tcf_hash_new_index(struct tcf_hashinfo *hinfo); | 117 | int tc_action_net_init(struct tc_action_net *tn, const struct tc_action_ops *ops, |
| 115 | int tcf_hash_check(u32 index, struct tc_action *a, int bind); | 118 | unsigned int mask) |
| 116 | int tcf_hash_create(u32 index, struct nlattr *est, struct tc_action *a, | 119 | { |
| 117 | int size, int bind, bool cpustats); | 120 | int err = 0; |
| 121 | |||
| 122 | tn->hinfo = kmalloc(sizeof(*tn->hinfo), GFP_KERNEL); | ||
| 123 | if (!tn->hinfo) | ||
| 124 | return -ENOMEM; | ||
| 125 | tn->ops = ops; | ||
| 126 | err = tcf_hashinfo_init(tn->hinfo, mask); | ||
| 127 | if (err) | ||
| 128 | kfree(tn->hinfo); | ||
| 129 | return err; | ||
| 130 | } | ||
| 131 | |||
| 132 | void tcf_hashinfo_destroy(const struct tc_action_ops *ops, | ||
| 133 | struct tcf_hashinfo *hinfo); | ||
| 134 | |||
| 135 | static inline void tc_action_net_exit(struct tc_action_net *tn) | ||
| 136 | { | ||
| 137 | tcf_hashinfo_destroy(tn->ops, tn->hinfo); | ||
| 138 | } | ||
| 139 | |||
| 140 | int tcf_generic_walker(struct tc_action_net *tn, struct sk_buff *skb, | ||
| 141 | struct netlink_callback *cb, int type, | ||
| 142 | struct tc_action *a); | ||
| 143 | int tcf_hash_search(struct tc_action_net *tn, struct tc_action *a, u32 index); | ||
| 144 | u32 tcf_hash_new_index(struct tc_action_net *tn); | ||
| 145 | int tcf_hash_check(struct tc_action_net *tn, u32 index, struct tc_action *a, | ||
| 146 | int bind); | ||
| 147 | int tcf_hash_create(struct tc_action_net *tn, u32 index, struct nlattr *est, | ||
| 148 | struct tc_action *a, int size, int bind, bool cpustats); | ||
| 118 | void tcf_hash_cleanup(struct tc_action *a, struct nlattr *est); | 149 | void tcf_hash_cleanup(struct tc_action *a, struct nlattr *est); |
| 119 | void tcf_hash_insert(struct tc_action *a); | 150 | void tcf_hash_insert(struct tc_action_net *tn, struct tc_action *a); |
| 120 | 151 | ||
| 121 | int __tcf_hash_release(struct tc_action *a, bool bind, bool strict); | 152 | int __tcf_hash_release(struct tc_action *a, bool bind, bool strict); |
| 122 | 153 | ||
| @@ -125,8 +156,8 @@ static inline int tcf_hash_release(struct tc_action *a, bool bind) | |||
| 125 | return __tcf_hash_release(a, bind, false); | 156 | return __tcf_hash_release(a, bind, false); |
| 126 | } | 157 | } |
| 127 | 158 | ||
| 128 | int tcf_register_action(struct tc_action_ops *a, unsigned int mask); | 159 | int tcf_register_action(struct tc_action_ops *a, struct pernet_operations *ops); |
| 129 | int tcf_unregister_action(struct tc_action_ops *a); | 160 | int tcf_unregister_action(struct tc_action_ops *a, struct pernet_operations *ops); |
| 130 | int tcf_action_destroy(struct list_head *actions, int bind); | 161 | int tcf_action_destroy(struct list_head *actions, int bind); |
| 131 | int tcf_action_exec(struct sk_buff *skb, const struct list_head *actions, | 162 | int tcf_action_exec(struct sk_buff *skb, const struct list_head *actions, |
| 132 | struct tcf_result *res); | 163 | struct tcf_result *res); |
| @@ -140,5 +171,16 @@ int tcf_action_dump(struct sk_buff *skb, struct list_head *, int, int); | |||
| 140 | int tcf_action_dump_old(struct sk_buff *skb, struct tc_action *a, int, int); | 171 | int tcf_action_dump_old(struct sk_buff *skb, struct tc_action *a, int, int); |
| 141 | int tcf_action_dump_1(struct sk_buff *skb, struct tc_action *a, int, int); | 172 | int tcf_action_dump_1(struct sk_buff *skb, struct tc_action *a, int, int); |
| 142 | int tcf_action_copy_stats(struct sk_buff *, struct tc_action *, int); | 173 | int tcf_action_copy_stats(struct sk_buff *, struct tc_action *, int); |
| 174 | |||
| 175 | #define tc_no_actions(_exts) \ | ||
| 176 | (list_empty(&(_exts)->actions)) | ||
| 177 | |||
| 178 | #define tc_for_each_action(_a, _exts) \ | ||
| 179 | list_for_each_entry(a, &(_exts)->actions, list) | ||
| 180 | #else /* CONFIG_NET_CLS_ACT */ | ||
| 181 | |||
| 182 | #define tc_no_actions(_exts) true | ||
| 183 | #define tc_for_each_action(_a, _exts) while (0) | ||
| 184 | |||
| 143 | #endif /* CONFIG_NET_CLS_ACT */ | 185 | #endif /* CONFIG_NET_CLS_ACT */ |
| 144 | #endif | 186 | #endif |
diff --git a/include/net/addrconf.h b/include/net/addrconf.h index 47f52d3cd8df..730d856683e5 100644 --- a/include/net/addrconf.h +++ b/include/net/addrconf.h | |||
| @@ -87,6 +87,8 @@ int __ipv6_get_lladdr(struct inet6_dev *idev, struct in6_addr *addr, | |||
| 87 | u32 banned_flags); | 87 | u32 banned_flags); |
| 88 | int ipv6_get_lladdr(struct net_device *dev, struct in6_addr *addr, | 88 | int ipv6_get_lladdr(struct net_device *dev, struct in6_addr *addr, |
| 89 | u32 banned_flags); | 89 | u32 banned_flags); |
| 90 | int ipv4_rcv_saddr_equal(const struct sock *sk, const struct sock *sk2, | ||
| 91 | bool match_wildcard); | ||
| 90 | int ipv6_rcv_saddr_equal(const struct sock *sk, const struct sock *sk2, | 92 | int ipv6_rcv_saddr_equal(const struct sock *sk, const struct sock *sk2, |
| 91 | bool match_wildcard); | 93 | bool match_wildcard); |
| 92 | void addrconf_join_solict(struct net_device *dev, const struct in6_addr *addr); | 94 | void addrconf_join_solict(struct net_device *dev, const struct in6_addr *addr); |
diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h index 339ea57be423..5d38d980b89d 100644 --- a/include/net/bluetooth/hci.h +++ b/include/net/bluetooth/hci.h | |||
| @@ -233,6 +233,7 @@ enum { | |||
| 233 | HCI_SC_ENABLED, | 233 | HCI_SC_ENABLED, |
| 234 | HCI_SC_ONLY, | 234 | HCI_SC_ONLY, |
| 235 | HCI_PRIVACY, | 235 | HCI_PRIVACY, |
| 236 | HCI_LIMITED_PRIVACY, | ||
| 236 | HCI_RPA_EXPIRED, | 237 | HCI_RPA_EXPIRED, |
| 237 | HCI_RPA_RESOLVING, | 238 | HCI_RPA_RESOLVING, |
| 238 | HCI_HS_ENABLED, | 239 | HCI_HS_ENABLED, |
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index d4f82edb5cff..dc71473462ac 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h | |||
| @@ -25,6 +25,7 @@ | |||
| 25 | #ifndef __HCI_CORE_H | 25 | #ifndef __HCI_CORE_H |
| 26 | #define __HCI_CORE_H | 26 | #define __HCI_CORE_H |
| 27 | 27 | ||
| 28 | #include <linux/leds.h> | ||
| 28 | #include <net/bluetooth/hci.h> | 29 | #include <net/bluetooth/hci.h> |
| 29 | #include <net/bluetooth/hci_sock.h> | 30 | #include <net/bluetooth/hci_sock.h> |
| 30 | 31 | ||
| @@ -396,6 +397,8 @@ struct hci_dev { | |||
| 396 | struct delayed_work rpa_expired; | 397 | struct delayed_work rpa_expired; |
| 397 | bdaddr_t rpa; | 398 | bdaddr_t rpa; |
| 398 | 399 | ||
| 400 | struct led_trigger *power_led; | ||
| 401 | |||
| 399 | int (*open)(struct hci_dev *hdev); | 402 | int (*open)(struct hci_dev *hdev); |
| 400 | int (*close)(struct hci_dev *hdev); | 403 | int (*close)(struct hci_dev *hdev); |
| 401 | int (*flush)(struct hci_dev *hdev); | 404 | int (*flush)(struct hci_dev *hdev); |
diff --git a/include/net/bond_3ad.h b/include/net/bond_3ad.h index f1fbc3b11962..f358ad5e4214 100644 --- a/include/net/bond_3ad.h +++ b/include/net/bond_3ad.h | |||
| @@ -306,5 +306,6 @@ int bond_3ad_lacpdu_recv(const struct sk_buff *skb, struct bonding *bond, | |||
| 306 | struct slave *slave); | 306 | struct slave *slave); |
| 307 | int bond_3ad_set_carrier(struct bonding *bond); | 307 | int bond_3ad_set_carrier(struct bonding *bond); |
| 308 | void bond_3ad_update_lacp_rate(struct bonding *bond); | 308 | void bond_3ad_update_lacp_rate(struct bonding *bond); |
| 309 | void bond_3ad_update_ad_actor_settings(struct bonding *bond); | ||
| 309 | #endif /* _NET_BOND_3AD_H */ | 310 | #endif /* _NET_BOND_3AD_H */ |
| 310 | 311 | ||
diff --git a/include/net/bonding.h b/include/net/bonding.h index ee6c52053aa3..791800ddd6d9 100644 --- a/include/net/bonding.h +++ b/include/net/bonding.h | |||
| @@ -215,6 +215,7 @@ struct bonding { | |||
| 215 | * ALB mode (6) - to sync the use and modifications of its hash table | 215 | * ALB mode (6) - to sync the use and modifications of its hash table |
| 216 | */ | 216 | */ |
| 217 | spinlock_t mode_lock; | 217 | spinlock_t mode_lock; |
| 218 | spinlock_t stats_lock; | ||
| 218 | u8 send_peer_notif; | 219 | u8 send_peer_notif; |
| 219 | u8 igmp_retrans; | 220 | u8 igmp_retrans; |
| 220 | #ifdef CONFIG_PROC_FS | 221 | #ifdef CONFIG_PROC_FS |
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index 9bcaaf7cd15a..9e1b24c29f0c 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h | |||
| @@ -712,6 +712,8 @@ struct cfg80211_acl_data { | |||
| 712 | * @p2p_opp_ps: P2P opportunistic PS | 712 | * @p2p_opp_ps: P2P opportunistic PS |
| 713 | * @acl: ACL configuration used by the drivers which has support for | 713 | * @acl: ACL configuration used by the drivers which has support for |
| 714 | * MAC address based access control | 714 | * MAC address based access control |
| 715 | * @pbss: If set, start as a PCP instead of AP. Relevant for DMG | ||
| 716 | * networks. | ||
| 715 | */ | 717 | */ |
| 716 | struct cfg80211_ap_settings { | 718 | struct cfg80211_ap_settings { |
| 717 | struct cfg80211_chan_def chandef; | 719 | struct cfg80211_chan_def chandef; |
| @@ -730,6 +732,7 @@ struct cfg80211_ap_settings { | |||
| 730 | u8 p2p_ctwindow; | 732 | u8 p2p_ctwindow; |
| 731 | bool p2p_opp_ps; | 733 | bool p2p_opp_ps; |
| 732 | const struct cfg80211_acl_data *acl; | 734 | const struct cfg80211_acl_data *acl; |
| 735 | bool pbss; | ||
| 733 | }; | 736 | }; |
| 734 | 737 | ||
| 735 | /** | 738 | /** |
| @@ -1888,6 +1891,8 @@ struct cfg80211_ibss_params { | |||
| 1888 | * @ht_capa_mask: The bits of ht_capa which are to be used. | 1891 | * @ht_capa_mask: The bits of ht_capa which are to be used. |
| 1889 | * @vht_capa: VHT Capability overrides | 1892 | * @vht_capa: VHT Capability overrides |
| 1890 | * @vht_capa_mask: The bits of vht_capa which are to be used. | 1893 | * @vht_capa_mask: The bits of vht_capa which are to be used. |
| 1894 | * @pbss: if set, connect to a PCP instead of AP. Valid for DMG | ||
| 1895 | * networks. | ||
| 1891 | */ | 1896 | */ |
| 1892 | struct cfg80211_connect_params { | 1897 | struct cfg80211_connect_params { |
| 1893 | struct ieee80211_channel *channel; | 1898 | struct ieee80211_channel *channel; |
| @@ -1910,6 +1915,7 @@ struct cfg80211_connect_params { | |||
| 1910 | struct ieee80211_ht_cap ht_capa_mask; | 1915 | struct ieee80211_ht_cap ht_capa_mask; |
| 1911 | struct ieee80211_vht_cap vht_capa; | 1916 | struct ieee80211_vht_cap vht_capa; |
| 1912 | struct ieee80211_vht_cap vht_capa_mask; | 1917 | struct ieee80211_vht_cap vht_capa_mask; |
| 1918 | bool pbss; | ||
| 1913 | }; | 1919 | }; |
| 1914 | 1920 | ||
| 1915 | /** | 1921 | /** |
| @@ -3489,6 +3495,7 @@ struct cfg80211_cached_keys; | |||
| 3489 | * registered for unexpected class 3 frames (AP mode) | 3495 | * registered for unexpected class 3 frames (AP mode) |
| 3490 | * @conn: (private) cfg80211 software SME connection state machine data | 3496 | * @conn: (private) cfg80211 software SME connection state machine data |
| 3491 | * @connect_keys: (private) keys to set after connection is established | 3497 | * @connect_keys: (private) keys to set after connection is established |
| 3498 | * @conn_bss_type: connecting/connected BSS type | ||
| 3492 | * @ibss_fixed: (private) IBSS is using fixed BSSID | 3499 | * @ibss_fixed: (private) IBSS is using fixed BSSID |
| 3493 | * @ibss_dfs_possible: (private) IBSS may change to a DFS channel | 3500 | * @ibss_dfs_possible: (private) IBSS may change to a DFS channel |
| 3494 | * @event_list: (private) list for internal event processing | 3501 | * @event_list: (private) list for internal event processing |
| @@ -3519,6 +3526,7 @@ struct wireless_dev { | |||
| 3519 | u8 ssid_len, mesh_id_len, mesh_id_up_len; | 3526 | u8 ssid_len, mesh_id_len, mesh_id_up_len; |
| 3520 | struct cfg80211_conn *conn; | 3527 | struct cfg80211_conn *conn; |
| 3521 | struct cfg80211_cached_keys *connect_keys; | 3528 | struct cfg80211_cached_keys *connect_keys; |
| 3529 | enum ieee80211_bss_type conn_bss_type; | ||
| 3522 | 3530 | ||
| 3523 | struct list_head event_list; | 3531 | struct list_head event_list; |
| 3524 | spinlock_t event_lock; | 3532 | spinlock_t event_lock; |
diff --git a/include/net/checksum.h b/include/net/checksum.h index 10a16b5bd1c7..5c30891e84e5 100644 --- a/include/net/checksum.h +++ b/include/net/checksum.h | |||
| @@ -88,8 +88,11 @@ static inline __wsum | |||
| 88 | csum_block_add(__wsum csum, __wsum csum2, int offset) | 88 | csum_block_add(__wsum csum, __wsum csum2, int offset) |
| 89 | { | 89 | { |
| 90 | u32 sum = (__force u32)csum2; | 90 | u32 sum = (__force u32)csum2; |
| 91 | if (offset&1) | 91 | |
| 92 | sum = ((sum&0xFF00FF)<<8)+((sum>>8)&0xFF00FF); | 92 | /* rotate sum to align it with a 16b boundary */ |
| 93 | if (offset & 1) | ||
| 94 | sum = ror32(sum, 8); | ||
| 95 | |||
| 93 | return csum_add(csum, (__force __wsum)sum); | 96 | return csum_add(csum, (__force __wsum)sum); |
| 94 | } | 97 | } |
| 95 | 98 | ||
| @@ -102,10 +105,7 @@ csum_block_add_ext(__wsum csum, __wsum csum2, int offset, int len) | |||
| 102 | static inline __wsum | 105 | static inline __wsum |
| 103 | csum_block_sub(__wsum csum, __wsum csum2, int offset) | 106 | csum_block_sub(__wsum csum, __wsum csum2, int offset) |
| 104 | { | 107 | { |
| 105 | u32 sum = (__force u32)csum2; | 108 | return csum_block_add(csum, ~csum2, offset); |
| 106 | if (offset&1) | ||
| 107 | sum = ((sum&0xFF00FF)<<8)+((sum>>8)&0xFF00FF); | ||
| 108 | return csum_sub(csum, (__force __wsum)sum); | ||
| 109 | } | 109 | } |
| 110 | 110 | ||
| 111 | static inline __wsum csum_unfold(__sum16 n) | 111 | static inline __wsum csum_unfold(__sum16 n) |
| @@ -120,6 +120,11 @@ static inline __wsum csum_partial_ext(const void *buff, int len, __wsum sum) | |||
| 120 | 120 | ||
| 121 | #define CSUM_MANGLED_0 ((__force __sum16)0xffff) | 121 | #define CSUM_MANGLED_0 ((__force __sum16)0xffff) |
| 122 | 122 | ||
| 123 | static inline void csum_replace_by_diff(__sum16 *sum, __wsum diff) | ||
| 124 | { | ||
| 125 | *sum = csum_fold(csum_add(diff, ~csum_unfold(*sum))); | ||
| 126 | } | ||
| 127 | |||
| 123 | static inline void csum_replace4(__sum16 *sum, __be32 from, __be32 to) | 128 | static inline void csum_replace4(__sum16 *sum, __be32 from, __be32 to) |
| 124 | { | 129 | { |
| 125 | __wsum tmp = csum_sub(~csum_unfold(*sum), (__force __wsum)from); | 130 | __wsum tmp = csum_sub(~csum_unfold(*sum), (__force __wsum)from); |
diff --git a/include/net/codel.h b/include/net/codel.h index 267e70210061..d168aca115cc 100644 --- a/include/net/codel.h +++ b/include/net/codel.h | |||
| @@ -162,12 +162,14 @@ struct codel_vars { | |||
| 162 | * struct codel_stats - contains codel shared variables and stats | 162 | * struct codel_stats - contains codel shared variables and stats |
| 163 | * @maxpacket: largest packet we've seen so far | 163 | * @maxpacket: largest packet we've seen so far |
| 164 | * @drop_count: temp count of dropped packets in dequeue() | 164 | * @drop_count: temp count of dropped packets in dequeue() |
| 165 | * @drop_len: bytes of dropped packets in dequeue() | ||
| 165 | * ecn_mark: number of packets we ECN marked instead of dropping | 166 | * ecn_mark: number of packets we ECN marked instead of dropping |
| 166 | * ce_mark: number of packets CE marked because sojourn time was above ce_threshold | 167 | * ce_mark: number of packets CE marked because sojourn time was above ce_threshold |
| 167 | */ | 168 | */ |
| 168 | struct codel_stats { | 169 | struct codel_stats { |
| 169 | u32 maxpacket; | 170 | u32 maxpacket; |
| 170 | u32 drop_count; | 171 | u32 drop_count; |
| 172 | u32 drop_len; | ||
| 171 | u32 ecn_mark; | 173 | u32 ecn_mark; |
| 172 | u32 ce_mark; | 174 | u32 ce_mark; |
| 173 | }; | 175 | }; |
| @@ -308,6 +310,7 @@ static struct sk_buff *codel_dequeue(struct Qdisc *sch, | |||
| 308 | vars->rec_inv_sqrt); | 310 | vars->rec_inv_sqrt); |
| 309 | goto end; | 311 | goto end; |
| 310 | } | 312 | } |
| 313 | stats->drop_len += qdisc_pkt_len(skb); | ||
| 311 | qdisc_drop(skb, sch); | 314 | qdisc_drop(skb, sch); |
| 312 | stats->drop_count++; | 315 | stats->drop_count++; |
| 313 | skb = dequeue_func(vars, sch); | 316 | skb = dequeue_func(vars, sch); |
| @@ -330,6 +333,7 @@ static struct sk_buff *codel_dequeue(struct Qdisc *sch, | |||
| 330 | if (params->ecn && INET_ECN_set_ce(skb)) { | 333 | if (params->ecn && INET_ECN_set_ce(skb)) { |
| 331 | stats->ecn_mark++; | 334 | stats->ecn_mark++; |
| 332 | } else { | 335 | } else { |
| 336 | stats->drop_len += qdisc_pkt_len(skb); | ||
| 333 | qdisc_drop(skb, sch); | 337 | qdisc_drop(skb, sch); |
| 334 | stats->drop_count++; | 338 | stats->drop_count++; |
| 335 | 339 | ||
diff --git a/include/net/devlink.h b/include/net/devlink.h new file mode 100644 index 000000000000..c37d257891d6 --- /dev/null +++ b/include/net/devlink.h | |||
| @@ -0,0 +1,140 @@ | |||
| 1 | /* | ||
| 2 | * include/net/devlink.h - Network physical device Netlink interface | ||
| 3 | * Copyright (c) 2016 Mellanox Technologies. All rights reserved. | ||
| 4 | * Copyright (c) 2016 Jiri Pirko <jiri@mellanox.com> | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License as published by | ||
| 8 | * the Free Software Foundation; either version 2 of the License, or | ||
| 9 | * (at your option) any later version. | ||
| 10 | */ | ||
| 11 | #ifndef _NET_DEVLINK_H_ | ||
| 12 | #define _NET_DEVLINK_H_ | ||
| 13 | |||
| 14 | #include <linux/device.h> | ||
| 15 | #include <linux/slab.h> | ||
| 16 | #include <linux/gfp.h> | ||
| 17 | #include <linux/list.h> | ||
| 18 | #include <linux/netdevice.h> | ||
| 19 | #include <net/net_namespace.h> | ||
| 20 | #include <uapi/linux/devlink.h> | ||
| 21 | |||
| 22 | struct devlink_ops; | ||
| 23 | |||
| 24 | struct devlink { | ||
| 25 | struct list_head list; | ||
| 26 | struct list_head port_list; | ||
| 27 | const struct devlink_ops *ops; | ||
| 28 | struct device *dev; | ||
| 29 | possible_net_t _net; | ||
| 30 | char priv[0] __aligned(NETDEV_ALIGN); | ||
| 31 | }; | ||
| 32 | |||
| 33 | struct devlink_port { | ||
| 34 | struct list_head list; | ||
| 35 | struct devlink *devlink; | ||
| 36 | unsigned index; | ||
| 37 | bool registered; | ||
| 38 | enum devlink_port_type type; | ||
| 39 | enum devlink_port_type desired_type; | ||
| 40 | void *type_dev; | ||
| 41 | bool split; | ||
| 42 | u32 split_group; | ||
| 43 | }; | ||
| 44 | |||
| 45 | struct devlink_ops { | ||
| 46 | size_t priv_size; | ||
| 47 | int (*port_type_set)(struct devlink_port *devlink_port, | ||
| 48 | enum devlink_port_type port_type); | ||
| 49 | int (*port_split)(struct devlink *devlink, unsigned int port_index, | ||
| 50 | unsigned int count); | ||
| 51 | int (*port_unsplit)(struct devlink *devlink, unsigned int port_index); | ||
| 52 | }; | ||
| 53 | |||
| 54 | static inline void *devlink_priv(struct devlink *devlink) | ||
| 55 | { | ||
| 56 | BUG_ON(!devlink); | ||
| 57 | return &devlink->priv; | ||
| 58 | } | ||
| 59 | |||
| 60 | static inline struct devlink *priv_to_devlink(void *priv) | ||
| 61 | { | ||
| 62 | BUG_ON(!priv); | ||
| 63 | return container_of(priv, struct devlink, priv); | ||
| 64 | } | ||
| 65 | |||
| 66 | struct ib_device; | ||
| 67 | |||
| 68 | #if IS_ENABLED(CONFIG_NET_DEVLINK) | ||
| 69 | |||
| 70 | struct devlink *devlink_alloc(const struct devlink_ops *ops, size_t priv_size); | ||
| 71 | int devlink_register(struct devlink *devlink, struct device *dev); | ||
| 72 | void devlink_unregister(struct devlink *devlink); | ||
| 73 | void devlink_free(struct devlink *devlink); | ||
| 74 | int devlink_port_register(struct devlink *devlink, | ||
| 75 | struct devlink_port *devlink_port, | ||
| 76 | unsigned int port_index); | ||
| 77 | void devlink_port_unregister(struct devlink_port *devlink_port); | ||
| 78 | void devlink_port_type_eth_set(struct devlink_port *devlink_port, | ||
| 79 | struct net_device *netdev); | ||
| 80 | void devlink_port_type_ib_set(struct devlink_port *devlink_port, | ||
| 81 | struct ib_device *ibdev); | ||
| 82 | void devlink_port_type_clear(struct devlink_port *devlink_port); | ||
| 83 | void devlink_port_split_set(struct devlink_port *devlink_port, | ||
| 84 | u32 split_group); | ||
| 85 | |||
| 86 | #else | ||
| 87 | |||
| 88 | static inline struct devlink *devlink_alloc(const struct devlink_ops *ops, | ||
| 89 | size_t priv_size) | ||
| 90 | { | ||
| 91 | return kzalloc(sizeof(struct devlink) + priv_size, GFP_KERNEL); | ||
| 92 | } | ||
| 93 | |||
| 94 | static inline int devlink_register(struct devlink *devlink, struct device *dev) | ||
| 95 | { | ||
| 96 | return 0; | ||
| 97 | } | ||
| 98 | |||
| 99 | static inline void devlink_unregister(struct devlink *devlink) | ||
| 100 | { | ||
| 101 | } | ||
| 102 | |||
| 103 | static inline void devlink_free(struct devlink *devlink) | ||
| 104 | { | ||
| 105 | kfree(devlink); | ||
| 106 | } | ||
| 107 | |||
| 108 | static inline int devlink_port_register(struct devlink *devlink, | ||
| 109 | struct devlink_port *devlink_port, | ||
| 110 | unsigned int port_index) | ||
| 111 | { | ||
| 112 | return 0; | ||
| 113 | } | ||
| 114 | |||
| 115 | static inline void devlink_port_unregister(struct devlink_port *devlink_port) | ||
| 116 | { | ||
| 117 | } | ||
| 118 | |||
| 119 | static inline void devlink_port_type_eth_set(struct devlink_port *devlink_port, | ||
| 120 | struct net_device *netdev) | ||
| 121 | { | ||
| 122 | } | ||
| 123 | |||
| 124 | static inline void devlink_port_type_ib_set(struct devlink_port *devlink_port, | ||
| 125 | struct ib_device *ibdev) | ||
| 126 | { | ||
| 127 | } | ||
| 128 | |||
| 129 | static inline void devlink_port_type_clear(struct devlink_port *devlink_port) | ||
| 130 | { | ||
| 131 | } | ||
| 132 | |||
| 133 | static inline void devlink_port_split_set(struct devlink_port *devlink_port, | ||
| 134 | u32 split_group) | ||
| 135 | { | ||
| 136 | } | ||
| 137 | |||
| 138 | #endif | ||
| 139 | |||
| 140 | #endif /* _NET_DEVLINK_H_ */ | ||
diff --git a/include/net/dsa.h b/include/net/dsa.h index 26a0e86e611e..6463bb2863ac 100644 --- a/include/net/dsa.h +++ b/include/net/dsa.h | |||
| @@ -296,16 +296,17 @@ struct dsa_switch_driver { | |||
| 296 | /* | 296 | /* |
| 297 | * Bridge integration | 297 | * Bridge integration |
| 298 | */ | 298 | */ |
| 299 | int (*port_join_bridge)(struct dsa_switch *ds, int port, | 299 | int (*port_bridge_join)(struct dsa_switch *ds, int port, |
| 300 | u32 br_port_mask); | 300 | struct net_device *bridge); |
| 301 | int (*port_leave_bridge)(struct dsa_switch *ds, int port, | 301 | void (*port_bridge_leave)(struct dsa_switch *ds, int port); |
| 302 | u32 br_port_mask); | ||
| 303 | int (*port_stp_update)(struct dsa_switch *ds, int port, | 302 | int (*port_stp_update)(struct dsa_switch *ds, int port, |
| 304 | u8 state); | 303 | u8 state); |
| 305 | 304 | ||
| 306 | /* | 305 | /* |
| 307 | * VLAN support | 306 | * VLAN support |
| 308 | */ | 307 | */ |
| 308 | int (*port_vlan_filtering)(struct dsa_switch *ds, int port, | ||
| 309 | bool vlan_filtering); | ||
| 309 | int (*port_vlan_prepare)(struct dsa_switch *ds, int port, | 310 | int (*port_vlan_prepare)(struct dsa_switch *ds, int port, |
| 310 | const struct switchdev_obj_port_vlan *vlan, | 311 | const struct switchdev_obj_port_vlan *vlan, |
| 311 | struct switchdev_trans *trans); | 312 | struct switchdev_trans *trans); |
| @@ -314,9 +315,9 @@ struct dsa_switch_driver { | |||
| 314 | struct switchdev_trans *trans); | 315 | struct switchdev_trans *trans); |
| 315 | int (*port_vlan_del)(struct dsa_switch *ds, int port, | 316 | int (*port_vlan_del)(struct dsa_switch *ds, int port, |
| 316 | const struct switchdev_obj_port_vlan *vlan); | 317 | const struct switchdev_obj_port_vlan *vlan); |
| 317 | int (*port_pvid_get)(struct dsa_switch *ds, int port, u16 *pvid); | 318 | int (*port_vlan_dump)(struct dsa_switch *ds, int port, |
| 318 | int (*vlan_getnext)(struct dsa_switch *ds, u16 *vid, | 319 | struct switchdev_obj_port_vlan *vlan, |
| 319 | unsigned long *ports, unsigned long *untagged); | 320 | int (*cb)(struct switchdev_obj *obj)); |
| 320 | 321 | ||
| 321 | /* | 322 | /* |
| 322 | * Forwarding database | 323 | * Forwarding database |
diff --git a/include/net/dst.h b/include/net/dst.h index c7329dcd90cc..5c98443c1c9e 100644 --- a/include/net/dst.h +++ b/include/net/dst.h | |||
| @@ -398,6 +398,18 @@ static inline void skb_tunnel_rx(struct sk_buff *skb, struct net_device *dev, | |||
| 398 | __skb_tunnel_rx(skb, dev, net); | 398 | __skb_tunnel_rx(skb, dev, net); |
| 399 | } | 399 | } |
| 400 | 400 | ||
| 401 | static inline u32 dst_tclassid(const struct sk_buff *skb) | ||
| 402 | { | ||
| 403 | #ifdef CONFIG_IP_ROUTE_CLASSID | ||
| 404 | const struct dst_entry *dst; | ||
| 405 | |||
| 406 | dst = skb_dst(skb); | ||
| 407 | if (dst) | ||
| 408 | return dst->tclassid; | ||
| 409 | #endif | ||
| 410 | return 0; | ||
| 411 | } | ||
| 412 | |||
| 401 | int dst_discard_out(struct net *net, struct sock *sk, struct sk_buff *skb); | 413 | int dst_discard_out(struct net *net, struct sock *sk, struct sk_buff *skb); |
| 402 | static inline int dst_discard(struct sk_buff *skb) | 414 | static inline int dst_discard(struct sk_buff *skb) |
| 403 | { | 415 | { |
diff --git a/include/net/dst_cache.h b/include/net/dst_cache.h new file mode 100644 index 000000000000..151accae708b --- /dev/null +++ b/include/net/dst_cache.h | |||
| @@ -0,0 +1,97 @@ | |||
| 1 | #ifndef _NET_DST_CACHE_H | ||
| 2 | #define _NET_DST_CACHE_H | ||
| 3 | |||
| 4 | #include <linux/jiffies.h> | ||
| 5 | #include <net/dst.h> | ||
| 6 | #if IS_ENABLED(CONFIG_IPV6) | ||
| 7 | #include <net/ip6_fib.h> | ||
| 8 | #endif | ||
| 9 | |||
| 10 | struct dst_cache { | ||
| 11 | struct dst_cache_pcpu __percpu *cache; | ||
| 12 | unsigned long reset_ts; | ||
| 13 | }; | ||
| 14 | |||
| 15 | /** | ||
| 16 | * dst_cache_get - perform cache lookup | ||
| 17 | * @dst_cache: the cache | ||
| 18 | * | ||
| 19 | * The caller should use dst_cache_get_ip4() if it need to retrieve the | ||
| 20 | * source address to be used when xmitting to the cached dst. | ||
| 21 | * local BH must be disabled. | ||
| 22 | */ | ||
| 23 | struct dst_entry *dst_cache_get(struct dst_cache *dst_cache); | ||
| 24 | |||
| 25 | /** | ||
| 26 | * dst_cache_get_ip4 - perform cache lookup and fetch ipv4 source address | ||
| 27 | * @dst_cache: the cache | ||
| 28 | * @saddr: return value for the retrieved source address | ||
| 29 | * | ||
| 30 | * local BH must be disabled. | ||
| 31 | */ | ||
| 32 | struct rtable *dst_cache_get_ip4(struct dst_cache *dst_cache, __be32 *saddr); | ||
| 33 | |||
| 34 | /** | ||
| 35 | * dst_cache_set_ip4 - store the ipv4 dst into the cache | ||
| 36 | * @dst_cache: the cache | ||
| 37 | * @dst: the entry to be cached | ||
| 38 | * @saddr: the source address to be stored inside the cache | ||
| 39 | * | ||
| 40 | * local BH must be disabled. | ||
| 41 | */ | ||
| 42 | void dst_cache_set_ip4(struct dst_cache *dst_cache, struct dst_entry *dst, | ||
| 43 | __be32 saddr); | ||
| 44 | |||
| 45 | #if IS_ENABLED(CONFIG_IPV6) | ||
| 46 | |||
| 47 | /** | ||
| 48 | * dst_cache_set_ip6 - store the ipv6 dst into the cache | ||
| 49 | * @dst_cache: the cache | ||
| 50 | * @dst: the entry to be cached | ||
| 51 | * @saddr: the source address to be stored inside the cache | ||
| 52 | * | ||
| 53 | * local BH must be disabled. | ||
| 54 | */ | ||
| 55 | void dst_cache_set_ip6(struct dst_cache *dst_cache, struct dst_entry *dst, | ||
| 56 | const struct in6_addr *addr); | ||
| 57 | |||
| 58 | /** | ||
| 59 | * dst_cache_get_ip6 - perform cache lookup and fetch ipv6 source address | ||
| 60 | * @dst_cache: the cache | ||
| 61 | * @saddr: return value for the retrieved source address | ||
| 62 | * | ||
| 63 | * local BH must be disabled. | ||
| 64 | */ | ||
| 65 | struct dst_entry *dst_cache_get_ip6(struct dst_cache *dst_cache, | ||
| 66 | struct in6_addr *saddr); | ||
| 67 | #endif | ||
| 68 | |||
| 69 | /** | ||
| 70 | * dst_cache_reset - invalidate the cache contents | ||
| 71 | * @dst_cache: the cache | ||
| 72 | * | ||
| 73 | * This do not free the cached dst to avoid races and contentions. | ||
| 74 | * the dst will be freed on later cache lookup. | ||
| 75 | */ | ||
| 76 | static inline void dst_cache_reset(struct dst_cache *dst_cache) | ||
| 77 | { | ||
| 78 | dst_cache->reset_ts = jiffies; | ||
| 79 | } | ||
| 80 | |||
| 81 | /** | ||
| 82 | * dst_cache_init - initialize the cache, allocating the required storage | ||
| 83 | * @dst_cache: the cache | ||
| 84 | * @gfp: allocation flags | ||
| 85 | */ | ||
| 86 | int dst_cache_init(struct dst_cache *dst_cache, gfp_t gfp); | ||
| 87 | |||
| 88 | /** | ||
| 89 | * dst_cache_destroy - empty the cache and free the allocated storage | ||
| 90 | * @dst_cache: the cache | ||
| 91 | * | ||
| 92 | * No synchronization is enforced: it must be called only when the cache | ||
| 93 | * is unsed. | ||
| 94 | */ | ||
| 95 | void dst_cache_destroy(struct dst_cache *dst_cache); | ||
| 96 | |||
| 97 | #endif | ||
diff --git a/include/net/dst_metadata.h b/include/net/dst_metadata.h index 30a56ab2ccfb..5db9f5910428 100644 --- a/include/net/dst_metadata.h +++ b/include/net/dst_metadata.h | |||
| @@ -62,6 +62,7 @@ static inline int skb_metadata_dst_cmp(const struct sk_buff *skb_a, | |||
| 62 | sizeof(a->u.tun_info) + a->u.tun_info.options_len); | 62 | sizeof(a->u.tun_info) + a->u.tun_info.options_len); |
| 63 | } | 63 | } |
| 64 | 64 | ||
| 65 | void metadata_dst_free(struct metadata_dst *); | ||
| 65 | struct metadata_dst *metadata_dst_alloc(u8 optslen, gfp_t flags); | 66 | struct metadata_dst *metadata_dst_alloc(u8 optslen, gfp_t flags); |
| 66 | struct metadata_dst __percpu *metadata_dst_alloc_percpu(u8 optslen, gfp_t flags); | 67 | struct metadata_dst __percpu *metadata_dst_alloc_percpu(u8 optslen, gfp_t flags); |
| 67 | 68 | ||
| @@ -125,7 +126,7 @@ static inline struct metadata_dst *ip_tun_rx_dst(struct sk_buff *skb, | |||
| 125 | 126 | ||
| 126 | ip_tunnel_key_init(&tun_dst->u.tun_info.key, | 127 | ip_tunnel_key_init(&tun_dst->u.tun_info.key, |
| 127 | iph->saddr, iph->daddr, iph->tos, iph->ttl, | 128 | iph->saddr, iph->daddr, iph->tos, iph->ttl, |
| 128 | 0, 0, tunnel_id, flags); | 129 | 0, 0, 0, tunnel_id, flags); |
| 129 | return tun_dst; | 130 | return tun_dst; |
| 130 | } | 131 | } |
| 131 | 132 | ||
| @@ -151,8 +152,11 @@ static inline struct metadata_dst *ipv6_tun_rx_dst(struct sk_buff *skb, | |||
| 151 | 152 | ||
| 152 | info->key.u.ipv6.src = ip6h->saddr; | 153 | info->key.u.ipv6.src = ip6h->saddr; |
| 153 | info->key.u.ipv6.dst = ip6h->daddr; | 154 | info->key.u.ipv6.dst = ip6h->daddr; |
| 155 | |||
| 154 | info->key.tos = ipv6_get_dsfield(ip6h); | 156 | info->key.tos = ipv6_get_dsfield(ip6h); |
| 155 | info->key.ttl = ip6h->hop_limit; | 157 | info->key.ttl = ip6h->hop_limit; |
| 158 | info->key.label = ip6_flowlabel(ip6h); | ||
| 159 | |||
| 156 | return tun_dst; | 160 | return tun_dst; |
| 157 | } | 161 | } |
| 158 | 162 | ||
diff --git a/include/net/flow_dissector.h b/include/net/flow_dissector.h index 8c8548cf5888..d3d60dccd19f 100644 --- a/include/net/flow_dissector.h +++ b/include/net/flow_dissector.h | |||
| @@ -184,4 +184,17 @@ static inline bool flow_keys_have_l4(struct flow_keys *keys) | |||
| 184 | 184 | ||
| 185 | u32 flow_hash_from_keys(struct flow_keys *keys); | 185 | u32 flow_hash_from_keys(struct flow_keys *keys); |
| 186 | 186 | ||
| 187 | static inline bool dissector_uses_key(const struct flow_dissector *flow_dissector, | ||
| 188 | enum flow_dissector_key_id key_id) | ||
| 189 | { | ||
| 190 | return flow_dissector->used_keys & (1 << key_id); | ||
| 191 | } | ||
| 192 | |||
| 193 | static inline void *skb_flow_dissector_target(struct flow_dissector *flow_dissector, | ||
| 194 | enum flow_dissector_key_id key_id, | ||
| 195 | void *target_container) | ||
| 196 | { | ||
| 197 | return ((char *)target_container) + flow_dissector->offset[key_id]; | ||
| 198 | } | ||
| 199 | |||
| 187 | #endif | 200 | #endif |
diff --git a/include/net/genetlink.h b/include/net/genetlink.h index 43c0e771f417..8d4608ce8716 100644 --- a/include/net/genetlink.h +++ b/include/net/genetlink.h | |||
| @@ -83,7 +83,6 @@ struct genl_family { | |||
| 83 | * @attrs: netlink attributes | 83 | * @attrs: netlink attributes |
| 84 | * @_net: network namespace | 84 | * @_net: network namespace |
| 85 | * @user_ptr: user pointers | 85 | * @user_ptr: user pointers |
| 86 | * @dst_sk: destination socket | ||
| 87 | */ | 86 | */ |
| 88 | struct genl_info { | 87 | struct genl_info { |
| 89 | u32 snd_seq; | 88 | u32 snd_seq; |
| @@ -94,7 +93,6 @@ struct genl_info { | |||
| 94 | struct nlattr ** attrs; | 93 | struct nlattr ** attrs; |
| 95 | possible_net_t _net; | 94 | possible_net_t _net; |
| 96 | void * user_ptr[2]; | 95 | void * user_ptr[2]; |
| 97 | struct sock * dst_sk; | ||
| 98 | }; | 96 | }; |
| 99 | 97 | ||
| 100 | static inline struct net *genl_info_net(struct genl_info *info) | 98 | static inline struct net *genl_info_net(struct genl_info *info) |
| @@ -188,8 +186,6 @@ int genl_unregister_family(struct genl_family *family); | |||
| 188 | void genl_notify(struct genl_family *family, struct sk_buff *skb, | 186 | void genl_notify(struct genl_family *family, struct sk_buff *skb, |
| 189 | struct genl_info *info, u32 group, gfp_t flags); | 187 | struct genl_info *info, u32 group, gfp_t flags); |
| 190 | 188 | ||
| 191 | struct sk_buff *genlmsg_new_unicast(size_t payload, struct genl_info *info, | ||
| 192 | gfp_t flags); | ||
| 193 | void *genlmsg_put(struct sk_buff *skb, u32 portid, u32 seq, | 189 | void *genlmsg_put(struct sk_buff *skb, u32 portid, u32 seq, |
| 194 | struct genl_family *family, int flags, u8 cmd); | 190 | struct genl_family *family, int flags, u8 cmd); |
| 195 | 191 | ||
diff --git a/include/net/hwbm.h b/include/net/hwbm.h new file mode 100644 index 000000000000..47d08662501b --- /dev/null +++ b/include/net/hwbm.h | |||
| @@ -0,0 +1,28 @@ | |||
| 1 | #ifndef _HWBM_H | ||
| 2 | #define _HWBM_H | ||
| 3 | |||
| 4 | struct hwbm_pool { | ||
| 5 | /* Capacity of the pool */ | ||
| 6 | int size; | ||
| 7 | /* Size of the buffers managed */ | ||
| 8 | int frag_size; | ||
| 9 | /* Number of buffers currently used by this pool */ | ||
| 10 | int buf_num; | ||
| 11 | /* constructor called during alocation */ | ||
| 12 | int (*construct)(struct hwbm_pool *bm_pool, void *buf); | ||
| 13 | /* protect acces to the buffer counter*/ | ||
| 14 | spinlock_t lock; | ||
| 15 | /* private data */ | ||
| 16 | void *priv; | ||
| 17 | }; | ||
| 18 | #ifdef CONFIG_HWBM | ||
| 19 | void hwbm_buf_free(struct hwbm_pool *bm_pool, void *buf); | ||
| 20 | int hwbm_pool_refill(struct hwbm_pool *bm_pool, gfp_t gfp); | ||
| 21 | int hwbm_pool_add(struct hwbm_pool *bm_pool, unsigned int buf_num, gfp_t gfp); | ||
| 22 | #else | ||
| 23 | void hwbm_buf_free(struct hwbm_pool *bm_pool, void *buf) {} | ||
| 24 | int hwbm_pool_refill(struct hwbm_pool *bm_pool, gfp_t gfp) { return 0; } | ||
| 25 | int hwbm_pool_add(struct hwbm_pool *bm_pool, unsigned int buf_num, gfp_t gfp) | ||
| 26 | { return 0; } | ||
| 27 | #endif /* CONFIG_HWBM */ | ||
| 28 | #endif /* _HWBM_H */ | ||
diff --git a/include/net/inet6_hashtables.h b/include/net/inet6_hashtables.h index 7ff588ca6817..28332bdac333 100644 --- a/include/net/inet6_hashtables.h +++ b/include/net/inet6_hashtables.h | |||
| @@ -53,6 +53,7 @@ struct sock *__inet6_lookup_established(struct net *net, | |||
| 53 | 53 | ||
| 54 | struct sock *inet6_lookup_listener(struct net *net, | 54 | struct sock *inet6_lookup_listener(struct net *net, |
| 55 | struct inet_hashinfo *hashinfo, | 55 | struct inet_hashinfo *hashinfo, |
| 56 | struct sk_buff *skb, int doff, | ||
| 56 | const struct in6_addr *saddr, | 57 | const struct in6_addr *saddr, |
| 57 | const __be16 sport, | 58 | const __be16 sport, |
| 58 | const struct in6_addr *daddr, | 59 | const struct in6_addr *daddr, |
| @@ -60,6 +61,7 @@ struct sock *inet6_lookup_listener(struct net *net, | |||
| 60 | 61 | ||
| 61 | static inline struct sock *__inet6_lookup(struct net *net, | 62 | static inline struct sock *__inet6_lookup(struct net *net, |
| 62 | struct inet_hashinfo *hashinfo, | 63 | struct inet_hashinfo *hashinfo, |
| 64 | struct sk_buff *skb, int doff, | ||
| 63 | const struct in6_addr *saddr, | 65 | const struct in6_addr *saddr, |
| 64 | const __be16 sport, | 66 | const __be16 sport, |
| 65 | const struct in6_addr *daddr, | 67 | const struct in6_addr *daddr, |
| @@ -71,12 +73,12 @@ static inline struct sock *__inet6_lookup(struct net *net, | |||
| 71 | if (sk) | 73 | if (sk) |
| 72 | return sk; | 74 | return sk; |
| 73 | 75 | ||
| 74 | return inet6_lookup_listener(net, hashinfo, saddr, sport, | 76 | return inet6_lookup_listener(net, hashinfo, skb, doff, saddr, sport, |
| 75 | daddr, hnum, dif); | 77 | daddr, hnum, dif); |
| 76 | } | 78 | } |
| 77 | 79 | ||
| 78 | static inline struct sock *__inet6_lookup_skb(struct inet_hashinfo *hashinfo, | 80 | static inline struct sock *__inet6_lookup_skb(struct inet_hashinfo *hashinfo, |
| 79 | struct sk_buff *skb, | 81 | struct sk_buff *skb, int doff, |
| 80 | const __be16 sport, | 82 | const __be16 sport, |
| 81 | const __be16 dport, | 83 | const __be16 dport, |
| 82 | int iif) | 84 | int iif) |
| @@ -86,16 +88,19 @@ static inline struct sock *__inet6_lookup_skb(struct inet_hashinfo *hashinfo, | |||
| 86 | if (sk) | 88 | if (sk) |
| 87 | return sk; | 89 | return sk; |
| 88 | 90 | ||
| 89 | return __inet6_lookup(dev_net(skb_dst(skb)->dev), hashinfo, | 91 | return __inet6_lookup(dev_net(skb_dst(skb)->dev), hashinfo, skb, |
| 90 | &ipv6_hdr(skb)->saddr, sport, | 92 | doff, &ipv6_hdr(skb)->saddr, sport, |
| 91 | &ipv6_hdr(skb)->daddr, ntohs(dport), | 93 | &ipv6_hdr(skb)->daddr, ntohs(dport), |
| 92 | iif); | 94 | iif); |
| 93 | } | 95 | } |
| 94 | 96 | ||
| 95 | struct sock *inet6_lookup(struct net *net, struct inet_hashinfo *hashinfo, | 97 | struct sock *inet6_lookup(struct net *net, struct inet_hashinfo *hashinfo, |
| 98 | struct sk_buff *skb, int doff, | ||
| 96 | const struct in6_addr *saddr, const __be16 sport, | 99 | const struct in6_addr *saddr, const __be16 sport, |
| 97 | const struct in6_addr *daddr, const __be16 dport, | 100 | const struct in6_addr *daddr, const __be16 dport, |
| 98 | const int dif); | 101 | const int dif); |
| 102 | |||
| 103 | int inet6_hash(struct sock *sk); | ||
| 99 | #endif /* IS_ENABLED(CONFIG_IPV6) */ | 104 | #endif /* IS_ENABLED(CONFIG_IPV6) */ |
| 100 | 105 | ||
| 101 | #define INET6_MATCH(__sk, __net, __saddr, __daddr, __ports, __dif) \ | 106 | #define INET6_MATCH(__sk, __net, __saddr, __daddr, __ports, __dif) \ |
diff --git a/include/net/inet_frag.h b/include/net/inet_frag.h index 12aac0fd6ee7..909972aa3acd 100644 --- a/include/net/inet_frag.h +++ b/include/net/inet_frag.h | |||
| @@ -13,6 +13,7 @@ struct netns_frags { | |||
| 13 | int timeout; | 13 | int timeout; |
| 14 | int high_thresh; | 14 | int high_thresh; |
| 15 | int low_thresh; | 15 | int low_thresh; |
| 16 | int max_dist; | ||
| 16 | }; | 17 | }; |
| 17 | 18 | ||
| 18 | /** | 19 | /** |
diff --git a/include/net/inet_hashtables.h b/include/net/inet_hashtables.h index de2e3ade6102..50f635c2c536 100644 --- a/include/net/inet_hashtables.h +++ b/include/net/inet_hashtables.h | |||
| @@ -207,12 +207,16 @@ void inet_hashinfo_init(struct inet_hashinfo *h); | |||
| 207 | 207 | ||
| 208 | bool inet_ehash_insert(struct sock *sk, struct sock *osk); | 208 | bool inet_ehash_insert(struct sock *sk, struct sock *osk); |
| 209 | bool inet_ehash_nolisten(struct sock *sk, struct sock *osk); | 209 | bool inet_ehash_nolisten(struct sock *sk, struct sock *osk); |
| 210 | void __inet_hash(struct sock *sk, struct sock *osk); | 210 | int __inet_hash(struct sock *sk, struct sock *osk, |
| 211 | void inet_hash(struct sock *sk); | 211 | int (*saddr_same)(const struct sock *sk1, |
| 212 | const struct sock *sk2, | ||
| 213 | bool match_wildcard)); | ||
| 214 | int inet_hash(struct sock *sk); | ||
| 212 | void inet_unhash(struct sock *sk); | 215 | void inet_unhash(struct sock *sk); |
| 213 | 216 | ||
| 214 | struct sock *__inet_lookup_listener(struct net *net, | 217 | struct sock *__inet_lookup_listener(struct net *net, |
| 215 | struct inet_hashinfo *hashinfo, | 218 | struct inet_hashinfo *hashinfo, |
| 219 | struct sk_buff *skb, int doff, | ||
| 216 | const __be32 saddr, const __be16 sport, | 220 | const __be32 saddr, const __be16 sport, |
| 217 | const __be32 daddr, | 221 | const __be32 daddr, |
| 218 | const unsigned short hnum, | 222 | const unsigned short hnum, |
| @@ -220,10 +224,11 @@ struct sock *__inet_lookup_listener(struct net *net, | |||
| 220 | 224 | ||
| 221 | static inline struct sock *inet_lookup_listener(struct net *net, | 225 | static inline struct sock *inet_lookup_listener(struct net *net, |
| 222 | struct inet_hashinfo *hashinfo, | 226 | struct inet_hashinfo *hashinfo, |
| 227 | struct sk_buff *skb, int doff, | ||
| 223 | __be32 saddr, __be16 sport, | 228 | __be32 saddr, __be16 sport, |
| 224 | __be32 daddr, __be16 dport, int dif) | 229 | __be32 daddr, __be16 dport, int dif) |
| 225 | { | 230 | { |
| 226 | return __inet_lookup_listener(net, hashinfo, saddr, sport, | 231 | return __inet_lookup_listener(net, hashinfo, skb, doff, saddr, sport, |
| 227 | daddr, ntohs(dport), dif); | 232 | daddr, ntohs(dport), dif); |
| 228 | } | 233 | } |
| 229 | 234 | ||
| @@ -299,6 +304,7 @@ static inline struct sock * | |||
| 299 | 304 | ||
| 300 | static inline struct sock *__inet_lookup(struct net *net, | 305 | static inline struct sock *__inet_lookup(struct net *net, |
| 301 | struct inet_hashinfo *hashinfo, | 306 | struct inet_hashinfo *hashinfo, |
| 307 | struct sk_buff *skb, int doff, | ||
| 302 | const __be32 saddr, const __be16 sport, | 308 | const __be32 saddr, const __be16 sport, |
| 303 | const __be32 daddr, const __be16 dport, | 309 | const __be32 daddr, const __be16 dport, |
| 304 | const int dif) | 310 | const int dif) |
| @@ -307,12 +313,13 @@ static inline struct sock *__inet_lookup(struct net *net, | |||
| 307 | struct sock *sk = __inet_lookup_established(net, hashinfo, | 313 | struct sock *sk = __inet_lookup_established(net, hashinfo, |
| 308 | saddr, sport, daddr, hnum, dif); | 314 | saddr, sport, daddr, hnum, dif); |
| 309 | 315 | ||
| 310 | return sk ? : __inet_lookup_listener(net, hashinfo, saddr, sport, | 316 | return sk ? : __inet_lookup_listener(net, hashinfo, skb, doff, saddr, |
| 311 | daddr, hnum, dif); | 317 | sport, daddr, hnum, dif); |
| 312 | } | 318 | } |
| 313 | 319 | ||
| 314 | static inline struct sock *inet_lookup(struct net *net, | 320 | static inline struct sock *inet_lookup(struct net *net, |
| 315 | struct inet_hashinfo *hashinfo, | 321 | struct inet_hashinfo *hashinfo, |
| 322 | struct sk_buff *skb, int doff, | ||
| 316 | const __be32 saddr, const __be16 sport, | 323 | const __be32 saddr, const __be16 sport, |
| 317 | const __be32 daddr, const __be16 dport, | 324 | const __be32 daddr, const __be16 dport, |
| 318 | const int dif) | 325 | const int dif) |
| @@ -320,7 +327,8 @@ static inline struct sock *inet_lookup(struct net *net, | |||
| 320 | struct sock *sk; | 327 | struct sock *sk; |
| 321 | 328 | ||
| 322 | local_bh_disable(); | 329 | local_bh_disable(); |
| 323 | sk = __inet_lookup(net, hashinfo, saddr, sport, daddr, dport, dif); | 330 | sk = __inet_lookup(net, hashinfo, skb, doff, saddr, sport, daddr, |
| 331 | dport, dif); | ||
| 324 | local_bh_enable(); | 332 | local_bh_enable(); |
| 325 | 333 | ||
| 326 | return sk; | 334 | return sk; |
| @@ -328,6 +336,7 @@ static inline struct sock *inet_lookup(struct net *net, | |||
| 328 | 336 | ||
| 329 | static inline struct sock *__inet_lookup_skb(struct inet_hashinfo *hashinfo, | 337 | static inline struct sock *__inet_lookup_skb(struct inet_hashinfo *hashinfo, |
| 330 | struct sk_buff *skb, | 338 | struct sk_buff *skb, |
| 339 | int doff, | ||
| 331 | const __be16 sport, | 340 | const __be16 sport, |
| 332 | const __be16 dport) | 341 | const __be16 dport) |
| 333 | { | 342 | { |
| @@ -337,8 +346,8 @@ static inline struct sock *__inet_lookup_skb(struct inet_hashinfo *hashinfo, | |||
| 337 | if (sk) | 346 | if (sk) |
| 338 | return sk; | 347 | return sk; |
| 339 | else | 348 | else |
| 340 | return __inet_lookup(dev_net(skb_dst(skb)->dev), hashinfo, | 349 | return __inet_lookup(dev_net(skb_dst(skb)->dev), hashinfo, skb, |
| 341 | iph->saddr, sport, | 350 | doff, iph->saddr, sport, |
| 342 | iph->daddr, dport, inet_iif(skb)); | 351 | iph->daddr, dport, inet_iif(skb)); |
| 343 | } | 352 | } |
| 344 | 353 | ||
diff --git a/include/net/ip.h b/include/net/ip.h index 1a98f1ca1638..fad74d323bd6 100644 --- a/include/net/ip.h +++ b/include/net/ip.h | |||
| @@ -240,17 +240,13 @@ static inline int inet_is_local_reserved_port(struct net *net, int port) | |||
| 240 | } | 240 | } |
| 241 | #endif | 241 | #endif |
| 242 | 242 | ||
| 243 | __be32 inet_current_timestamp(void); | ||
| 244 | |||
| 243 | /* From inetpeer.c */ | 245 | /* From inetpeer.c */ |
| 244 | extern int inet_peer_threshold; | 246 | extern int inet_peer_threshold; |
| 245 | extern int inet_peer_minttl; | 247 | extern int inet_peer_minttl; |
| 246 | extern int inet_peer_maxttl; | 248 | extern int inet_peer_maxttl; |
| 247 | 249 | ||
| 248 | /* From ip_input.c */ | ||
| 249 | extern int sysctl_ip_early_demux; | ||
| 250 | |||
| 251 | /* From ip_output.c */ | ||
| 252 | extern int sysctl_ip_dynaddr; | ||
| 253 | |||
| 254 | void ipfrag_init(void); | 250 | void ipfrag_init(void); |
| 255 | 251 | ||
| 256 | void ip_static_sysctl_init(void); | 252 | void ip_static_sysctl_init(void); |
diff --git a/include/net/ip6_checksum.h b/include/net/ip6_checksum.h index 1a49b73f7f6e..cca840584c88 100644 --- a/include/net/ip6_checksum.h +++ b/include/net/ip6_checksum.h | |||
| @@ -37,8 +37,7 @@ | |||
| 37 | #ifndef _HAVE_ARCH_IPV6_CSUM | 37 | #ifndef _HAVE_ARCH_IPV6_CSUM |
| 38 | __sum16 csum_ipv6_magic(const struct in6_addr *saddr, | 38 | __sum16 csum_ipv6_magic(const struct in6_addr *saddr, |
| 39 | const struct in6_addr *daddr, | 39 | const struct in6_addr *daddr, |
| 40 | __u32 len, unsigned short proto, | 40 | __u32 len, __u8 proto, __wsum csum); |
| 41 | __wsum csum); | ||
| 42 | #endif | 41 | #endif |
| 43 | 42 | ||
| 44 | static inline __wsum ip6_compute_pseudo(struct sk_buff *skb, int proto) | 43 | static inline __wsum ip6_compute_pseudo(struct sk_buff *skb, int proto) |
diff --git a/include/net/ip6_tunnel.h b/include/net/ip6_tunnel.h index 0d0ce0b2d870..499a707765ea 100644 --- a/include/net/ip6_tunnel.h +++ b/include/net/ip6_tunnel.h | |||
| @@ -6,6 +6,7 @@ | |||
| 6 | #include <linux/if_tunnel.h> | 6 | #include <linux/if_tunnel.h> |
| 7 | #include <linux/ip6_tunnel.h> | 7 | #include <linux/ip6_tunnel.h> |
| 8 | #include <net/ip_tunnels.h> | 8 | #include <net/ip_tunnels.h> |
| 9 | #include <net/dst_cache.h> | ||
| 9 | 10 | ||
| 10 | #define IP6TUNNEL_ERR_TIMEO (30*HZ) | 11 | #define IP6TUNNEL_ERR_TIMEO (30*HZ) |
| 11 | 12 | ||
| @@ -33,12 +34,6 @@ struct __ip6_tnl_parm { | |||
| 33 | __be32 o_key; | 34 | __be32 o_key; |
| 34 | }; | 35 | }; |
| 35 | 36 | ||
| 36 | struct ip6_tnl_dst { | ||
| 37 | seqlock_t lock; | ||
| 38 | struct dst_entry __rcu *dst; | ||
| 39 | u32 cookie; | ||
| 40 | }; | ||
| 41 | |||
| 42 | /* IPv6 tunnel */ | 37 | /* IPv6 tunnel */ |
| 43 | struct ip6_tnl { | 38 | struct ip6_tnl { |
| 44 | struct ip6_tnl __rcu *next; /* next tunnel in list */ | 39 | struct ip6_tnl __rcu *next; /* next tunnel in list */ |
| @@ -46,7 +41,7 @@ struct ip6_tnl { | |||
| 46 | struct net *net; /* netns for packet i/o */ | 41 | struct net *net; /* netns for packet i/o */ |
| 47 | struct __ip6_tnl_parm parms; /* tunnel configuration parameters */ | 42 | struct __ip6_tnl_parm parms; /* tunnel configuration parameters */ |
| 48 | struct flowi fl; /* flowi template for xmit */ | 43 | struct flowi fl; /* flowi template for xmit */ |
| 49 | struct ip6_tnl_dst __percpu *dst_cache; /* cached dst */ | 44 | struct dst_cache dst_cache; /* cached dst */ |
| 50 | 45 | ||
| 51 | int err_count; | 46 | int err_count; |
| 52 | unsigned long err_time; | 47 | unsigned long err_time; |
| @@ -66,11 +61,6 @@ struct ipv6_tlv_tnl_enc_lim { | |||
| 66 | __u8 encap_limit; /* tunnel encapsulation limit */ | 61 | __u8 encap_limit; /* tunnel encapsulation limit */ |
| 67 | } __packed; | 62 | } __packed; |
| 68 | 63 | ||
| 69 | struct dst_entry *ip6_tnl_dst_get(struct ip6_tnl *t); | ||
| 70 | int ip6_tnl_dst_init(struct ip6_tnl *t); | ||
| 71 | void ip6_tnl_dst_destroy(struct ip6_tnl *t); | ||
| 72 | void ip6_tnl_dst_reset(struct ip6_tnl *t); | ||
| 73 | void ip6_tnl_dst_set(struct ip6_tnl *t, struct dst_entry *dst); | ||
| 74 | int ip6_tnl_rcv_ctl(struct ip6_tnl *t, const struct in6_addr *laddr, | 64 | int ip6_tnl_rcv_ctl(struct ip6_tnl *t, const struct in6_addr *laddr, |
| 75 | const struct in6_addr *raddr); | 65 | const struct in6_addr *raddr); |
| 76 | int ip6_tnl_xmit_ctl(struct ip6_tnl *t, const struct in6_addr *laddr, | 66 | int ip6_tnl_xmit_ctl(struct ip6_tnl *t, const struct in6_addr *laddr, |
diff --git a/include/net/ip_tunnels.h b/include/net/ip_tunnels.h index dda9abf6b89c..c35dda9ec991 100644 --- a/include/net/ip_tunnels.h +++ b/include/net/ip_tunnels.h | |||
| @@ -7,12 +7,15 @@ | |||
| 7 | #include <linux/socket.h> | 7 | #include <linux/socket.h> |
| 8 | #include <linux/types.h> | 8 | #include <linux/types.h> |
| 9 | #include <linux/u64_stats_sync.h> | 9 | #include <linux/u64_stats_sync.h> |
| 10 | #include <linux/bitops.h> | ||
| 11 | |||
| 10 | #include <net/dsfield.h> | 12 | #include <net/dsfield.h> |
| 11 | #include <net/gro_cells.h> | 13 | #include <net/gro_cells.h> |
| 12 | #include <net/inet_ecn.h> | 14 | #include <net/inet_ecn.h> |
| 13 | #include <net/netns/generic.h> | 15 | #include <net/netns/generic.h> |
| 14 | #include <net/rtnetlink.h> | 16 | #include <net/rtnetlink.h> |
| 15 | #include <net/lwtunnel.h> | 17 | #include <net/lwtunnel.h> |
| 18 | #include <net/dst_cache.h> | ||
| 16 | 19 | ||
| 17 | #if IS_ENABLED(CONFIG_IPV6) | 20 | #if IS_ENABLED(CONFIG_IPV6) |
| 18 | #include <net/ipv6.h> | 21 | #include <net/ipv6.h> |
| @@ -47,6 +50,7 @@ struct ip_tunnel_key { | |||
| 47 | __be16 tun_flags; | 50 | __be16 tun_flags; |
| 48 | u8 tos; /* TOS for IPv4, TC for IPv6 */ | 51 | u8 tos; /* TOS for IPv4, TC for IPv6 */ |
| 49 | u8 ttl; /* TTL for IPv4, HL for IPv6 */ | 52 | u8 ttl; /* TTL for IPv4, HL for IPv6 */ |
| 53 | __be32 label; /* Flow Label for IPv6 */ | ||
| 50 | __be16 tp_src; | 54 | __be16 tp_src; |
| 51 | __be16 tp_dst; | 55 | __be16 tp_dst; |
| 52 | }; | 56 | }; |
| @@ -55,8 +59,16 @@ struct ip_tunnel_key { | |||
| 55 | #define IP_TUNNEL_INFO_TX 0x01 /* represents tx tunnel parameters */ | 59 | #define IP_TUNNEL_INFO_TX 0x01 /* represents tx tunnel parameters */ |
| 56 | #define IP_TUNNEL_INFO_IPV6 0x02 /* key contains IPv6 addresses */ | 60 | #define IP_TUNNEL_INFO_IPV6 0x02 /* key contains IPv6 addresses */ |
| 57 | 61 | ||
| 62 | /* Maximum tunnel options length. */ | ||
| 63 | #define IP_TUNNEL_OPTS_MAX \ | ||
| 64 | GENMASK((FIELD_SIZEOF(struct ip_tunnel_info, \ | ||
| 65 | options_len) * BITS_PER_BYTE) - 1, 0) | ||
| 66 | |||
| 58 | struct ip_tunnel_info { | 67 | struct ip_tunnel_info { |
| 59 | struct ip_tunnel_key key; | 68 | struct ip_tunnel_key key; |
| 69 | #ifdef CONFIG_DST_CACHE | ||
| 70 | struct dst_cache dst_cache; | ||
| 71 | #endif | ||
| 60 | u8 options_len; | 72 | u8 options_len; |
| 61 | u8 mode; | 73 | u8 mode; |
| 62 | }; | 74 | }; |
| @@ -85,11 +97,6 @@ struct ip_tunnel_prl_entry { | |||
| 85 | struct rcu_head rcu_head; | 97 | struct rcu_head rcu_head; |
| 86 | }; | 98 | }; |
| 87 | 99 | ||
| 88 | struct ip_tunnel_dst { | ||
| 89 | struct dst_entry __rcu *dst; | ||
| 90 | __be32 saddr; | ||
| 91 | }; | ||
| 92 | |||
| 93 | struct metadata_dst; | 100 | struct metadata_dst; |
| 94 | 101 | ||
| 95 | struct ip_tunnel { | 102 | struct ip_tunnel { |
| @@ -108,7 +115,7 @@ struct ip_tunnel { | |||
| 108 | int tun_hlen; /* Precalculated header length */ | 115 | int tun_hlen; /* Precalculated header length */ |
| 109 | int mlink; | 116 | int mlink; |
| 110 | 117 | ||
| 111 | struct ip_tunnel_dst __percpu *dst_cache; | 118 | struct dst_cache dst_cache; |
| 112 | 119 | ||
| 113 | struct ip_tunnel_parm parms; | 120 | struct ip_tunnel_parm parms; |
| 114 | 121 | ||
| @@ -141,6 +148,7 @@ struct ip_tunnel { | |||
| 141 | #define TUNNEL_CRIT_OPT __cpu_to_be16(0x0400) | 148 | #define TUNNEL_CRIT_OPT __cpu_to_be16(0x0400) |
| 142 | #define TUNNEL_GENEVE_OPT __cpu_to_be16(0x0800) | 149 | #define TUNNEL_GENEVE_OPT __cpu_to_be16(0x0800) |
| 143 | #define TUNNEL_VXLAN_OPT __cpu_to_be16(0x1000) | 150 | #define TUNNEL_VXLAN_OPT __cpu_to_be16(0x1000) |
| 151 | #define TUNNEL_NOCACHE __cpu_to_be16(0x2000) | ||
| 144 | 152 | ||
| 145 | #define TUNNEL_OPTIONS_PRESENT (TUNNEL_GENEVE_OPT | TUNNEL_VXLAN_OPT) | 153 | #define TUNNEL_OPTIONS_PRESENT (TUNNEL_GENEVE_OPT | TUNNEL_VXLAN_OPT) |
| 146 | 154 | ||
| @@ -181,7 +189,7 @@ int ip_tunnel_encap_del_ops(const struct ip_tunnel_encap_ops *op, | |||
| 181 | 189 | ||
| 182 | static inline void ip_tunnel_key_init(struct ip_tunnel_key *key, | 190 | static inline void ip_tunnel_key_init(struct ip_tunnel_key *key, |
| 183 | __be32 saddr, __be32 daddr, | 191 | __be32 saddr, __be32 daddr, |
| 184 | u8 tos, u8 ttl, | 192 | u8 tos, u8 ttl, __be32 label, |
| 185 | __be16 tp_src, __be16 tp_dst, | 193 | __be16 tp_src, __be16 tp_dst, |
| 186 | __be64 tun_id, __be16 tun_flags) | 194 | __be64 tun_id, __be16 tun_flags) |
| 187 | { | 195 | { |
| @@ -192,6 +200,7 @@ static inline void ip_tunnel_key_init(struct ip_tunnel_key *key, | |||
| 192 | 0, IP_TUNNEL_KEY_IPV4_PAD_LEN); | 200 | 0, IP_TUNNEL_KEY_IPV4_PAD_LEN); |
| 193 | key->tos = tos; | 201 | key->tos = tos; |
| 194 | key->ttl = ttl; | 202 | key->ttl = ttl; |
| 203 | key->label = label; | ||
| 195 | key->tun_flags = tun_flags; | 204 | key->tun_flags = tun_flags; |
| 196 | 205 | ||
| 197 | /* For the tunnel types on the top of IPsec, the tp_src and tp_dst of | 206 | /* For the tunnel types on the top of IPsec, the tp_src and tp_dst of |
| @@ -207,6 +216,20 @@ static inline void ip_tunnel_key_init(struct ip_tunnel_key *key, | |||
| 207 | 0, sizeof(*key) - IP_TUNNEL_KEY_SIZE); | 216 | 0, sizeof(*key) - IP_TUNNEL_KEY_SIZE); |
| 208 | } | 217 | } |
| 209 | 218 | ||
| 219 | static inline bool | ||
| 220 | ip_tunnel_dst_cache_usable(const struct sk_buff *skb, | ||
| 221 | const struct ip_tunnel_info *info) | ||
| 222 | { | ||
| 223 | if (skb->mark) | ||
| 224 | return false; | ||
| 225 | if (!info) | ||
| 226 | return true; | ||
| 227 | if (info->key.tun_flags & TUNNEL_NOCACHE) | ||
| 228 | return false; | ||
| 229 | |||
| 230 | return true; | ||
| 231 | } | ||
| 232 | |||
| 210 | static inline unsigned short ip_tunnel_info_af(const struct ip_tunnel_info | 233 | static inline unsigned short ip_tunnel_info_af(const struct ip_tunnel_info |
| 211 | *tun_info) | 234 | *tun_info) |
| 212 | { | 235 | { |
| @@ -248,7 +271,6 @@ int ip_tunnel_changelink(struct net_device *dev, struct nlattr *tb[], | |||
| 248 | int ip_tunnel_newlink(struct net_device *dev, struct nlattr *tb[], | 271 | int ip_tunnel_newlink(struct net_device *dev, struct nlattr *tb[], |
| 249 | struct ip_tunnel_parm *p); | 272 | struct ip_tunnel_parm *p); |
| 250 | void ip_tunnel_setup(struct net_device *dev, int net_id); | 273 | void ip_tunnel_setup(struct net_device *dev, int net_id); |
| 251 | void ip_tunnel_dst_reset_all(struct ip_tunnel *t); | ||
| 252 | int ip_tunnel_encap_setup(struct ip_tunnel *t, | 274 | int ip_tunnel_encap_setup(struct ip_tunnel *t, |
| 253 | struct ip_tunnel_encap *ipencap); | 275 | struct ip_tunnel_encap *ipencap); |
| 254 | 276 | ||
| @@ -273,15 +295,15 @@ static inline u8 ip_tunnel_ecn_encap(u8 tos, const struct iphdr *iph, | |||
| 273 | return INET_ECN_encapsulate(tos, inner); | 295 | return INET_ECN_encapsulate(tos, inner); |
| 274 | } | 296 | } |
| 275 | 297 | ||
| 276 | int iptunnel_pull_header(struct sk_buff *skb, int hdr_len, __be16 inner_proto); | 298 | int iptunnel_pull_header(struct sk_buff *skb, int hdr_len, __be16 inner_proto, |
| 299 | bool xnet); | ||
| 277 | void iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb, | 300 | void iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb, |
| 278 | __be32 src, __be32 dst, u8 proto, | 301 | __be32 src, __be32 dst, u8 proto, |
| 279 | u8 tos, u8 ttl, __be16 df, bool xnet); | 302 | u8 tos, u8 ttl, __be16 df, bool xnet); |
| 280 | struct metadata_dst *iptunnel_metadata_reply(struct metadata_dst *md, | 303 | struct metadata_dst *iptunnel_metadata_reply(struct metadata_dst *md, |
| 281 | gfp_t flags); | 304 | gfp_t flags); |
| 282 | 305 | ||
| 283 | struct sk_buff *iptunnel_handle_offloads(struct sk_buff *skb, bool gre_csum, | 306 | struct sk_buff *iptunnel_handle_offloads(struct sk_buff *skb, int gso_type_mask); |
| 284 | int gso_type_mask); | ||
| 285 | 307 | ||
| 286 | static inline void iptunnel_xmit_stats(struct net_device *dev, int pkt_len) | 308 | static inline void iptunnel_xmit_stats(struct net_device *dev, int pkt_len) |
| 287 | { | 309 | { |
| @@ -356,6 +378,17 @@ static inline void ip_tunnel_unneed_metadata(void) | |||
| 356 | { | 378 | { |
| 357 | } | 379 | } |
| 358 | 380 | ||
| 381 | static inline void ip_tunnel_info_opts_get(void *to, | ||
| 382 | const struct ip_tunnel_info *info) | ||
| 383 | { | ||
| 384 | } | ||
| 385 | |||
| 386 | static inline void ip_tunnel_info_opts_set(struct ip_tunnel_info *info, | ||
| 387 | const void *from, int len) | ||
| 388 | { | ||
| 389 | info->options_len = 0; | ||
| 390 | } | ||
| 391 | |||
| 359 | #endif /* CONFIG_INET */ | 392 | #endif /* CONFIG_INET */ |
| 360 | 393 | ||
| 361 | #endif /* __NET_IP_TUNNELS_H */ | 394 | #endif /* __NET_IP_TUNNELS_H */ |
diff --git a/include/net/ip_vs.h b/include/net/ip_vs.h index 0816c872b689..a6cc576fd467 100644 --- a/include/net/ip_vs.h +++ b/include/net/ip_vs.h | |||
| @@ -1588,6 +1588,23 @@ static inline void ip_vs_conn_drop_conntrack(struct ip_vs_conn *cp) | |||
| 1588 | } | 1588 | } |
| 1589 | #endif /* CONFIG_IP_VS_NFCT */ | 1589 | #endif /* CONFIG_IP_VS_NFCT */ |
| 1590 | 1590 | ||
| 1591 | /* Really using conntrack? */ | ||
| 1592 | static inline bool ip_vs_conn_uses_conntrack(struct ip_vs_conn *cp, | ||
| 1593 | struct sk_buff *skb) | ||
| 1594 | { | ||
| 1595 | #ifdef CONFIG_IP_VS_NFCT | ||
| 1596 | enum ip_conntrack_info ctinfo; | ||
| 1597 | struct nf_conn *ct; | ||
| 1598 | |||
| 1599 | if (!(cp->flags & IP_VS_CONN_F_NFCT)) | ||
| 1600 | return false; | ||
| 1601 | ct = nf_ct_get(skb, &ctinfo); | ||
| 1602 | if (ct && !nf_ct_is_untracked(ct)) | ||
| 1603 | return true; | ||
| 1604 | #endif | ||
| 1605 | return false; | ||
| 1606 | } | ||
| 1607 | |||
| 1591 | static inline int | 1608 | static inline int |
| 1592 | ip_vs_dest_conn_overhead(struct ip_vs_dest *dest) | 1609 | ip_vs_dest_conn_overhead(struct ip_vs_dest *dest) |
| 1593 | { | 1610 | { |
diff --git a/include/net/ipv6.h b/include/net/ipv6.h index 6570f379aba2..f3c9857c645d 100644 --- a/include/net/ipv6.h +++ b/include/net/ipv6.h | |||
| @@ -259,8 +259,12 @@ static inline struct ipv6_txoptions *txopt_get(const struct ipv6_pinfo *np) | |||
| 259 | 259 | ||
| 260 | rcu_read_lock(); | 260 | rcu_read_lock(); |
| 261 | opt = rcu_dereference(np->opt); | 261 | opt = rcu_dereference(np->opt); |
| 262 | if (opt && !atomic_inc_not_zero(&opt->refcnt)) | 262 | if (opt) { |
| 263 | opt = NULL; | 263 | if (!atomic_inc_not_zero(&opt->refcnt)) |
| 264 | opt = NULL; | ||
| 265 | else | ||
| 266 | opt = rcu_pointer_handoff(opt); | ||
| 267 | } | ||
| 264 | rcu_read_unlock(); | 268 | rcu_read_unlock(); |
| 265 | return opt; | 269 | return opt; |
| 266 | } | 270 | } |
diff --git a/include/net/kcm.h b/include/net/kcm.h new file mode 100644 index 000000000000..2840b5825dcc --- /dev/null +++ b/include/net/kcm.h | |||
| @@ -0,0 +1,226 @@ | |||
| 1 | /* | ||
| 2 | * Kernel Connection Multiplexor | ||
| 3 | * | ||
| 4 | * Copyright (c) 2016 Tom Herbert <tom@herbertland.com> | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License version 2 | ||
| 8 | * as published by the Free Software Foundation. | ||
| 9 | */ | ||
| 10 | |||
| 11 | #ifndef __NET_KCM_H_ | ||
| 12 | #define __NET_KCM_H_ | ||
| 13 | |||
| 14 | #include <linux/skbuff.h> | ||
| 15 | #include <net/sock.h> | ||
| 16 | #include <uapi/linux/kcm.h> | ||
| 17 | |||
| 18 | extern unsigned int kcm_net_id; | ||
| 19 | |||
| 20 | #define KCM_STATS_ADD(stat, count) ((stat) += (count)) | ||
| 21 | #define KCM_STATS_INCR(stat) ((stat)++) | ||
| 22 | |||
| 23 | struct kcm_psock_stats { | ||
| 24 | unsigned long long rx_msgs; | ||
| 25 | unsigned long long rx_bytes; | ||
| 26 | unsigned long long tx_msgs; | ||
| 27 | unsigned long long tx_bytes; | ||
| 28 | unsigned int rx_aborts; | ||
| 29 | unsigned int rx_mem_fail; | ||
| 30 | unsigned int rx_need_more_hdr; | ||
| 31 | unsigned int rx_msg_too_big; | ||
| 32 | unsigned int rx_msg_timeouts; | ||
| 33 | unsigned int rx_bad_hdr_len; | ||
| 34 | unsigned long long reserved; | ||
| 35 | unsigned long long unreserved; | ||
| 36 | unsigned int tx_aborts; | ||
| 37 | }; | ||
| 38 | |||
| 39 | struct kcm_mux_stats { | ||
| 40 | unsigned long long rx_msgs; | ||
| 41 | unsigned long long rx_bytes; | ||
| 42 | unsigned long long tx_msgs; | ||
| 43 | unsigned long long tx_bytes; | ||
| 44 | unsigned int rx_ready_drops; | ||
| 45 | unsigned int tx_retries; | ||
| 46 | unsigned int psock_attach; | ||
| 47 | unsigned int psock_unattach_rsvd; | ||
| 48 | unsigned int psock_unattach; | ||
| 49 | }; | ||
| 50 | |||
| 51 | struct kcm_stats { | ||
| 52 | unsigned long long rx_msgs; | ||
| 53 | unsigned long long rx_bytes; | ||
| 54 | unsigned long long tx_msgs; | ||
| 55 | unsigned long long tx_bytes; | ||
| 56 | }; | ||
| 57 | |||
| 58 | struct kcm_tx_msg { | ||
| 59 | unsigned int sent; | ||
| 60 | unsigned int fragidx; | ||
| 61 | unsigned int frag_offset; | ||
| 62 | unsigned int msg_flags; | ||
| 63 | struct sk_buff *frag_skb; | ||
| 64 | struct sk_buff *last_skb; | ||
| 65 | }; | ||
| 66 | |||
| 67 | struct kcm_rx_msg { | ||
| 68 | int full_len; | ||
| 69 | int accum_len; | ||
| 70 | int offset; | ||
| 71 | int early_eaten; | ||
| 72 | }; | ||
| 73 | |||
| 74 | /* Socket structure for KCM client sockets */ | ||
| 75 | struct kcm_sock { | ||
| 76 | struct sock sk; | ||
| 77 | struct kcm_mux *mux; | ||
| 78 | struct list_head kcm_sock_list; | ||
| 79 | int index; | ||
| 80 | u32 done : 1; | ||
| 81 | struct work_struct done_work; | ||
| 82 | |||
| 83 | struct kcm_stats stats; | ||
| 84 | |||
| 85 | /* Transmit */ | ||
| 86 | struct kcm_psock *tx_psock; | ||
| 87 | struct work_struct tx_work; | ||
| 88 | struct list_head wait_psock_list; | ||
| 89 | struct sk_buff *seq_skb; | ||
| 90 | |||
| 91 | /* Don't use bit fields here, these are set under different locks */ | ||
| 92 | bool tx_wait; | ||
| 93 | bool tx_wait_more; | ||
| 94 | |||
| 95 | /* Receive */ | ||
| 96 | struct kcm_psock *rx_psock; | ||
| 97 | struct list_head wait_rx_list; /* KCMs waiting for receiving */ | ||
| 98 | bool rx_wait; | ||
| 99 | u32 rx_disabled : 1; | ||
| 100 | }; | ||
| 101 | |||
| 102 | struct bpf_prog; | ||
| 103 | |||
| 104 | /* Structure for an attached lower socket */ | ||
| 105 | struct kcm_psock { | ||
| 106 | struct sock *sk; | ||
| 107 | struct kcm_mux *mux; | ||
| 108 | int index; | ||
| 109 | |||
| 110 | u32 tx_stopped : 1; | ||
| 111 | u32 rx_stopped : 1; | ||
| 112 | u32 done : 1; | ||
| 113 | u32 unattaching : 1; | ||
| 114 | |||
| 115 | void (*save_state_change)(struct sock *sk); | ||
| 116 | void (*save_data_ready)(struct sock *sk); | ||
| 117 | void (*save_write_space)(struct sock *sk); | ||
| 118 | |||
| 119 | struct list_head psock_list; | ||
| 120 | |||
| 121 | struct kcm_psock_stats stats; | ||
| 122 | |||
| 123 | /* Receive */ | ||
| 124 | struct sk_buff *rx_skb_head; | ||
| 125 | struct sk_buff **rx_skb_nextp; | ||
| 126 | struct sk_buff *ready_rx_msg; | ||
| 127 | struct list_head psock_ready_list; | ||
| 128 | struct work_struct rx_work; | ||
| 129 | struct delayed_work rx_delayed_work; | ||
| 130 | struct bpf_prog *bpf_prog; | ||
| 131 | struct kcm_sock *rx_kcm; | ||
| 132 | unsigned long long saved_rx_bytes; | ||
| 133 | unsigned long long saved_rx_msgs; | ||
| 134 | struct timer_list rx_msg_timer; | ||
| 135 | unsigned int rx_need_bytes; | ||
| 136 | |||
| 137 | /* Transmit */ | ||
| 138 | struct kcm_sock *tx_kcm; | ||
| 139 | struct list_head psock_avail_list; | ||
| 140 | unsigned long long saved_tx_bytes; | ||
| 141 | unsigned long long saved_tx_msgs; | ||
| 142 | }; | ||
| 143 | |||
| 144 | /* Per net MUX list */ | ||
| 145 | struct kcm_net { | ||
| 146 | struct mutex mutex; | ||
| 147 | struct kcm_psock_stats aggregate_psock_stats; | ||
| 148 | struct kcm_mux_stats aggregate_mux_stats; | ||
| 149 | struct list_head mux_list; | ||
| 150 | int count; | ||
| 151 | }; | ||
| 152 | |||
| 153 | /* Structure for a MUX */ | ||
| 154 | struct kcm_mux { | ||
| 155 | struct list_head kcm_mux_list; | ||
| 156 | struct rcu_head rcu; | ||
| 157 | struct kcm_net *knet; | ||
| 158 | |||
| 159 | struct list_head kcm_socks; /* All KCM sockets on MUX */ | ||
| 160 | int kcm_socks_cnt; /* Total KCM socket count for MUX */ | ||
| 161 | struct list_head psocks; /* List of all psocks on MUX */ | ||
| 162 | int psocks_cnt; /* Total attached sockets */ | ||
| 163 | |||
| 164 | struct kcm_mux_stats stats; | ||
| 165 | struct kcm_psock_stats aggregate_psock_stats; | ||
| 166 | |||
| 167 | /* Receive */ | ||
| 168 | spinlock_t rx_lock ____cacheline_aligned_in_smp; | ||
| 169 | struct list_head kcm_rx_waiters; /* KCMs waiting for receiving */ | ||
| 170 | struct list_head psocks_ready; /* List of psocks with a msg ready */ | ||
| 171 | struct sk_buff_head rx_hold_queue; | ||
| 172 | |||
| 173 | /* Transmit */ | ||
| 174 | spinlock_t lock ____cacheline_aligned_in_smp; /* TX and mux locking */ | ||
| 175 | struct list_head psocks_avail; /* List of available psocks */ | ||
| 176 | struct list_head kcm_tx_waiters; /* KCMs waiting for a TX psock */ | ||
| 177 | }; | ||
| 178 | |||
| 179 | #ifdef CONFIG_PROC_FS | ||
| 180 | int kcm_proc_init(void); | ||
| 181 | void kcm_proc_exit(void); | ||
| 182 | #else | ||
| 183 | static inline int kcm_proc_init(void) { return 0; } | ||
| 184 | static inline void kcm_proc_exit(void) { } | ||
| 185 | #endif | ||
| 186 | |||
| 187 | static inline void aggregate_psock_stats(struct kcm_psock_stats *stats, | ||
| 188 | struct kcm_psock_stats *agg_stats) | ||
| 189 | { | ||
| 190 | /* Save psock statistics in the mux when psock is being unattached. */ | ||
| 191 | |||
| 192 | #define SAVE_PSOCK_STATS(_stat) (agg_stats->_stat += stats->_stat) | ||
| 193 | SAVE_PSOCK_STATS(rx_msgs); | ||
| 194 | SAVE_PSOCK_STATS(rx_bytes); | ||
| 195 | SAVE_PSOCK_STATS(rx_aborts); | ||
| 196 | SAVE_PSOCK_STATS(rx_mem_fail); | ||
| 197 | SAVE_PSOCK_STATS(rx_need_more_hdr); | ||
| 198 | SAVE_PSOCK_STATS(rx_msg_too_big); | ||
| 199 | SAVE_PSOCK_STATS(rx_msg_timeouts); | ||
| 200 | SAVE_PSOCK_STATS(rx_bad_hdr_len); | ||
| 201 | SAVE_PSOCK_STATS(tx_msgs); | ||
| 202 | SAVE_PSOCK_STATS(tx_bytes); | ||
| 203 | SAVE_PSOCK_STATS(reserved); | ||
| 204 | SAVE_PSOCK_STATS(unreserved); | ||
| 205 | SAVE_PSOCK_STATS(tx_aborts); | ||
| 206 | #undef SAVE_PSOCK_STATS | ||
| 207 | } | ||
| 208 | |||
| 209 | static inline void aggregate_mux_stats(struct kcm_mux_stats *stats, | ||
| 210 | struct kcm_mux_stats *agg_stats) | ||
| 211 | { | ||
| 212 | /* Save psock statistics in the mux when psock is being unattached. */ | ||
| 213 | |||
| 214 | #define SAVE_MUX_STATS(_stat) (agg_stats->_stat += stats->_stat) | ||
| 215 | SAVE_MUX_STATS(rx_msgs); | ||
| 216 | SAVE_MUX_STATS(rx_bytes); | ||
| 217 | SAVE_MUX_STATS(tx_msgs); | ||
| 218 | SAVE_MUX_STATS(tx_bytes); | ||
| 219 | SAVE_MUX_STATS(rx_ready_drops); | ||
| 220 | SAVE_MUX_STATS(psock_attach); | ||
| 221 | SAVE_MUX_STATS(psock_unattach_rsvd); | ||
| 222 | SAVE_MUX_STATS(psock_unattach); | ||
| 223 | #undef SAVE_MUX_STATS | ||
| 224 | } | ||
| 225 | |||
| 226 | #endif /* __NET_KCM_H_ */ | ||
diff --git a/include/net/l3mdev.h b/include/net/l3mdev.h index 5567d46b3cff..c43a9c73de5e 100644 --- a/include/net/l3mdev.h +++ b/include/net/l3mdev.h | |||
| @@ -39,7 +39,7 @@ struct l3mdev_ops { | |||
| 39 | 39 | ||
| 40 | #ifdef CONFIG_NET_L3_MASTER_DEV | 40 | #ifdef CONFIG_NET_L3_MASTER_DEV |
| 41 | 41 | ||
| 42 | int l3mdev_master_ifindex_rcu(struct net_device *dev); | 42 | int l3mdev_master_ifindex_rcu(const struct net_device *dev); |
| 43 | static inline int l3mdev_master_ifindex(struct net_device *dev) | 43 | static inline int l3mdev_master_ifindex(struct net_device *dev) |
| 44 | { | 44 | { |
| 45 | int ifindex; | 45 | int ifindex; |
| @@ -179,7 +179,7 @@ struct dst_entry *l3mdev_rt6_dst_by_oif(struct net *net, | |||
| 179 | 179 | ||
| 180 | #else | 180 | #else |
| 181 | 181 | ||
| 182 | static inline int l3mdev_master_ifindex_rcu(struct net_device *dev) | 182 | static inline int l3mdev_master_ifindex_rcu(const struct net_device *dev) |
| 183 | { | 183 | { |
| 184 | return 0; | 184 | return 0; |
| 185 | } | 185 | } |
diff --git a/include/net/lwtunnel.h b/include/net/lwtunnel.h index 66350ce3e955..e9f116e29c22 100644 --- a/include/net/lwtunnel.h +++ b/include/net/lwtunnel.h | |||
| @@ -170,6 +170,8 @@ static inline int lwtunnel_input(struct sk_buff *skb) | |||
| 170 | return -EOPNOTSUPP; | 170 | return -EOPNOTSUPP; |
| 171 | } | 171 | } |
| 172 | 172 | ||
| 173 | #endif | 173 | #endif /* CONFIG_LWTUNNEL */ |
| 174 | |||
| 175 | #define MODULE_ALIAS_RTNL_LWT(encap_type) MODULE_ALIAS("rtnl-lwt-" __stringify(encap_type)) | ||
| 174 | 176 | ||
| 175 | #endif /* __NET_LWTUNNEL_H */ | 177 | #endif /* __NET_LWTUNNEL_H */ |
diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 7c30faff245f..0c09da34b67a 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h | |||
| @@ -5,7 +5,7 @@ | |||
| 5 | * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz> | 5 | * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz> |
| 6 | * Copyright 2007-2010 Johannes Berg <johannes@sipsolutions.net> | 6 | * Copyright 2007-2010 Johannes Berg <johannes@sipsolutions.net> |
| 7 | * Copyright 2013-2014 Intel Mobile Communications GmbH | 7 | * Copyright 2013-2014 Intel Mobile Communications GmbH |
| 8 | * Copyright (C) 2015 Intel Deutschland GmbH | 8 | * Copyright (C) 2015 - 2016 Intel Deutschland GmbH |
| 9 | * | 9 | * |
| 10 | * This program is free software; you can redistribute it and/or modify | 10 | * This program is free software; you can redistribute it and/or modify |
| 11 | * it under the terms of the GNU General Public License version 2 as | 11 | * it under the terms of the GNU General Public License version 2 as |
| @@ -298,6 +298,7 @@ struct ieee80211_vif_chanctx_switch { | |||
| 298 | * note that this is only called when it changes after the channel | 298 | * note that this is only called when it changes after the channel |
| 299 | * context had been assigned. | 299 | * context had been assigned. |
| 300 | * @BSS_CHANGED_OCB: OCB join status changed | 300 | * @BSS_CHANGED_OCB: OCB join status changed |
| 301 | * @BSS_CHANGED_MU_GROUPS: VHT MU-MIMO group id or user position changed | ||
| 301 | */ | 302 | */ |
| 302 | enum ieee80211_bss_change { | 303 | enum ieee80211_bss_change { |
| 303 | BSS_CHANGED_ASSOC = 1<<0, | 304 | BSS_CHANGED_ASSOC = 1<<0, |
| @@ -323,6 +324,7 @@ enum ieee80211_bss_change { | |||
| 323 | BSS_CHANGED_BEACON_INFO = 1<<20, | 324 | BSS_CHANGED_BEACON_INFO = 1<<20, |
| 324 | BSS_CHANGED_BANDWIDTH = 1<<21, | 325 | BSS_CHANGED_BANDWIDTH = 1<<21, |
| 325 | BSS_CHANGED_OCB = 1<<22, | 326 | BSS_CHANGED_OCB = 1<<22, |
| 327 | BSS_CHANGED_MU_GROUPS = 1<<23, | ||
| 326 | 328 | ||
| 327 | /* when adding here, make sure to change ieee80211_reconfig */ | 329 | /* when adding here, make sure to change ieee80211_reconfig */ |
| 328 | }; | 330 | }; |
| @@ -436,6 +438,19 @@ struct ieee80211_event { | |||
| 436 | }; | 438 | }; |
| 437 | 439 | ||
| 438 | /** | 440 | /** |
| 441 | * struct ieee80211_mu_group_data - STA's VHT MU-MIMO group data | ||
| 442 | * | ||
| 443 | * This structure describes the group id data of VHT MU-MIMO | ||
| 444 | * | ||
| 445 | * @membership: 64 bits array - a bit is set if station is member of the group | ||
| 446 | * @position: 2 bits per group id indicating the position in the group | ||
| 447 | */ | ||
| 448 | struct ieee80211_mu_group_data { | ||
| 449 | u8 membership[WLAN_MEMBERSHIP_LEN]; | ||
| 450 | u8 position[WLAN_USER_POSITION_LEN]; | ||
| 451 | }; | ||
| 452 | |||
| 453 | /** | ||
| 439 | * struct ieee80211_bss_conf - holds the BSS's changing parameters | 454 | * struct ieee80211_bss_conf - holds the BSS's changing parameters |
| 440 | * | 455 | * |
| 441 | * This structure keeps information about a BSS (and an association | 456 | * This structure keeps information about a BSS (and an association |
| @@ -477,6 +492,7 @@ struct ieee80211_event { | |||
| 477 | * @enable_beacon: whether beaconing should be enabled or not | 492 | * @enable_beacon: whether beaconing should be enabled or not |
| 478 | * @chandef: Channel definition for this BSS -- the hardware might be | 493 | * @chandef: Channel definition for this BSS -- the hardware might be |
| 479 | * configured a higher bandwidth than this BSS uses, for example. | 494 | * configured a higher bandwidth than this BSS uses, for example. |
| 495 | * @mu_group: VHT MU-MIMO group membership data | ||
| 480 | * @ht_operation_mode: HT operation mode like in &struct ieee80211_ht_operation. | 496 | * @ht_operation_mode: HT operation mode like in &struct ieee80211_ht_operation. |
| 481 | * This field is only valid when the channel is a wide HT/VHT channel. | 497 | * This field is only valid when the channel is a wide HT/VHT channel. |
| 482 | * Note that with TDLS this can be the case (channel is HT, protection must | 498 | * Note that with TDLS this can be the case (channel is HT, protection must |
| @@ -535,6 +551,7 @@ struct ieee80211_bss_conf { | |||
| 535 | s32 cqm_rssi_thold; | 551 | s32 cqm_rssi_thold; |
| 536 | u32 cqm_rssi_hyst; | 552 | u32 cqm_rssi_hyst; |
| 537 | struct cfg80211_chan_def chandef; | 553 | struct cfg80211_chan_def chandef; |
| 554 | struct ieee80211_mu_group_data mu_group; | ||
| 538 | __be32 arp_addr_list[IEEE80211_BSS_ARP_ADDR_LIST_LEN]; | 555 | __be32 arp_addr_list[IEEE80211_BSS_ARP_ADDR_LIST_LEN]; |
| 539 | int arp_addr_cnt; | 556 | int arp_addr_cnt; |
| 540 | bool qos; | 557 | bool qos; |
| @@ -691,12 +708,14 @@ enum mac80211_tx_info_flags { | |||
| 691 | * protocol frame (e.g. EAP) | 708 | * protocol frame (e.g. EAP) |
| 692 | * @IEEE80211_TX_CTRL_PS_RESPONSE: This frame is a response to a poll | 709 | * @IEEE80211_TX_CTRL_PS_RESPONSE: This frame is a response to a poll |
| 693 | * frame (PS-Poll or uAPSD). | 710 | * frame (PS-Poll or uAPSD). |
| 711 | * @IEEE80211_TX_CTRL_RATE_INJECT: This frame is injected with rate information | ||
| 694 | * | 712 | * |
| 695 | * These flags are used in tx_info->control.flags. | 713 | * These flags are used in tx_info->control.flags. |
| 696 | */ | 714 | */ |
| 697 | enum mac80211_tx_control_flags { | 715 | enum mac80211_tx_control_flags { |
| 698 | IEEE80211_TX_CTRL_PORT_CTRL_PROTO = BIT(0), | 716 | IEEE80211_TX_CTRL_PORT_CTRL_PROTO = BIT(0), |
| 699 | IEEE80211_TX_CTRL_PS_RESPONSE = BIT(1), | 717 | IEEE80211_TX_CTRL_PS_RESPONSE = BIT(1), |
| 718 | IEEE80211_TX_CTRL_RATE_INJECT = BIT(2), | ||
| 700 | }; | 719 | }; |
| 701 | 720 | ||
| 702 | /* | 721 | /* |
| @@ -993,6 +1012,8 @@ ieee80211_tx_info_clear_status(struct ieee80211_tx_info *info) | |||
| 993 | * @RX_FLAG_MACTIME_END: The timestamp passed in the RX status (@mactime | 1012 | * @RX_FLAG_MACTIME_END: The timestamp passed in the RX status (@mactime |
| 994 | * field) is valid and contains the time the last symbol of the MPDU | 1013 | * field) is valid and contains the time the last symbol of the MPDU |
| 995 | * (including FCS) was received. | 1014 | * (including FCS) was received. |
| 1015 | * @RX_FLAG_MACTIME_PLCP_START: The timestamp passed in the RX status (@mactime | ||
| 1016 | * field) is valid and contains the time the SYNC preamble was received. | ||
| 996 | * @RX_FLAG_SHORTPRE: Short preamble was used for this frame | 1017 | * @RX_FLAG_SHORTPRE: Short preamble was used for this frame |
| 997 | * @RX_FLAG_HT: HT MCS was used and rate_idx is MCS index | 1018 | * @RX_FLAG_HT: HT MCS was used and rate_idx is MCS index |
| 998 | * @RX_FLAG_VHT: VHT MCS was used and rate_index is MCS index | 1019 | * @RX_FLAG_VHT: VHT MCS was used and rate_index is MCS index |
| @@ -1014,6 +1035,14 @@ ieee80211_tx_info_clear_status(struct ieee80211_tx_info *info) | |||
| 1014 | * @RX_FLAG_AMPDU_DELIM_CRC_KNOWN: The delimiter CRC field is known (the CRC | 1035 | * @RX_FLAG_AMPDU_DELIM_CRC_KNOWN: The delimiter CRC field is known (the CRC |
| 1015 | * is stored in the @ampdu_delimiter_crc field) | 1036 | * is stored in the @ampdu_delimiter_crc field) |
| 1016 | * @RX_FLAG_LDPC: LDPC was used | 1037 | * @RX_FLAG_LDPC: LDPC was used |
| 1038 | * @RX_FLAG_ONLY_MONITOR: Report frame only to monitor interfaces without | ||
| 1039 | * processing it in any regular way. | ||
| 1040 | * This is useful if drivers offload some frames but still want to report | ||
| 1041 | * them for sniffing purposes. | ||
| 1042 | * @RX_FLAG_SKIP_MONITOR: Process and report frame to all interfaces except | ||
| 1043 | * monitor interfaces. | ||
| 1044 | * This is useful if drivers offload some frames but still want to report | ||
| 1045 | * them for sniffing purposes. | ||
| 1017 | * @RX_FLAG_STBC_MASK: STBC 2 bit bitmask. 1 - Nss=1, 2 - Nss=2, 3 - Nss=3 | 1046 | * @RX_FLAG_STBC_MASK: STBC 2 bit bitmask. 1 - Nss=1, 2 - Nss=2, 3 - Nss=3 |
| 1018 | * @RX_FLAG_10MHZ: 10 MHz (half channel) was used | 1047 | * @RX_FLAG_10MHZ: 10 MHz (half channel) was used |
| 1019 | * @RX_FLAG_5MHZ: 5 MHz (quarter channel) was used | 1048 | * @RX_FLAG_5MHZ: 5 MHz (quarter channel) was used |
| @@ -1033,6 +1062,7 @@ ieee80211_tx_info_clear_status(struct ieee80211_tx_info *info) | |||
| 1033 | enum mac80211_rx_flags { | 1062 | enum mac80211_rx_flags { |
| 1034 | RX_FLAG_MMIC_ERROR = BIT(0), | 1063 | RX_FLAG_MMIC_ERROR = BIT(0), |
| 1035 | RX_FLAG_DECRYPTED = BIT(1), | 1064 | RX_FLAG_DECRYPTED = BIT(1), |
| 1065 | RX_FLAG_MACTIME_PLCP_START = BIT(2), | ||
| 1036 | RX_FLAG_MMIC_STRIPPED = BIT(3), | 1066 | RX_FLAG_MMIC_STRIPPED = BIT(3), |
| 1037 | RX_FLAG_IV_STRIPPED = BIT(4), | 1067 | RX_FLAG_IV_STRIPPED = BIT(4), |
| 1038 | RX_FLAG_FAILED_FCS_CRC = BIT(5), | 1068 | RX_FLAG_FAILED_FCS_CRC = BIT(5), |
| @@ -1046,7 +1076,7 @@ enum mac80211_rx_flags { | |||
| 1046 | RX_FLAG_HT_GF = BIT(13), | 1076 | RX_FLAG_HT_GF = BIT(13), |
| 1047 | RX_FLAG_AMPDU_DETAILS = BIT(14), | 1077 | RX_FLAG_AMPDU_DETAILS = BIT(14), |
| 1048 | RX_FLAG_PN_VALIDATED = BIT(15), | 1078 | RX_FLAG_PN_VALIDATED = BIT(15), |
| 1049 | /* bit 16 free */ | 1079 | RX_FLAG_DUP_VALIDATED = BIT(16), |
| 1050 | RX_FLAG_AMPDU_LAST_KNOWN = BIT(17), | 1080 | RX_FLAG_AMPDU_LAST_KNOWN = BIT(17), |
| 1051 | RX_FLAG_AMPDU_IS_LAST = BIT(18), | 1081 | RX_FLAG_AMPDU_IS_LAST = BIT(18), |
| 1052 | RX_FLAG_AMPDU_DELIM_CRC_ERROR = BIT(19), | 1082 | RX_FLAG_AMPDU_DELIM_CRC_ERROR = BIT(19), |
| @@ -1054,6 +1084,8 @@ enum mac80211_rx_flags { | |||
| 1054 | RX_FLAG_MACTIME_END = BIT(21), | 1084 | RX_FLAG_MACTIME_END = BIT(21), |
| 1055 | RX_FLAG_VHT = BIT(22), | 1085 | RX_FLAG_VHT = BIT(22), |
| 1056 | RX_FLAG_LDPC = BIT(23), | 1086 | RX_FLAG_LDPC = BIT(23), |
| 1087 | RX_FLAG_ONLY_MONITOR = BIT(24), | ||
| 1088 | RX_FLAG_SKIP_MONITOR = BIT(25), | ||
| 1057 | RX_FLAG_STBC_MASK = BIT(26) | BIT(27), | 1089 | RX_FLAG_STBC_MASK = BIT(26) | BIT(27), |
| 1058 | RX_FLAG_10MHZ = BIT(28), | 1090 | RX_FLAG_10MHZ = BIT(28), |
| 1059 | RX_FLAG_5MHZ = BIT(29), | 1091 | RX_FLAG_5MHZ = BIT(29), |
| @@ -1072,6 +1104,7 @@ enum mac80211_rx_flags { | |||
| 1072 | * @RX_VHT_FLAG_160MHZ: 160 MHz was used | 1104 | * @RX_VHT_FLAG_160MHZ: 160 MHz was used |
| 1073 | * @RX_VHT_FLAG_BF: packet was beamformed | 1105 | * @RX_VHT_FLAG_BF: packet was beamformed |
| 1074 | */ | 1106 | */ |
| 1107 | |||
| 1075 | enum mac80211_rx_vht_flags { | 1108 | enum mac80211_rx_vht_flags { |
| 1076 | RX_VHT_FLAG_80MHZ = BIT(0), | 1109 | RX_VHT_FLAG_80MHZ = BIT(0), |
| 1077 | RX_VHT_FLAG_160MHZ = BIT(1), | 1110 | RX_VHT_FLAG_160MHZ = BIT(1), |
| @@ -1091,6 +1124,8 @@ enum mac80211_rx_vht_flags { | |||
| 1091 | * it but can store it and pass it back to the driver for synchronisation | 1124 | * it but can store it and pass it back to the driver for synchronisation |
| 1092 | * @band: the active band when this frame was received | 1125 | * @band: the active band when this frame was received |
| 1093 | * @freq: frequency the radio was tuned to when receiving this frame, in MHz | 1126 | * @freq: frequency the radio was tuned to when receiving this frame, in MHz |
| 1127 | * This field must be set for management frames, but isn't strictly needed | ||
| 1128 | * for data (other) frames - for those it only affects radiotap reporting. | ||
| 1094 | * @signal: signal strength when receiving this frame, either in dBm, in dB or | 1129 | * @signal: signal strength when receiving this frame, either in dBm, in dB or |
| 1095 | * unspecified depending on the hardware capabilities flags | 1130 | * unspecified depending on the hardware capabilities flags |
| 1096 | * @IEEE80211_HW_SIGNAL_* | 1131 | * @IEEE80211_HW_SIGNAL_* |
| @@ -1347,6 +1382,7 @@ enum ieee80211_vif_flags { | |||
| 1347 | * @csa_active: marks whether a channel switch is going on. Internally it is | 1382 | * @csa_active: marks whether a channel switch is going on. Internally it is |
| 1348 | * write-protected by sdata_lock and local->mtx so holding either is fine | 1383 | * write-protected by sdata_lock and local->mtx so holding either is fine |
| 1349 | * for read access. | 1384 | * for read access. |
| 1385 | * @mu_mimo_owner: indicates interface owns MU-MIMO capability | ||
| 1350 | * @driver_flags: flags/capabilities the driver has for this interface, | 1386 | * @driver_flags: flags/capabilities the driver has for this interface, |
| 1351 | * these need to be set (or cleared) when the interface is added | 1387 | * these need to be set (or cleared) when the interface is added |
| 1352 | * or, if supported by the driver, the interface type is changed | 1388 | * or, if supported by the driver, the interface type is changed |
| @@ -1373,6 +1409,7 @@ struct ieee80211_vif { | |||
| 1373 | u8 addr[ETH_ALEN]; | 1409 | u8 addr[ETH_ALEN]; |
| 1374 | bool p2p; | 1410 | bool p2p; |
| 1375 | bool csa_active; | 1411 | bool csa_active; |
| 1412 | bool mu_mimo_owner; | ||
| 1376 | 1413 | ||
| 1377 | u8 cab_queue; | 1414 | u8 cab_queue; |
| 1378 | u8 hw_queue[IEEE80211_NUM_ACS]; | 1415 | u8 hw_queue[IEEE80211_NUM_ACS]; |
| @@ -1486,9 +1523,8 @@ enum ieee80211_key_flags { | |||
| 1486 | * wants to be given when a frame is transmitted and needs to be | 1523 | * wants to be given when a frame is transmitted and needs to be |
| 1487 | * encrypted in hardware. | 1524 | * encrypted in hardware. |
| 1488 | * @cipher: The key's cipher suite selector. | 1525 | * @cipher: The key's cipher suite selector. |
| 1489 | * @tx_pn: PN used for TX on non-TKIP keys, may be used by the driver | 1526 | * @tx_pn: PN used for TX keys, may be used by the driver as well if it |
| 1490 | * as well if it needs to do software PN assignment by itself | 1527 | * needs to do software PN assignment by itself (e.g. due to TSO) |
| 1491 | * (e.g. due to TSO) | ||
| 1492 | * @flags: key flags, see &enum ieee80211_key_flags. | 1528 | * @flags: key flags, see &enum ieee80211_key_flags. |
| 1493 | * @keyidx: the key index (0-3) | 1529 | * @keyidx: the key index (0-3) |
| 1494 | * @keylen: key material length | 1530 | * @keylen: key material length |
| @@ -1514,6 +1550,9 @@ struct ieee80211_key_conf { | |||
| 1514 | 1550 | ||
| 1515 | #define IEEE80211_MAX_PN_LEN 16 | 1551 | #define IEEE80211_MAX_PN_LEN 16 |
| 1516 | 1552 | ||
| 1553 | #define TKIP_PN_TO_IV16(pn) ((u16)(pn & 0xffff)) | ||
| 1554 | #define TKIP_PN_TO_IV32(pn) ((u32)((pn >> 16) & 0xffffffff)) | ||
| 1555 | |||
| 1517 | /** | 1556 | /** |
| 1518 | * struct ieee80211_key_seq - key sequence counter | 1557 | * struct ieee80211_key_seq - key sequence counter |
| 1519 | * | 1558 | * |
| @@ -1684,6 +1723,18 @@ struct ieee80211_sta_rates { | |||
| 1684 | * @tdls_initiator: indicates the STA is an initiator of the TDLS link. Only | 1723 | * @tdls_initiator: indicates the STA is an initiator of the TDLS link. Only |
| 1685 | * valid if the STA is a TDLS peer in the first place. | 1724 | * valid if the STA is a TDLS peer in the first place. |
| 1686 | * @mfp: indicates whether the STA uses management frame protection or not. | 1725 | * @mfp: indicates whether the STA uses management frame protection or not. |
| 1726 | * @max_amsdu_subframes: indicates the maximal number of MSDUs in a single | ||
| 1727 | * A-MSDU. Taken from the Extended Capabilities element. 0 means | ||
| 1728 | * unlimited. | ||
| 1729 | * @max_amsdu_len: indicates the maximal length of an A-MSDU in bytes. This | ||
| 1730 | * field is always valid for packets with a VHT preamble. For packets | ||
| 1731 | * with a HT preamble, additional limits apply: | ||
| 1732 | * + If the skb is transmitted as part of a BA agreement, the | ||
| 1733 | * A-MSDU maximal size is min(max_amsdu_len, 4065) bytes. | ||
| 1734 | * + If the skb is not part of a BA aggreement, the A-MSDU maximal | ||
| 1735 | * size is min(max_amsdu_len, 7935) bytes. | ||
| 1736 | * Both additional HT limits must be enforced by the low level driver. | ||
| 1737 | * This is defined by the spec (IEEE 802.11-2012 section 8.3.2.2 NOTE 2). | ||
| 1687 | * @txq: per-TID data TX queues (if driver uses the TXQ abstraction) | 1738 | * @txq: per-TID data TX queues (if driver uses the TXQ abstraction) |
| 1688 | */ | 1739 | */ |
| 1689 | struct ieee80211_sta { | 1740 | struct ieee80211_sta { |
| @@ -1702,6 +1753,8 @@ struct ieee80211_sta { | |||
| 1702 | bool tdls; | 1753 | bool tdls; |
| 1703 | bool tdls_initiator; | 1754 | bool tdls_initiator; |
| 1704 | bool mfp; | 1755 | bool mfp; |
| 1756 | u8 max_amsdu_subframes; | ||
| 1757 | u16 max_amsdu_len; | ||
| 1705 | 1758 | ||
| 1706 | struct ieee80211_txq *txq[IEEE80211_NUM_TIDS]; | 1759 | struct ieee80211_txq *txq[IEEE80211_NUM_TIDS]; |
| 1707 | 1760 | ||
| @@ -1910,6 +1963,11 @@ struct ieee80211_txq { | |||
| 1910 | * by just its MAC address; this prevents, for example, the same station | 1963 | * by just its MAC address; this prevents, for example, the same station |
| 1911 | * from connecting to two virtual AP interfaces at the same time. | 1964 | * from connecting to two virtual AP interfaces at the same time. |
| 1912 | * | 1965 | * |
| 1966 | * @IEEE80211_HW_SUPPORTS_REORDERING_BUFFER: Hardware (or driver) manages the | ||
| 1967 | * reordering buffer internally, guaranteeing mac80211 receives frames in | ||
| 1968 | * order and does not need to manage its own reorder buffer or BA session | ||
| 1969 | * timeout. | ||
| 1970 | * | ||
| 1913 | * @NUM_IEEE80211_HW_FLAGS: number of hardware flags, used for sizing arrays | 1971 | * @NUM_IEEE80211_HW_FLAGS: number of hardware flags, used for sizing arrays |
| 1914 | */ | 1972 | */ |
| 1915 | enum ieee80211_hw_flags { | 1973 | enum ieee80211_hw_flags { |
| @@ -1946,6 +2004,7 @@ enum ieee80211_hw_flags { | |||
| 1946 | IEEE80211_HW_SUPPORTS_AMSDU_IN_AMPDU, | 2004 | IEEE80211_HW_SUPPORTS_AMSDU_IN_AMPDU, |
| 1947 | IEEE80211_HW_BEACON_TX_STATUS, | 2005 | IEEE80211_HW_BEACON_TX_STATUS, |
| 1948 | IEEE80211_HW_NEEDS_UNIQUE_STA_ADDR, | 2006 | IEEE80211_HW_NEEDS_UNIQUE_STA_ADDR, |
| 2007 | IEEE80211_HW_SUPPORTS_REORDERING_BUFFER, | ||
| 1949 | 2008 | ||
| 1950 | /* keep last, obviously */ | 2009 | /* keep last, obviously */ |
| 1951 | NUM_IEEE80211_HW_FLAGS | 2010 | NUM_IEEE80211_HW_FLAGS |
| @@ -2167,7 +2226,7 @@ static inline void SET_IEEE80211_DEV(struct ieee80211_hw *hw, struct device *dev | |||
| 2167 | * @hw: the &struct ieee80211_hw to set the MAC address for | 2226 | * @hw: the &struct ieee80211_hw to set the MAC address for |
| 2168 | * @addr: the address to set | 2227 | * @addr: the address to set |
| 2169 | */ | 2228 | */ |
| 2170 | static inline void SET_IEEE80211_PERM_ADDR(struct ieee80211_hw *hw, u8 *addr) | 2229 | static inline void SET_IEEE80211_PERM_ADDR(struct ieee80211_hw *hw, const u8 *addr) |
| 2171 | { | 2230 | { |
| 2172 | memcpy(hw->wiphy->perm_addr, addr, ETH_ALEN); | 2231 | memcpy(hw->wiphy->perm_addr, addr, ETH_ALEN); |
| 2173 | } | 2232 | } |
| @@ -2684,6 +2743,33 @@ enum ieee80211_ampdu_mlme_action { | |||
| 2684 | }; | 2743 | }; |
| 2685 | 2744 | ||
| 2686 | /** | 2745 | /** |
| 2746 | * struct ieee80211_ampdu_params - AMPDU action parameters | ||
| 2747 | * | ||
| 2748 | * @action: the ampdu action, value from %ieee80211_ampdu_mlme_action. | ||
| 2749 | * @sta: peer of this AMPDU session | ||
| 2750 | * @tid: tid of the BA session | ||
| 2751 | * @ssn: start sequence number of the session. TX/RX_STOP can pass 0. When | ||
| 2752 | * action is set to %IEEE80211_AMPDU_RX_START the driver passes back the | ||
| 2753 | * actual ssn value used to start the session and writes the value here. | ||
| 2754 | * @buf_size: reorder buffer size (number of subframes). Valid only when the | ||
| 2755 | * action is set to %IEEE80211_AMPDU_RX_START or | ||
| 2756 | * %IEEE80211_AMPDU_TX_OPERATIONAL | ||
| 2757 | * @amsdu: indicates the peer's ability to receive A-MSDU within A-MPDU. | ||
| 2758 | * valid when the action is set to %IEEE80211_AMPDU_TX_OPERATIONAL | ||
| 2759 | * @timeout: BA session timeout. Valid only when the action is set to | ||
| 2760 | * %IEEE80211_AMPDU_RX_START | ||
| 2761 | */ | ||
| 2762 | struct ieee80211_ampdu_params { | ||
| 2763 | enum ieee80211_ampdu_mlme_action action; | ||
| 2764 | struct ieee80211_sta *sta; | ||
| 2765 | u16 tid; | ||
| 2766 | u16 ssn; | ||
| 2767 | u8 buf_size; | ||
| 2768 | bool amsdu; | ||
| 2769 | u16 timeout; | ||
| 2770 | }; | ||
| 2771 | |||
| 2772 | /** | ||
| 2687 | * enum ieee80211_frame_release_type - frame release reason | 2773 | * enum ieee80211_frame_release_type - frame release reason |
| 2688 | * @IEEE80211_FRAME_RELEASE_PSPOLL: frame released for PS-Poll | 2774 | * @IEEE80211_FRAME_RELEASE_PSPOLL: frame released for PS-Poll |
| 2689 | * @IEEE80211_FRAME_RELEASE_UAPSD: frame(s) released due to | 2775 | * @IEEE80211_FRAME_RELEASE_UAPSD: frame(s) released due to |
| @@ -3027,13 +3113,9 @@ enum ieee80211_reconfig_type { | |||
| 3027 | * @ampdu_action: Perform a certain A-MPDU action | 3113 | * @ampdu_action: Perform a certain A-MPDU action |
| 3028 | * The RA/TID combination determines the destination and TID we want | 3114 | * The RA/TID combination determines the destination and TID we want |
| 3029 | * the ampdu action to be performed for. The action is defined through | 3115 | * the ampdu action to be performed for. The action is defined through |
| 3030 | * ieee80211_ampdu_mlme_action. Starting sequence number (@ssn) | 3116 | * ieee80211_ampdu_mlme_action. |
| 3031 | * is the first frame we expect to perform the action on. Notice | 3117 | * When the action is set to %IEEE80211_AMPDU_TX_OPERATIONAL the driver |
| 3032 | * that TX/RX_STOP can pass NULL for this parameter. | 3118 | * may neither send aggregates containing more subframes than @buf_size |
| 3033 | * The @buf_size parameter is only valid when the action is set to | ||
| 3034 | * %IEEE80211_AMPDU_TX_OPERATIONAL and indicates the peer's reorder | ||
| 3035 | * buffer size (number of subframes) for this session -- the driver | ||
| 3036 | * may neither send aggregates containing more subframes than this | ||
| 3037 | * nor send aggregates in a way that lost frames would exceed the | 3119 | * nor send aggregates in a way that lost frames would exceed the |
| 3038 | * buffer size. If just limiting the aggregate size, this would be | 3120 | * buffer size. If just limiting the aggregate size, this would be |
| 3039 | * possible with a buf_size of 8: | 3121 | * possible with a buf_size of 8: |
| @@ -3044,9 +3126,6 @@ enum ieee80211_reconfig_type { | |||
| 3044 | * buffer size of 8. Correct ways to retransmit #1 would be: | 3126 | * buffer size of 8. Correct ways to retransmit #1 would be: |
| 3045 | * - TX: 1 or 18 or 81 | 3127 | * - TX: 1 or 18 or 81 |
| 3046 | * Even "189" would be wrong since 1 could be lost again. | 3128 | * Even "189" would be wrong since 1 could be lost again. |
| 3047 | * The @amsdu parameter is valid when the action is set to | ||
| 3048 | * %IEEE80211_AMPDU_TX_OPERATIONAL and indicates the peer's ability | ||
| 3049 | * to receive A-MSDU within A-MPDU. | ||
| 3050 | * | 3129 | * |
| 3051 | * Returns a negative error code on failure. | 3130 | * Returns a negative error code on failure. |
| 3052 | * The callback can sleep. | 3131 | * The callback can sleep. |
| @@ -3388,9 +3467,7 @@ struct ieee80211_ops { | |||
| 3388 | int (*tx_last_beacon)(struct ieee80211_hw *hw); | 3467 | int (*tx_last_beacon)(struct ieee80211_hw *hw); |
| 3389 | int (*ampdu_action)(struct ieee80211_hw *hw, | 3468 | int (*ampdu_action)(struct ieee80211_hw *hw, |
| 3390 | struct ieee80211_vif *vif, | 3469 | struct ieee80211_vif *vif, |
| 3391 | enum ieee80211_ampdu_mlme_action action, | 3470 | struct ieee80211_ampdu_params *params); |
| 3392 | struct ieee80211_sta *sta, u16 tid, u16 *ssn, | ||
| 3393 | u8 buf_size, bool amsdu); | ||
| 3394 | int (*get_survey)(struct ieee80211_hw *hw, int idx, | 3471 | int (*get_survey)(struct ieee80211_hw *hw, int idx, |
| 3395 | struct survey_info *survey); | 3472 | struct survey_info *survey); |
| 3396 | void (*rfkill_poll)(struct ieee80211_hw *hw); | 3473 | void (*rfkill_poll)(struct ieee80211_hw *hw); |
| @@ -4374,21 +4451,19 @@ void ieee80211_get_tkip_p2k(struct ieee80211_key_conf *keyconf, | |||
| 4374 | struct sk_buff *skb, u8 *p2k); | 4451 | struct sk_buff *skb, u8 *p2k); |
| 4375 | 4452 | ||
| 4376 | /** | 4453 | /** |
| 4377 | * ieee80211_get_key_tx_seq - get key TX sequence counter | 4454 | * ieee80211_tkip_add_iv - write TKIP IV and Ext. IV to pos |
| 4378 | * | 4455 | * |
| 4456 | * @pos: start of crypto header | ||
| 4379 | * @keyconf: the parameter passed with the set key | 4457 | * @keyconf: the parameter passed with the set key |
| 4380 | * @seq: buffer to receive the sequence data | 4458 | * @pn: PN to add |
| 4381 | * | 4459 | * |
| 4382 | * This function allows a driver to retrieve the current TX IV/PN | 4460 | * Returns: pointer to the octet following IVs (i.e. beginning of |
| 4383 | * for the given key. It must not be called if IV generation is | 4461 | * the packet payload) |
| 4384 | * offloaded to the device. | ||
| 4385 | * | 4462 | * |
| 4386 | * Note that this function may only be called when no TX processing | 4463 | * This function writes the tkip IV value to pos (which should |
| 4387 | * can be done concurrently, for example when queues are stopped | 4464 | * point to the crypto header) |
| 4388 | * and the stop has been synchronized. | ||
| 4389 | */ | 4465 | */ |
| 4390 | void ieee80211_get_key_tx_seq(struct ieee80211_key_conf *keyconf, | 4466 | u8 *ieee80211_tkip_add_iv(u8 *pos, struct ieee80211_key_conf *keyconf, u64 pn); |
| 4391 | struct ieee80211_key_seq *seq); | ||
| 4392 | 4467 | ||
| 4393 | /** | 4468 | /** |
| 4394 | * ieee80211_get_key_rx_seq - get key RX sequence counter | 4469 | * ieee80211_get_key_rx_seq - get key RX sequence counter |
| @@ -4410,23 +4485,6 @@ void ieee80211_get_key_rx_seq(struct ieee80211_key_conf *keyconf, | |||
| 4410 | int tid, struct ieee80211_key_seq *seq); | 4485 | int tid, struct ieee80211_key_seq *seq); |
| 4411 | 4486 | ||
| 4412 | /** | 4487 | /** |
| 4413 | * ieee80211_set_key_tx_seq - set key TX sequence counter | ||
| 4414 | * | ||
| 4415 | * @keyconf: the parameter passed with the set key | ||
| 4416 | * @seq: new sequence data | ||
| 4417 | * | ||
| 4418 | * This function allows a driver to set the current TX IV/PNs for the | ||
| 4419 | * given key. This is useful when resuming from WoWLAN sleep and the | ||
| 4420 | * device may have transmitted frames using the PTK, e.g. replies to | ||
| 4421 | * ARP requests. | ||
| 4422 | * | ||
| 4423 | * Note that this function may only be called when no TX processing | ||
| 4424 | * can be done concurrently. | ||
| 4425 | */ | ||
| 4426 | void ieee80211_set_key_tx_seq(struct ieee80211_key_conf *keyconf, | ||
| 4427 | struct ieee80211_key_seq *seq); | ||
| 4428 | |||
| 4429 | /** | ||
| 4430 | * ieee80211_set_key_rx_seq - set key RX sequence counter | 4488 | * ieee80211_set_key_rx_seq - set key RX sequence counter |
| 4431 | * | 4489 | * |
| 4432 | * @keyconf: the parameter passed with the set key | 4490 | * @keyconf: the parameter passed with the set key |
| @@ -5121,6 +5179,24 @@ void ieee80211_stop_rx_ba_session(struct ieee80211_vif *vif, u16 ba_rx_bitmap, | |||
| 5121 | const u8 *addr); | 5179 | const u8 *addr); |
| 5122 | 5180 | ||
| 5123 | /** | 5181 | /** |
| 5182 | * ieee80211_mark_rx_ba_filtered_frames - move RX BA window and mark filtered | ||
| 5183 | * @pubsta: station struct | ||
| 5184 | * @tid: the session's TID | ||
| 5185 | * @ssn: starting sequence number of the bitmap, all frames before this are | ||
| 5186 | * assumed to be out of the window after the call | ||
| 5187 | * @filtered: bitmap of filtered frames, BIT(0) is the @ssn entry etc. | ||
| 5188 | * @received_mpdus: number of received mpdus in firmware | ||
| 5189 | * | ||
| 5190 | * This function moves the BA window and releases all frames before @ssn, and | ||
| 5191 | * marks frames marked in the bitmap as having been filtered. Afterwards, it | ||
| 5192 | * checks if any frames in the window starting from @ssn can now be released | ||
| 5193 | * (in case they were only waiting for frames that were filtered.) | ||
| 5194 | */ | ||
| 5195 | void ieee80211_mark_rx_ba_filtered_frames(struct ieee80211_sta *pubsta, u8 tid, | ||
| 5196 | u16 ssn, u64 filtered, | ||
| 5197 | u16 received_mpdus); | ||
| 5198 | |||
| 5199 | /** | ||
| 5124 | * ieee80211_send_bar - send a BlockAckReq frame | 5200 | * ieee80211_send_bar - send a BlockAckReq frame |
| 5125 | * | 5201 | * |
| 5126 | * can be used to flush pending frames from the peer's aggregation reorder | 5202 | * can be used to flush pending frames from the peer's aggregation reorder |
| @@ -5371,6 +5447,21 @@ ieee80211_vif_type_p2p(struct ieee80211_vif *vif) | |||
| 5371 | return ieee80211_iftype_p2p(vif->type, vif->p2p); | 5447 | return ieee80211_iftype_p2p(vif->type, vif->p2p); |
| 5372 | } | 5448 | } |
| 5373 | 5449 | ||
| 5450 | /** | ||
| 5451 | * ieee80211_update_mu_groups - set the VHT MU-MIMO groud data | ||
| 5452 | * | ||
| 5453 | * @vif: the specified virtual interface | ||
| 5454 | * @membership: 64 bits array - a bit is set if station is member of the group | ||
| 5455 | * @position: 2 bits per group id indicating the position in the group | ||
| 5456 | * | ||
| 5457 | * Note: This function assumes that the given vif is valid and the position and | ||
| 5458 | * membership data is of the correct size and are in the same byte order as the | ||
| 5459 | * matching GroupId management frame. | ||
| 5460 | * Calls to this function need to be serialized with RX path. | ||
| 5461 | */ | ||
| 5462 | void ieee80211_update_mu_groups(struct ieee80211_vif *vif, | ||
| 5463 | const u8 *membership, const u8 *position); | ||
| 5464 | |||
| 5374 | void ieee80211_enable_rssi_reports(struct ieee80211_vif *vif, | 5465 | void ieee80211_enable_rssi_reports(struct ieee80211_vif *vif, |
| 5375 | int rssi_min_thold, | 5466 | int rssi_min_thold, |
| 5376 | int rssi_max_thold); | 5467 | int rssi_max_thold); |
| @@ -5523,4 +5614,19 @@ void ieee80211_unreserve_tid(struct ieee80211_sta *sta, u8 tid); | |||
| 5523 | */ | 5614 | */ |
| 5524 | struct sk_buff *ieee80211_tx_dequeue(struct ieee80211_hw *hw, | 5615 | struct sk_buff *ieee80211_tx_dequeue(struct ieee80211_hw *hw, |
| 5525 | struct ieee80211_txq *txq); | 5616 | struct ieee80211_txq *txq); |
| 5617 | |||
| 5618 | /** | ||
| 5619 | * ieee80211_txq_get_depth - get pending frame/byte count of given txq | ||
| 5620 | * | ||
| 5621 | * The values are not guaranteed to be coherent with regard to each other, i.e. | ||
| 5622 | * txq state can change half-way of this function and the caller may end up | ||
| 5623 | * with "new" frame_cnt and "old" byte_cnt or vice-versa. | ||
| 5624 | * | ||
| 5625 | * @txq: pointer obtained from station or virtual interface | ||
| 5626 | * @frame_cnt: pointer to store frame count | ||
| 5627 | * @byte_cnt: pointer to store byte count | ||
| 5628 | */ | ||
| 5629 | void ieee80211_txq_get_depth(struct ieee80211_txq *txq, | ||
| 5630 | unsigned long *frame_cnt, | ||
| 5631 | unsigned long *byte_cnt); | ||
| 5526 | #endif /* MAC80211_H */ | 5632 | #endif /* MAC80211_H */ |
diff --git a/include/net/mac802154.h b/include/net/mac802154.h index da574bbdc333..6cd7a70706a9 100644 --- a/include/net/mac802154.h +++ b/include/net/mac802154.h | |||
| @@ -16,10 +16,10 @@ | |||
| 16 | #ifndef NET_MAC802154_H | 16 | #ifndef NET_MAC802154_H |
| 17 | #define NET_MAC802154_H | 17 | #define NET_MAC802154_H |
| 18 | 18 | ||
| 19 | #include <asm/unaligned.h> | ||
| 19 | #include <net/af_ieee802154.h> | 20 | #include <net/af_ieee802154.h> |
| 20 | #include <linux/ieee802154.h> | 21 | #include <linux/ieee802154.h> |
| 21 | #include <linux/skbuff.h> | 22 | #include <linux/skbuff.h> |
| 22 | #include <linux/unaligned/memmove.h> | ||
| 23 | 23 | ||
| 24 | #include <net/cfg802154.h> | 24 | #include <net/cfg802154.h> |
| 25 | 25 | ||
| @@ -247,13 +247,14 @@ struct ieee802154_ops { | |||
| 247 | */ | 247 | */ |
| 248 | static inline __le16 ieee802154_get_fc_from_skb(const struct sk_buff *skb) | 248 | static inline __le16 ieee802154_get_fc_from_skb(const struct sk_buff *skb) |
| 249 | { | 249 | { |
| 250 | /* return some invalid fc on failure */ | 250 | /* check if we can fc at skb_mac_header of sk buffer */ |
| 251 | if (unlikely(skb->len < 2)) { | 251 | if (unlikely(!skb_mac_header_was_set(skb) || |
| 252 | (skb_tail_pointer(skb) - skb_mac_header(skb)) < 2)) { | ||
| 252 | WARN_ON(1); | 253 | WARN_ON(1); |
| 253 | return cpu_to_le16(0); | 254 | return cpu_to_le16(0); |
| 254 | } | 255 | } |
| 255 | 256 | ||
| 256 | return (__force __le16)__get_unaligned_memmove16(skb_mac_header(skb)); | 257 | return get_unaligned_le16(skb_mac_header(skb)); |
| 257 | } | 258 | } |
| 258 | 259 | ||
| 259 | /** | 260 | /** |
| @@ -263,7 +264,7 @@ static inline __le16 ieee802154_get_fc_from_skb(const struct sk_buff *skb) | |||
| 263 | */ | 264 | */ |
| 264 | static inline void ieee802154_be64_to_le64(void *le64_dst, const void *be64_src) | 265 | static inline void ieee802154_be64_to_le64(void *le64_dst, const void *be64_src) |
| 265 | { | 266 | { |
| 266 | __put_unaligned_memmove64(swab64p(be64_src), le64_dst); | 267 | put_unaligned_le64(get_unaligned_be64(be64_src), le64_dst); |
| 267 | } | 268 | } |
| 268 | 269 | ||
| 269 | /** | 270 | /** |
| @@ -273,7 +274,7 @@ static inline void ieee802154_be64_to_le64(void *le64_dst, const void *be64_src) | |||
| 273 | */ | 274 | */ |
| 274 | static inline void ieee802154_le64_to_be64(void *be64_dst, const void *le64_src) | 275 | static inline void ieee802154_le64_to_be64(void *be64_dst, const void *le64_src) |
| 275 | { | 276 | { |
| 276 | __put_unaligned_memmove64(swab64p(le64_src), be64_dst); | 277 | put_unaligned_be64(get_unaligned_le64(le64_src), be64_dst); |
| 277 | } | 278 | } |
| 278 | 279 | ||
| 279 | /** | 280 | /** |
| @@ -283,7 +284,7 @@ static inline void ieee802154_le64_to_be64(void *be64_dst, const void *le64_src) | |||
| 283 | */ | 284 | */ |
| 284 | static inline void ieee802154_le16_to_be16(void *be16_dst, const void *le16_src) | 285 | static inline void ieee802154_le16_to_be16(void *be16_dst, const void *le16_src) |
| 285 | { | 286 | { |
| 286 | __put_unaligned_memmove16(swab16p(le16_src), be16_dst); | 287 | put_unaligned_be16(get_unaligned_le16(le16_src), be16_dst); |
| 287 | } | 288 | } |
| 288 | 289 | ||
| 289 | /** | 290 | /** |
diff --git a/include/net/netfilter/nft_masq.h b/include/net/netfilter/nft_masq.h index e2a518b60e19..a3f3c11b2526 100644 --- a/include/net/netfilter/nft_masq.h +++ b/include/net/netfilter/nft_masq.h | |||
| @@ -2,7 +2,9 @@ | |||
| 2 | #define _NFT_MASQ_H_ | 2 | #define _NFT_MASQ_H_ |
| 3 | 3 | ||
| 4 | struct nft_masq { | 4 | struct nft_masq { |
| 5 | u32 flags; | 5 | u32 flags; |
| 6 | enum nft_registers sreg_proto_min:8; | ||
| 7 | enum nft_registers sreg_proto_max:8; | ||
| 6 | }; | 8 | }; |
| 7 | 9 | ||
| 8 | extern const struct nla_policy nft_masq_policy[]; | 10 | extern const struct nla_policy nft_masq_policy[]; |
diff --git a/include/net/netns/ipv4.h b/include/net/netns/ipv4.h index 2b7907a35568..a69cde3ce460 100644 --- a/include/net/netns/ipv4.h +++ b/include/net/netns/ipv4.h | |||
| @@ -80,9 +80,13 @@ struct netns_ipv4 { | |||
| 80 | int sysctl_tcp_ecn; | 80 | int sysctl_tcp_ecn; |
| 81 | int sysctl_tcp_ecn_fallback; | 81 | int sysctl_tcp_ecn_fallback; |
| 82 | 82 | ||
| 83 | int sysctl_ip_default_ttl; | ||
| 83 | int sysctl_ip_no_pmtu_disc; | 84 | int sysctl_ip_no_pmtu_disc; |
| 84 | int sysctl_ip_fwd_use_pmtu; | 85 | int sysctl_ip_fwd_use_pmtu; |
| 85 | int sysctl_ip_nonlocal_bind; | 86 | int sysctl_ip_nonlocal_bind; |
| 87 | /* Shall we try to damage output packets if routing dev changes? */ | ||
| 88 | int sysctl_ip_dynaddr; | ||
| 89 | int sysctl_ip_early_demux; | ||
| 86 | 90 | ||
| 87 | int sysctl_fwmark_reflect; | 91 | int sysctl_fwmark_reflect; |
| 88 | int sysctl_tcp_fwmark_accept; | 92 | int sysctl_tcp_fwmark_accept; |
| @@ -98,6 +102,21 @@ struct netns_ipv4 { | |||
| 98 | int sysctl_tcp_keepalive_probes; | 102 | int sysctl_tcp_keepalive_probes; |
| 99 | int sysctl_tcp_keepalive_intvl; | 103 | int sysctl_tcp_keepalive_intvl; |
| 100 | 104 | ||
| 105 | int sysctl_tcp_syn_retries; | ||
| 106 | int sysctl_tcp_synack_retries; | ||
| 107 | int sysctl_tcp_syncookies; | ||
| 108 | int sysctl_tcp_reordering; | ||
| 109 | int sysctl_tcp_retries1; | ||
| 110 | int sysctl_tcp_retries2; | ||
| 111 | int sysctl_tcp_orphan_retries; | ||
| 112 | int sysctl_tcp_fin_timeout; | ||
| 113 | unsigned int sysctl_tcp_notsent_lowat; | ||
| 114 | |||
| 115 | int sysctl_igmp_max_memberships; | ||
| 116 | int sysctl_igmp_max_msf; | ||
| 117 | int sysctl_igmp_llm_reports; | ||
| 118 | int sysctl_igmp_qrv; | ||
| 119 | |||
| 101 | struct ping_group_range ping_group_range; | 120 | struct ping_group_range ping_group_range; |
| 102 | 121 | ||
| 103 | atomic_t dev_addr_genid; | 122 | atomic_t dev_addr_genid; |
diff --git a/include/net/netns/ipv6.h b/include/net/netns/ipv6.h index c0368db6df54..10d0848f5b8a 100644 --- a/include/net/netns/ipv6.h +++ b/include/net/netns/ipv6.h | |||
| @@ -58,7 +58,10 @@ struct netns_ipv6 { | |||
| 58 | struct timer_list ip6_fib_timer; | 58 | struct timer_list ip6_fib_timer; |
| 59 | struct hlist_head *fib_table_hash; | 59 | struct hlist_head *fib_table_hash; |
| 60 | struct fib6_table *fib6_main_tbl; | 60 | struct fib6_table *fib6_main_tbl; |
| 61 | struct list_head fib6_walkers; | ||
| 61 | struct dst_ops ip6_dst_ops; | 62 | struct dst_ops ip6_dst_ops; |
| 63 | rwlock_t fib6_walker_lock; | ||
| 64 | spinlock_t fib6_gc_lock; | ||
| 62 | unsigned int ip6_rt_gc_expire; | 65 | unsigned int ip6_rt_gc_expire; |
| 63 | unsigned long ip6_rt_last_gc; | 66 | unsigned long ip6_rt_last_gc; |
| 64 | #ifdef CONFIG_IPV6_MULTIPLE_TABLES | 67 | #ifdef CONFIG_IPV6_MULTIPLE_TABLES |
diff --git a/include/net/phonet/phonet.h b/include/net/phonet/phonet.h index 68e509750caa..039cc29cb4a8 100644 --- a/include/net/phonet/phonet.h +++ b/include/net/phonet/phonet.h | |||
| @@ -51,7 +51,7 @@ void pn_sock_init(void); | |||
| 51 | struct sock *pn_find_sock_by_sa(struct net *net, const struct sockaddr_pn *sa); | 51 | struct sock *pn_find_sock_by_sa(struct net *net, const struct sockaddr_pn *sa); |
| 52 | void pn_deliver_sock_broadcast(struct net *net, struct sk_buff *skb); | 52 | void pn_deliver_sock_broadcast(struct net *net, struct sk_buff *skb); |
| 53 | void phonet_get_local_port_range(int *min, int *max); | 53 | void phonet_get_local_port_range(int *min, int *max); |
| 54 | void pn_sock_hash(struct sock *sk); | 54 | int pn_sock_hash(struct sock *sk); |
| 55 | void pn_sock_unhash(struct sock *sk); | 55 | void pn_sock_unhash(struct sock *sk); |
| 56 | int pn_sock_get_port(struct sock *sk, unsigned short sport); | 56 | int pn_sock_get_port(struct sock *sk, unsigned short sport); |
| 57 | 57 | ||
diff --git a/include/net/ping.h b/include/net/ping.h index ac80cb45e630..5fd7cc244833 100644 --- a/include/net/ping.h +++ b/include/net/ping.h | |||
| @@ -65,7 +65,7 @@ struct pingfakehdr { | |||
| 65 | }; | 65 | }; |
| 66 | 66 | ||
| 67 | int ping_get_port(struct sock *sk, unsigned short ident); | 67 | int ping_get_port(struct sock *sk, unsigned short ident); |
| 68 | void ping_hash(struct sock *sk); | 68 | int ping_hash(struct sock *sk); |
| 69 | void ping_unhash(struct sock *sk); | 69 | void ping_unhash(struct sock *sk); |
| 70 | 70 | ||
| 71 | int ping_init_sock(struct sock *sk); | 71 | int ping_init_sock(struct sock *sk); |
diff --git a/include/net/pkt_cls.h b/include/net/pkt_cls.h index bc49967e1a68..caa5e18636df 100644 --- a/include/net/pkt_cls.h +++ b/include/net/pkt_cls.h | |||
| @@ -358,4 +358,69 @@ tcf_match_indev(struct sk_buff *skb, int ifindex) | |||
| 358 | } | 358 | } |
| 359 | #endif /* CONFIG_NET_CLS_IND */ | 359 | #endif /* CONFIG_NET_CLS_IND */ |
| 360 | 360 | ||
| 361 | struct tc_cls_u32_knode { | ||
| 362 | struct tcf_exts *exts; | ||
| 363 | struct tc_u32_sel *sel; | ||
| 364 | u32 handle; | ||
| 365 | u32 val; | ||
| 366 | u32 mask; | ||
| 367 | u32 link_handle; | ||
| 368 | u8 fshift; | ||
| 369 | }; | ||
| 370 | |||
| 371 | struct tc_cls_u32_hnode { | ||
| 372 | u32 handle; | ||
| 373 | u32 prio; | ||
| 374 | unsigned int divisor; | ||
| 375 | }; | ||
| 376 | |||
| 377 | enum tc_clsu32_command { | ||
| 378 | TC_CLSU32_NEW_KNODE, | ||
| 379 | TC_CLSU32_REPLACE_KNODE, | ||
| 380 | TC_CLSU32_DELETE_KNODE, | ||
| 381 | TC_CLSU32_NEW_HNODE, | ||
| 382 | TC_CLSU32_REPLACE_HNODE, | ||
| 383 | TC_CLSU32_DELETE_HNODE, | ||
| 384 | }; | ||
| 385 | |||
| 386 | struct tc_cls_u32_offload { | ||
| 387 | /* knode values */ | ||
| 388 | enum tc_clsu32_command command; | ||
| 389 | union { | ||
| 390 | struct tc_cls_u32_knode knode; | ||
| 391 | struct tc_cls_u32_hnode hnode; | ||
| 392 | }; | ||
| 393 | }; | ||
| 394 | |||
| 395 | /* tca flags definitions */ | ||
| 396 | #define TCA_CLS_FLAGS_SKIP_HW 1 | ||
| 397 | |||
| 398 | static inline bool tc_should_offload(struct net_device *dev, u32 flags) | ||
| 399 | { | ||
| 400 | if (!(dev->features & NETIF_F_HW_TC)) | ||
| 401 | return false; | ||
| 402 | |||
| 403 | if (flags & TCA_CLS_FLAGS_SKIP_HW) | ||
| 404 | return false; | ||
| 405 | |||
| 406 | if (!dev->netdev_ops->ndo_setup_tc) | ||
| 407 | return false; | ||
| 408 | |||
| 409 | return true; | ||
| 410 | } | ||
| 411 | |||
| 412 | enum tc_fl_command { | ||
| 413 | TC_CLSFLOWER_REPLACE, | ||
| 414 | TC_CLSFLOWER_DESTROY, | ||
| 415 | }; | ||
| 416 | |||
| 417 | struct tc_cls_flower_offload { | ||
| 418 | enum tc_fl_command command; | ||
| 419 | unsigned long cookie; | ||
| 420 | struct flow_dissector *dissector; | ||
| 421 | struct fl_flow_key *mask; | ||
| 422 | struct fl_flow_key *key; | ||
| 423 | struct tcf_exts *exts; | ||
| 424 | }; | ||
| 425 | |||
| 361 | #endif | 426 | #endif |
diff --git a/include/net/raw.h b/include/net/raw.h index 6a40c6562dd2..3e789008394d 100644 --- a/include/net/raw.h +++ b/include/net/raw.h | |||
| @@ -57,7 +57,7 @@ int raw_seq_open(struct inode *ino, struct file *file, | |||
| 57 | 57 | ||
| 58 | #endif | 58 | #endif |
| 59 | 59 | ||
| 60 | void raw_hash_sk(struct sock *sk); | 60 | int raw_hash_sk(struct sock *sk); |
| 61 | void raw_unhash_sk(struct sock *sk); | 61 | void raw_unhash_sk(struct sock *sk); |
| 62 | 62 | ||
| 63 | struct raw_sock { | 63 | struct raw_sock { |
diff --git a/include/net/route.h b/include/net/route.h index a3b9ef74a389..9b0a523bb428 100644 --- a/include/net/route.h +++ b/include/net/route.h | |||
| @@ -329,14 +329,13 @@ static inline int inet_iif(const struct sk_buff *skb) | |||
| 329 | return skb->skb_iif; | 329 | return skb->skb_iif; |
| 330 | } | 330 | } |
| 331 | 331 | ||
| 332 | extern int sysctl_ip_default_ttl; | ||
| 333 | |||
| 334 | static inline int ip4_dst_hoplimit(const struct dst_entry *dst) | 332 | static inline int ip4_dst_hoplimit(const struct dst_entry *dst) |
| 335 | { | 333 | { |
| 336 | int hoplimit = dst_metric_raw(dst, RTAX_HOPLIMIT); | 334 | int hoplimit = dst_metric_raw(dst, RTAX_HOPLIMIT); |
| 335 | struct net *net = dev_net(dst->dev); | ||
| 337 | 336 | ||
| 338 | if (hoplimit == 0) | 337 | if (hoplimit == 0) |
| 339 | hoplimit = sysctl_ip_default_ttl; | 338 | hoplimit = net->ipv4.sysctl_ip_default_ttl; |
| 340 | return hoplimit; | 339 | return hoplimit; |
| 341 | } | 340 | } |
| 342 | 341 | ||
diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h index 636a362a0e03..46e55f0202a6 100644 --- a/include/net/sch_generic.h +++ b/include/net/sch_generic.h | |||
| @@ -345,6 +345,12 @@ extern struct Qdisc_ops pfifo_fast_ops; | |||
| 345 | extern struct Qdisc_ops mq_qdisc_ops; | 345 | extern struct Qdisc_ops mq_qdisc_ops; |
| 346 | extern struct Qdisc_ops noqueue_qdisc_ops; | 346 | extern struct Qdisc_ops noqueue_qdisc_ops; |
| 347 | extern const struct Qdisc_ops *default_qdisc_ops; | 347 | extern const struct Qdisc_ops *default_qdisc_ops; |
| 348 | static inline const struct Qdisc_ops * | ||
| 349 | get_default_qdisc_ops(const struct net_device *dev, int ntx) | ||
| 350 | { | ||
| 351 | return ntx < dev->real_num_tx_queues ? | ||
| 352 | default_qdisc_ops : &pfifo_fast_ops; | ||
| 353 | } | ||
| 348 | 354 | ||
| 349 | struct Qdisc_class_common { | 355 | struct Qdisc_class_common { |
| 350 | u32 classid; | 356 | u32 classid; |
| @@ -396,7 +402,8 @@ struct Qdisc *dev_graft_qdisc(struct netdev_queue *dev_queue, | |||
| 396 | struct Qdisc *qdisc); | 402 | struct Qdisc *qdisc); |
| 397 | void qdisc_reset(struct Qdisc *qdisc); | 403 | void qdisc_reset(struct Qdisc *qdisc); |
| 398 | void qdisc_destroy(struct Qdisc *qdisc); | 404 | void qdisc_destroy(struct Qdisc *qdisc); |
| 399 | void qdisc_tree_decrease_qlen(struct Qdisc *qdisc, unsigned int n); | 405 | void qdisc_tree_reduce_backlog(struct Qdisc *qdisc, unsigned int n, |
| 406 | unsigned int len); | ||
| 400 | struct Qdisc *qdisc_alloc(struct netdev_queue *dev_queue, | 407 | struct Qdisc *qdisc_alloc(struct netdev_queue *dev_queue, |
| 401 | const struct Qdisc_ops *ops); | 408 | const struct Qdisc_ops *ops); |
| 402 | struct Qdisc *qdisc_create_dflt(struct netdev_queue *dev_queue, | 409 | struct Qdisc *qdisc_create_dflt(struct netdev_queue *dev_queue, |
| @@ -707,6 +714,23 @@ static inline void qdisc_reset_queue(struct Qdisc *sch) | |||
| 707 | sch->qstats.backlog = 0; | 714 | sch->qstats.backlog = 0; |
| 708 | } | 715 | } |
| 709 | 716 | ||
| 717 | static inline struct Qdisc *qdisc_replace(struct Qdisc *sch, struct Qdisc *new, | ||
| 718 | struct Qdisc **pold) | ||
| 719 | { | ||
| 720 | struct Qdisc *old; | ||
| 721 | |||
| 722 | sch_tree_lock(sch); | ||
| 723 | old = *pold; | ||
| 724 | *pold = new; | ||
| 725 | if (old != NULL) { | ||
| 726 | qdisc_tree_reduce_backlog(old, old->q.qlen, old->qstats.backlog); | ||
| 727 | qdisc_reset(old); | ||
| 728 | } | ||
| 729 | sch_tree_unlock(sch); | ||
| 730 | |||
| 731 | return old; | ||
| 732 | } | ||
| 733 | |||
| 710 | static inline unsigned int __qdisc_queue_drop(struct Qdisc *sch, | 734 | static inline unsigned int __qdisc_queue_drop(struct Qdisc *sch, |
| 711 | struct sk_buff_head *list) | 735 | struct sk_buff_head *list) |
| 712 | { | 736 | { |
diff --git a/include/net/sctp/sm.h b/include/net/sctp/sm.h index 487ef34bbd63..efc01743b9d6 100644 --- a/include/net/sctp/sm.h +++ b/include/net/sctp/sm.h | |||
| @@ -201,7 +201,7 @@ struct sctp_chunk *sctp_make_cwr(const struct sctp_association *, | |||
| 201 | struct sctp_chunk * sctp_make_datafrag_empty(struct sctp_association *, | 201 | struct sctp_chunk * sctp_make_datafrag_empty(struct sctp_association *, |
| 202 | const struct sctp_sndrcvinfo *sinfo, | 202 | const struct sctp_sndrcvinfo *sinfo, |
| 203 | int len, const __u8 flags, | 203 | int len, const __u8 flags, |
| 204 | __u16 ssn); | 204 | __u16 ssn, gfp_t gfp); |
| 205 | struct sctp_chunk *sctp_make_ecne(const struct sctp_association *, | 205 | struct sctp_chunk *sctp_make_ecne(const struct sctp_association *, |
| 206 | const __u32); | 206 | const __u32); |
| 207 | struct sctp_chunk *sctp_make_sack(const struct sctp_association *); | 207 | struct sctp_chunk *sctp_make_sack(const struct sctp_association *); |
diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h index 5a57409da37b..e2ac0620d4be 100644 --- a/include/net/sctp/structs.h +++ b/include/net/sctp/structs.h | |||
| @@ -535,7 +535,6 @@ struct sctp_datamsg { | |||
| 535 | struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *, | 535 | struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *, |
| 536 | struct sctp_sndrcvinfo *, | 536 | struct sctp_sndrcvinfo *, |
| 537 | struct iov_iter *); | 537 | struct iov_iter *); |
| 538 | void sctp_datamsg_free(struct sctp_datamsg *); | ||
| 539 | void sctp_datamsg_put(struct sctp_datamsg *); | 538 | void sctp_datamsg_put(struct sctp_datamsg *); |
| 540 | void sctp_chunk_fail(struct sctp_chunk *, int error); | 539 | void sctp_chunk_fail(struct sctp_chunk *, int error); |
| 541 | int sctp_chunk_abandoned(struct sctp_chunk *); | 540 | int sctp_chunk_abandoned(struct sctp_chunk *); |
| @@ -656,7 +655,7 @@ void sctp_chunk_free(struct sctp_chunk *); | |||
| 656 | void *sctp_addto_chunk(struct sctp_chunk *, int len, const void *data); | 655 | void *sctp_addto_chunk(struct sctp_chunk *, int len, const void *data); |
| 657 | struct sctp_chunk *sctp_chunkify(struct sk_buff *, | 656 | struct sctp_chunk *sctp_chunkify(struct sk_buff *, |
| 658 | const struct sctp_association *, | 657 | const struct sctp_association *, |
| 659 | struct sock *); | 658 | struct sock *, gfp_t gfp); |
| 660 | void sctp_init_addrs(struct sctp_chunk *, union sctp_addr *, | 659 | void sctp_init_addrs(struct sctp_chunk *, union sctp_addr *, |
| 661 | union sctp_addr *); | 660 | union sctp_addr *); |
| 662 | const union sctp_addr *sctp_source(const struct sctp_chunk *chunk); | 661 | const union sctp_addr *sctp_source(const struct sctp_chunk *chunk); |
| @@ -718,10 +717,10 @@ struct sctp_packet *sctp_packet_init(struct sctp_packet *, | |||
| 718 | __u16 sport, __u16 dport); | 717 | __u16 sport, __u16 dport); |
| 719 | struct sctp_packet *sctp_packet_config(struct sctp_packet *, __u32 vtag, int); | 718 | struct sctp_packet *sctp_packet_config(struct sctp_packet *, __u32 vtag, int); |
| 720 | sctp_xmit_t sctp_packet_transmit_chunk(struct sctp_packet *, | 719 | sctp_xmit_t sctp_packet_transmit_chunk(struct sctp_packet *, |
| 721 | struct sctp_chunk *, int); | 720 | struct sctp_chunk *, int, gfp_t); |
| 722 | sctp_xmit_t sctp_packet_append_chunk(struct sctp_packet *, | 721 | sctp_xmit_t sctp_packet_append_chunk(struct sctp_packet *, |
| 723 | struct sctp_chunk *); | 722 | struct sctp_chunk *); |
| 724 | int sctp_packet_transmit(struct sctp_packet *); | 723 | int sctp_packet_transmit(struct sctp_packet *, gfp_t); |
| 725 | void sctp_packet_free(struct sctp_packet *); | 724 | void sctp_packet_free(struct sctp_packet *); |
| 726 | 725 | ||
| 727 | static inline int sctp_packet_empty(struct sctp_packet *packet) | 726 | static inline int sctp_packet_empty(struct sctp_packet *packet) |
| @@ -1054,7 +1053,7 @@ struct sctp_outq { | |||
| 1054 | void sctp_outq_init(struct sctp_association *, struct sctp_outq *); | 1053 | void sctp_outq_init(struct sctp_association *, struct sctp_outq *); |
| 1055 | void sctp_outq_teardown(struct sctp_outq *); | 1054 | void sctp_outq_teardown(struct sctp_outq *); |
| 1056 | void sctp_outq_free(struct sctp_outq*); | 1055 | void sctp_outq_free(struct sctp_outq*); |
| 1057 | int sctp_outq_tail(struct sctp_outq *, struct sctp_chunk *chunk); | 1056 | int sctp_outq_tail(struct sctp_outq *, struct sctp_chunk *chunk, gfp_t); |
| 1058 | int sctp_outq_sack(struct sctp_outq *, struct sctp_chunk *); | 1057 | int sctp_outq_sack(struct sctp_outq *, struct sctp_chunk *); |
| 1059 | int sctp_outq_is_empty(const struct sctp_outq *); | 1058 | int sctp_outq_is_empty(const struct sctp_outq *); |
| 1060 | void sctp_outq_restart(struct sctp_outq *); | 1059 | void sctp_outq_restart(struct sctp_outq *); |
| @@ -1062,7 +1061,7 @@ void sctp_outq_restart(struct sctp_outq *); | |||
| 1062 | void sctp_retransmit(struct sctp_outq *, struct sctp_transport *, | 1061 | void sctp_retransmit(struct sctp_outq *, struct sctp_transport *, |
| 1063 | sctp_retransmit_reason_t); | 1062 | sctp_retransmit_reason_t); |
| 1064 | void sctp_retransmit_mark(struct sctp_outq *, struct sctp_transport *, __u8); | 1063 | void sctp_retransmit_mark(struct sctp_outq *, struct sctp_transport *, __u8); |
| 1065 | int sctp_outq_uncork(struct sctp_outq *); | 1064 | int sctp_outq_uncork(struct sctp_outq *, gfp_t gfp); |
| 1066 | /* Uncork and flush an outqueue. */ | 1065 | /* Uncork and flush an outqueue. */ |
| 1067 | static inline void sctp_outq_cork(struct sctp_outq *q) | 1066 | static inline void sctp_outq_cork(struct sctp_outq *q) |
| 1068 | { | 1067 | { |
diff --git a/include/net/sock.h b/include/net/sock.h index f5ea148853e2..255d3e03727b 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
| @@ -984,7 +984,7 @@ struct proto { | |||
| 984 | void (*release_cb)(struct sock *sk); | 984 | void (*release_cb)(struct sock *sk); |
| 985 | 985 | ||
| 986 | /* Keeping track of sk's, looking them up, and port selection methods. */ | 986 | /* Keeping track of sk's, looking them up, and port selection methods. */ |
| 987 | void (*hash)(struct sock *sk); | 987 | int (*hash)(struct sock *sk); |
| 988 | void (*unhash)(struct sock *sk); | 988 | void (*unhash)(struct sock *sk); |
| 989 | void (*rehash)(struct sock *sk); | 989 | void (*rehash)(struct sock *sk); |
| 990 | int (*get_port)(struct sock *sk, unsigned short snum); | 990 | int (*get_port)(struct sock *sk, unsigned short snum); |
| @@ -1194,10 +1194,10 @@ static inline void sock_prot_inuse_add(struct net *net, struct proto *prot, | |||
| 1194 | /* With per-bucket locks this operation is not-atomic, so that | 1194 | /* With per-bucket locks this operation is not-atomic, so that |
| 1195 | * this version is not worse. | 1195 | * this version is not worse. |
| 1196 | */ | 1196 | */ |
| 1197 | static inline void __sk_prot_rehash(struct sock *sk) | 1197 | static inline int __sk_prot_rehash(struct sock *sk) |
| 1198 | { | 1198 | { |
| 1199 | sk->sk_prot->unhash(sk); | 1199 | sk->sk_prot->unhash(sk); |
| 1200 | sk->sk_prot->hash(sk); | 1200 | return sk->sk_prot->hash(sk); |
| 1201 | } | 1201 | } |
| 1202 | 1202 | ||
| 1203 | void sk_prot_clear_portaddr_nulls(struct sock *sk, int size); | 1203 | void sk_prot_clear_portaddr_nulls(struct sock *sk, int size); |
diff --git a/include/net/tc_act/tc_gact.h b/include/net/tc_act/tc_gact.h index 592a6bc02b0b..93c520b83d10 100644 --- a/include/net/tc_act/tc_gact.h +++ b/include/net/tc_act/tc_gact.h | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | #define __NET_TC_GACT_H | 2 | #define __NET_TC_GACT_H |
| 3 | 3 | ||
| 4 | #include <net/act_api.h> | 4 | #include <net/act_api.h> |
| 5 | #include <linux/tc_act/tc_gact.h> | ||
| 5 | 6 | ||
| 6 | struct tcf_gact { | 7 | struct tcf_gact { |
| 7 | struct tcf_common common; | 8 | struct tcf_common common; |
| @@ -15,4 +16,19 @@ struct tcf_gact { | |||
| 15 | #define to_gact(a) \ | 16 | #define to_gact(a) \ |
| 16 | container_of(a->priv, struct tcf_gact, common) | 17 | container_of(a->priv, struct tcf_gact, common) |
| 17 | 18 | ||
| 19 | static inline bool is_tcf_gact_shot(const struct tc_action *a) | ||
| 20 | { | ||
| 21 | #ifdef CONFIG_NET_CLS_ACT | ||
| 22 | struct tcf_gact *gact; | ||
| 23 | |||
| 24 | if (a->ops && a->ops->type != TCA_ACT_GACT) | ||
| 25 | return false; | ||
| 26 | |||
| 27 | gact = a->priv; | ||
| 28 | if (gact->tcf_action == TC_ACT_SHOT) | ||
| 29 | return true; | ||
| 30 | |||
| 31 | #endif | ||
| 32 | return false; | ||
| 33 | } | ||
| 18 | #endif /* __NET_TC_GACT_H */ | 34 | #endif /* __NET_TC_GACT_H */ |
diff --git a/include/net/tc_act/tc_ife.h b/include/net/tc_act/tc_ife.h new file mode 100644 index 000000000000..dc9a09aefb33 --- /dev/null +++ b/include/net/tc_act/tc_ife.h | |||
| @@ -0,0 +1,61 @@ | |||
| 1 | #ifndef __NET_TC_IFE_H | ||
| 2 | #define __NET_TC_IFE_H | ||
| 3 | |||
| 4 | #include <net/act_api.h> | ||
| 5 | #include <linux/etherdevice.h> | ||
| 6 | #include <linux/rtnetlink.h> | ||
| 7 | #include <linux/module.h> | ||
| 8 | |||
| 9 | #define IFE_METAHDRLEN 2 | ||
| 10 | struct tcf_ife_info { | ||
| 11 | struct tcf_common common; | ||
| 12 | u8 eth_dst[ETH_ALEN]; | ||
| 13 | u8 eth_src[ETH_ALEN]; | ||
| 14 | u16 eth_type; | ||
| 15 | u16 flags; | ||
| 16 | /* list of metaids allowed */ | ||
| 17 | struct list_head metalist; | ||
| 18 | }; | ||
| 19 | #define to_ife(a) \ | ||
| 20 | container_of(a->priv, struct tcf_ife_info, common) | ||
| 21 | |||
| 22 | struct tcf_meta_info { | ||
| 23 | const struct tcf_meta_ops *ops; | ||
| 24 | void *metaval; | ||
| 25 | u16 metaid; | ||
| 26 | struct list_head metalist; | ||
| 27 | }; | ||
| 28 | |||
| 29 | struct tcf_meta_ops { | ||
| 30 | u16 metaid; /*Maintainer provided ID */ | ||
| 31 | u16 metatype; /*netlink attribute type (look at net/netlink.h) */ | ||
| 32 | const char *name; | ||
| 33 | const char *synopsis; | ||
| 34 | struct list_head list; | ||
| 35 | int (*check_presence)(struct sk_buff *, struct tcf_meta_info *); | ||
| 36 | int (*encode)(struct sk_buff *, void *, struct tcf_meta_info *); | ||
| 37 | int (*decode)(struct sk_buff *, void *, u16 len); | ||
| 38 | int (*get)(struct sk_buff *skb, struct tcf_meta_info *mi); | ||
| 39 | int (*alloc)(struct tcf_meta_info *, void *); | ||
| 40 | void (*release)(struct tcf_meta_info *); | ||
| 41 | int (*validate)(void *val, int len); | ||
| 42 | struct module *owner; | ||
| 43 | }; | ||
| 44 | |||
| 45 | #define MODULE_ALIAS_IFE_META(metan) MODULE_ALIAS("ifemeta" __stringify_1(metan)) | ||
| 46 | |||
| 47 | int ife_get_meta_u32(struct sk_buff *skb, struct tcf_meta_info *mi); | ||
| 48 | int ife_get_meta_u16(struct sk_buff *skb, struct tcf_meta_info *mi); | ||
| 49 | int ife_tlv_meta_encode(void *skbdata, u16 attrtype, u16 dlen, | ||
| 50 | const void *dval); | ||
| 51 | int ife_alloc_meta_u32(struct tcf_meta_info *mi, void *metaval); | ||
| 52 | int ife_alloc_meta_u16(struct tcf_meta_info *mi, void *metaval); | ||
| 53 | int ife_check_meta_u32(u32 metaval, struct tcf_meta_info *mi); | ||
| 54 | int ife_encode_meta_u32(u32 metaval, void *skbdata, struct tcf_meta_info *mi); | ||
| 55 | int ife_validate_meta_u32(void *val, int len); | ||
| 56 | int ife_validate_meta_u16(void *val, int len); | ||
| 57 | void ife_release_meta_gen(struct tcf_meta_info *mi); | ||
| 58 | int register_ife_op(struct tcf_meta_ops *mops); | ||
| 59 | int unregister_ife_op(struct tcf_meta_ops *mops); | ||
| 60 | |||
| 61 | #endif /* __NET_TC_IFE_H */ | ||
diff --git a/include/net/tc_act/tc_skbedit.h b/include/net/tc_act/tc_skbedit.h index 0df9a0db4a8e..b496d5ad7d42 100644 --- a/include/net/tc_act/tc_skbedit.h +++ b/include/net/tc_act/tc_skbedit.h | |||
| @@ -20,6 +20,7 @@ | |||
| 20 | #define __NET_TC_SKBEDIT_H | 20 | #define __NET_TC_SKBEDIT_H |
| 21 | 21 | ||
| 22 | #include <net/act_api.h> | 22 | #include <net/act_api.h> |
| 23 | #include <linux/tc_act/tc_skbedit.h> | ||
| 23 | 24 | ||
| 24 | struct tcf_skbedit { | 25 | struct tcf_skbedit { |
| 25 | struct tcf_common common; | 26 | struct tcf_common common; |
| @@ -32,4 +33,19 @@ struct tcf_skbedit { | |||
| 32 | #define to_skbedit(a) \ | 33 | #define to_skbedit(a) \ |
| 33 | container_of(a->priv, struct tcf_skbedit, common) | 34 | container_of(a->priv, struct tcf_skbedit, common) |
| 34 | 35 | ||
| 36 | /* Return true iff action is mark */ | ||
| 37 | static inline bool is_tcf_skbedit_mark(const struct tc_action *a) | ||
| 38 | { | ||
| 39 | #ifdef CONFIG_NET_CLS_ACT | ||
| 40 | if (a->ops && a->ops->type == TCA_ACT_SKBEDIT) | ||
| 41 | return to_skbedit(a)->flags == SKBEDIT_F_MARK; | ||
| 42 | #endif | ||
| 43 | return false; | ||
| 44 | } | ||
| 45 | |||
| 46 | static inline u32 tcf_skbedit_mark(const struct tc_action *a) | ||
| 47 | { | ||
| 48 | return to_skbedit(a)->mark; | ||
| 49 | } | ||
| 50 | |||
| 35 | #endif /* __NET_TC_SKBEDIT_H */ | 51 | #endif /* __NET_TC_SKBEDIT_H */ |
diff --git a/include/net/tcp.h b/include/net/tcp.h index b04bc989ad6c..b91370f61be6 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h | |||
| @@ -238,13 +238,6 @@ extern struct inet_timewait_death_row tcp_death_row; | |||
| 238 | extern int sysctl_tcp_timestamps; | 238 | extern int sysctl_tcp_timestamps; |
| 239 | extern int sysctl_tcp_window_scaling; | 239 | extern int sysctl_tcp_window_scaling; |
| 240 | extern int sysctl_tcp_sack; | 240 | extern int sysctl_tcp_sack; |
| 241 | extern int sysctl_tcp_fin_timeout; | ||
| 242 | extern int sysctl_tcp_syn_retries; | ||
| 243 | extern int sysctl_tcp_synack_retries; | ||
| 244 | extern int sysctl_tcp_retries1; | ||
| 245 | extern int sysctl_tcp_retries2; | ||
| 246 | extern int sysctl_tcp_orphan_retries; | ||
| 247 | extern int sysctl_tcp_syncookies; | ||
| 248 | extern int sysctl_tcp_fastopen; | 241 | extern int sysctl_tcp_fastopen; |
| 249 | extern int sysctl_tcp_retrans_collapse; | 242 | extern int sysctl_tcp_retrans_collapse; |
| 250 | extern int sysctl_tcp_stdurg; | 243 | extern int sysctl_tcp_stdurg; |
| @@ -273,7 +266,6 @@ extern int sysctl_tcp_thin_dupack; | |||
| 273 | extern int sysctl_tcp_early_retrans; | 266 | extern int sysctl_tcp_early_retrans; |
| 274 | extern int sysctl_tcp_limit_output_bytes; | 267 | extern int sysctl_tcp_limit_output_bytes; |
| 275 | extern int sysctl_tcp_challenge_ack_limit; | 268 | extern int sysctl_tcp_challenge_ack_limit; |
| 276 | extern unsigned int sysctl_tcp_notsent_lowat; | ||
| 277 | extern int sysctl_tcp_min_tso_segs; | 269 | extern int sysctl_tcp_min_tso_segs; |
| 278 | extern int sysctl_tcp_min_rtt_wlen; | 270 | extern int sysctl_tcp_min_rtt_wlen; |
| 279 | extern int sysctl_tcp_autocorking; | 271 | extern int sysctl_tcp_autocorking; |
| @@ -567,6 +559,7 @@ void tcp_rearm_rto(struct sock *sk); | |||
| 567 | void tcp_synack_rtt_meas(struct sock *sk, struct request_sock *req); | 559 | void tcp_synack_rtt_meas(struct sock *sk, struct request_sock *req); |
| 568 | void tcp_reset(struct sock *sk); | 560 | void tcp_reset(struct sock *sk); |
| 569 | void tcp_skb_mark_lost_uncond_verify(struct tcp_sock *tp, struct sk_buff *skb); | 561 | void tcp_skb_mark_lost_uncond_verify(struct tcp_sock *tp, struct sk_buff *skb); |
| 562 | void tcp_fin(struct sock *sk); | ||
| 570 | 563 | ||
| 571 | /* tcp_timer.c */ | 564 | /* tcp_timer.c */ |
| 572 | void tcp_init_xmit_timers(struct sock *); | 565 | void tcp_init_xmit_timers(struct sock *); |
| @@ -962,9 +955,11 @@ static inline void tcp_enable_fack(struct tcp_sock *tp) | |||
| 962 | */ | 955 | */ |
| 963 | static inline void tcp_enable_early_retrans(struct tcp_sock *tp) | 956 | static inline void tcp_enable_early_retrans(struct tcp_sock *tp) |
| 964 | { | 957 | { |
| 958 | struct net *net = sock_net((struct sock *)tp); | ||
| 959 | |||
| 965 | tp->do_early_retrans = sysctl_tcp_early_retrans && | 960 | tp->do_early_retrans = sysctl_tcp_early_retrans && |
| 966 | sysctl_tcp_early_retrans < 4 && !sysctl_tcp_thin_dupack && | 961 | sysctl_tcp_early_retrans < 4 && !sysctl_tcp_thin_dupack && |
| 967 | sysctl_tcp_reordering == 3; | 962 | net->ipv4.sysctl_tcp_reordering == 3; |
| 968 | } | 963 | } |
| 969 | 964 | ||
| 970 | static inline void tcp_disable_early_retrans(struct tcp_sock *tp) | 965 | static inline void tcp_disable_early_retrans(struct tcp_sock *tp) |
| @@ -1251,7 +1246,7 @@ static inline u32 keepalive_time_elapsed(const struct tcp_sock *tp) | |||
| 1251 | 1246 | ||
| 1252 | static inline int tcp_fin_time(const struct sock *sk) | 1247 | static inline int tcp_fin_time(const struct sock *sk) |
| 1253 | { | 1248 | { |
| 1254 | int fin_timeout = tcp_sk(sk)->linger2 ? : sysctl_tcp_fin_timeout; | 1249 | int fin_timeout = tcp_sk(sk)->linger2 ? : sock_net(sk)->ipv4.sysctl_tcp_fin_timeout; |
| 1255 | const int rto = inet_csk(sk)->icsk_rto; | 1250 | const int rto = inet_csk(sk)->icsk_rto; |
| 1256 | 1251 | ||
| 1257 | if (fin_timeout < (rto << 2) - (rto >> 1)) | 1252 | if (fin_timeout < (rto << 2) - (rto >> 1)) |
| @@ -1433,6 +1428,7 @@ void tcp_free_fastopen_req(struct tcp_sock *tp); | |||
| 1433 | 1428 | ||
| 1434 | extern struct tcp_fastopen_context __rcu *tcp_fastopen_ctx; | 1429 | extern struct tcp_fastopen_context __rcu *tcp_fastopen_ctx; |
| 1435 | int tcp_fastopen_reset_cipher(void *key, unsigned int len); | 1430 | int tcp_fastopen_reset_cipher(void *key, unsigned int len); |
| 1431 | void tcp_fastopen_add_skb(struct sock *sk, struct sk_buff *skb); | ||
| 1436 | struct sock *tcp_try_fastopen(struct sock *sk, struct sk_buff *skb, | 1432 | struct sock *tcp_try_fastopen(struct sock *sk, struct sk_buff *skb, |
| 1437 | struct request_sock *req, | 1433 | struct request_sock *req, |
| 1438 | struct tcp_fastopen_cookie *foc, | 1434 | struct tcp_fastopen_cookie *foc, |
| @@ -1681,7 +1677,8 @@ void __tcp_v4_send_check(struct sk_buff *skb, __be32 saddr, __be32 daddr); | |||
| 1681 | 1677 | ||
| 1682 | static inline u32 tcp_notsent_lowat(const struct tcp_sock *tp) | 1678 | static inline u32 tcp_notsent_lowat(const struct tcp_sock *tp) |
| 1683 | { | 1679 | { |
| 1684 | return tp->notsent_lowat ?: sysctl_tcp_notsent_lowat; | 1680 | struct net *net = sock_net((struct sock *)tp); |
| 1681 | return tp->notsent_lowat ?: net->ipv4.sysctl_tcp_notsent_lowat; | ||
| 1685 | } | 1682 | } |
| 1686 | 1683 | ||
| 1687 | static inline bool tcp_stream_memory_free(const struct sock *sk) | 1684 | static inline bool tcp_stream_memory_free(const struct sock *sk) |
| @@ -1815,4 +1812,38 @@ static inline void skb_set_tcp_pure_ack(struct sk_buff *skb) | |||
| 1815 | skb->truesize = 2; | 1812 | skb->truesize = 2; |
| 1816 | } | 1813 | } |
| 1817 | 1814 | ||
| 1815 | static inline int tcp_inq(struct sock *sk) | ||
| 1816 | { | ||
| 1817 | struct tcp_sock *tp = tcp_sk(sk); | ||
| 1818 | int answ; | ||
| 1819 | |||
| 1820 | if ((1 << sk->sk_state) & (TCPF_SYN_SENT | TCPF_SYN_RECV)) { | ||
| 1821 | answ = 0; | ||
| 1822 | } else if (sock_flag(sk, SOCK_URGINLINE) || | ||
| 1823 | !tp->urg_data || | ||
| 1824 | before(tp->urg_seq, tp->copied_seq) || | ||
| 1825 | !before(tp->urg_seq, tp->rcv_nxt)) { | ||
| 1826 | |||
| 1827 | answ = tp->rcv_nxt - tp->copied_seq; | ||
| 1828 | |||
| 1829 | /* Subtract 1, if FIN was received */ | ||
| 1830 | if (answ && sock_flag(sk, SOCK_DONE)) | ||
| 1831 | answ--; | ||
| 1832 | } else { | ||
| 1833 | answ = tp->urg_seq - tp->copied_seq; | ||
| 1834 | } | ||
| 1835 | |||
| 1836 | return answ; | ||
| 1837 | } | ||
| 1838 | |||
| 1839 | static inline void tcp_segs_in(struct tcp_sock *tp, const struct sk_buff *skb) | ||
| 1840 | { | ||
| 1841 | u16 segs_in; | ||
| 1842 | |||
| 1843 | segs_in = max_t(u16, 1, skb_shinfo(skb)->gso_segs); | ||
| 1844 | tp->segs_in += segs_in; | ||
| 1845 | if (skb->len > tcp_hdrlen(skb)) | ||
| 1846 | tp->data_segs_in += segs_in; | ||
| 1847 | } | ||
| 1848 | |||
| 1818 | #endif /* _TCP_H */ | 1849 | #endif /* _TCP_H */ |
diff --git a/include/net/udp.h b/include/net/udp.h index 2842541e28e7..92927f729ac8 100644 --- a/include/net/udp.h +++ b/include/net/udp.h | |||
| @@ -177,9 +177,10 @@ static inline struct udphdr *udp_gro_udphdr(struct sk_buff *skb) | |||
| 177 | } | 177 | } |
| 178 | 178 | ||
| 179 | /* hash routines shared between UDPv4/6 and UDP-Litev4/6 */ | 179 | /* hash routines shared between UDPv4/6 and UDP-Litev4/6 */ |
| 180 | static inline void udp_lib_hash(struct sock *sk) | 180 | static inline int udp_lib_hash(struct sock *sk) |
| 181 | { | 181 | { |
| 182 | BUG(); | 182 | BUG(); |
| 183 | return 0; | ||
| 183 | } | 184 | } |
| 184 | 185 | ||
| 185 | void udp_lib_unhash(struct sock *sk); | 186 | void udp_lib_unhash(struct sock *sk); |
diff --git a/include/net/udp_tunnel.h b/include/net/udp_tunnel.h index cca2ad3082c3..b83114077cee 100644 --- a/include/net/udp_tunnel.h +++ b/include/net/udp_tunnel.h | |||
| @@ -88,8 +88,8 @@ int udp_tunnel6_xmit_skb(struct dst_entry *dst, struct sock *sk, | |||
| 88 | struct sk_buff *skb, | 88 | struct sk_buff *skb, |
| 89 | struct net_device *dev, struct in6_addr *saddr, | 89 | struct net_device *dev, struct in6_addr *saddr, |
| 90 | struct in6_addr *daddr, | 90 | struct in6_addr *daddr, |
| 91 | __u8 prio, __u8 ttl, __be16 src_port, | 91 | __u8 prio, __u8 ttl, __be32 label, |
| 92 | __be16 dst_port, bool nocheck); | 92 | __be16 src_port, __be16 dst_port, bool nocheck); |
| 93 | #endif | 93 | #endif |
| 94 | 94 | ||
| 95 | void udp_tunnel_sock_release(struct socket *sock); | 95 | void udp_tunnel_sock_release(struct socket *sock); |
| @@ -103,7 +103,7 @@ static inline struct sk_buff *udp_tunnel_handle_offloads(struct sk_buff *skb, | |||
| 103 | { | 103 | { |
| 104 | int type = udp_csum ? SKB_GSO_UDP_TUNNEL_CSUM : SKB_GSO_UDP_TUNNEL; | 104 | int type = udp_csum ? SKB_GSO_UDP_TUNNEL_CSUM : SKB_GSO_UDP_TUNNEL; |
| 105 | 105 | ||
| 106 | return iptunnel_handle_offloads(skb, udp_csum, type); | 106 | return iptunnel_handle_offloads(skb, type); |
| 107 | } | 107 | } |
| 108 | 108 | ||
| 109 | static inline void udp_tunnel_gro_complete(struct sk_buff *skb, int nhoff) | 109 | static inline void udp_tunnel_gro_complete(struct sk_buff *skb, int nhoff) |
diff --git a/include/net/vxlan.h b/include/net/vxlan.h index 0fb86442544b..a763c96ecde4 100644 --- a/include/net/vxlan.h +++ b/include/net/vxlan.h | |||
| @@ -9,17 +9,71 @@ | |||
| 9 | #include <linux/udp.h> | 9 | #include <linux/udp.h> |
| 10 | #include <net/dst_metadata.h> | 10 | #include <net/dst_metadata.h> |
| 11 | 11 | ||
| 12 | /* VXLAN protocol (RFC 7348) header: | ||
| 13 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
| 14 | * |R|R|R|R|I|R|R|R| Reserved | | ||
| 15 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
| 16 | * | VXLAN Network Identifier (VNI) | Reserved | | ||
| 17 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
| 18 | * | ||
| 19 | * I = VXLAN Network Identifier (VNI) present. | ||
| 20 | */ | ||
| 21 | struct vxlanhdr { | ||
| 22 | __be32 vx_flags; | ||
| 23 | __be32 vx_vni; | ||
| 24 | }; | ||
| 25 | |||
| 26 | /* VXLAN header flags. */ | ||
| 27 | #define VXLAN_HF_VNI cpu_to_be32(BIT(27)) | ||
| 28 | |||
| 29 | #define VXLAN_N_VID (1u << 24) | ||
| 30 | #define VXLAN_VID_MASK (VXLAN_N_VID - 1) | ||
| 31 | #define VXLAN_VNI_MASK cpu_to_be32(VXLAN_VID_MASK << 8) | ||
| 32 | #define VXLAN_HLEN (sizeof(struct udphdr) + sizeof(struct vxlanhdr)) | ||
| 33 | |||
| 12 | #define VNI_HASH_BITS 10 | 34 | #define VNI_HASH_BITS 10 |
| 13 | #define VNI_HASH_SIZE (1<<VNI_HASH_BITS) | 35 | #define VNI_HASH_SIZE (1<<VNI_HASH_BITS) |
| 36 | #define FDB_HASH_BITS 8 | ||
| 37 | #define FDB_HASH_SIZE (1<<FDB_HASH_BITS) | ||
| 38 | |||
| 39 | /* Remote checksum offload for VXLAN (VXLAN_F_REMCSUM_[RT]X): | ||
| 40 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
| 41 | * |R|R|R|R|I|R|R|R|R|R|C| Reserved | | ||
| 42 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
| 43 | * | VXLAN Network Identifier (VNI) |O| Csum start | | ||
| 44 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
| 45 | * | ||
| 46 | * C = Remote checksum offload bit. When set indicates that the | ||
| 47 | * remote checksum offload data is present. | ||
| 48 | * | ||
| 49 | * O = Offset bit. Indicates the checksum offset relative to | ||
| 50 | * checksum start. | ||
| 51 | * | ||
| 52 | * Csum start = Checksum start divided by two. | ||
| 53 | * | ||
| 54 | * http://tools.ietf.org/html/draft-herbert-vxlan-rco | ||
| 55 | */ | ||
| 56 | |||
| 57 | /* VXLAN-RCO header flags. */ | ||
| 58 | #define VXLAN_HF_RCO cpu_to_be32(BIT(21)) | ||
| 59 | |||
| 60 | /* Remote checksum offload header option */ | ||
| 61 | #define VXLAN_RCO_MASK cpu_to_be32(0x7f) /* Last byte of vni field */ | ||
| 62 | #define VXLAN_RCO_UDP cpu_to_be32(0x80) /* Indicate UDP RCO (TCP when not set *) */ | ||
| 63 | #define VXLAN_RCO_SHIFT 1 /* Left shift of start */ | ||
| 64 | #define VXLAN_RCO_SHIFT_MASK ((1 << VXLAN_RCO_SHIFT) - 1) | ||
| 65 | #define VXLAN_MAX_REMCSUM_START (0x7f << VXLAN_RCO_SHIFT) | ||
| 14 | 66 | ||
| 15 | /* | 67 | /* |
| 16 | * VXLAN Group Based Policy Extension: | 68 | * VXLAN Group Based Policy Extension (VXLAN_F_GBP): |
| 17 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 69 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| 18 | * |1|-|-|-|1|-|-|-|R|D|R|R|A|R|R|R| Group Policy ID | | 70 | * |G|R|R|R|I|R|R|R|R|D|R|R|A|R|R|R| Group Policy ID | |
| 19 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 71 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| 20 | * | VXLAN Network Identifier (VNI) | Reserved | | 72 | * | VXLAN Network Identifier (VNI) | Reserved | |
| 21 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 73 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| 22 | * | 74 | * |
| 75 | * G = Group Policy ID present. | ||
| 76 | * | ||
| 23 | * D = Don't Learn bit. When set, this bit indicates that the egress | 77 | * D = Don't Learn bit. When set, this bit indicates that the egress |
| 24 | * VTEP MUST NOT learn the source address of the encapsulated frame. | 78 | * VTEP MUST NOT learn the source address of the encapsulated frame. |
| 25 | * | 79 | * |
| @@ -27,18 +81,18 @@ | |||
| 27 | * this packet. Policies MUST NOT be applied by devices when the | 81 | * this packet. Policies MUST NOT be applied by devices when the |
| 28 | * A bit is set. | 82 | * A bit is set. |
| 29 | * | 83 | * |
| 30 | * [0] https://tools.ietf.org/html/draft-smith-vxlan-group-policy | 84 | * https://tools.ietf.org/html/draft-smith-vxlan-group-policy |
| 31 | */ | 85 | */ |
| 32 | struct vxlanhdr_gbp { | 86 | struct vxlanhdr_gbp { |
| 33 | __u8 vx_flags; | 87 | u8 vx_flags; |
| 34 | #ifdef __LITTLE_ENDIAN_BITFIELD | 88 | #ifdef __LITTLE_ENDIAN_BITFIELD |
| 35 | __u8 reserved_flags1:3, | 89 | u8 reserved_flags1:3, |
| 36 | policy_applied:1, | 90 | policy_applied:1, |
| 37 | reserved_flags2:2, | 91 | reserved_flags2:2, |
| 38 | dont_learn:1, | 92 | dont_learn:1, |
| 39 | reserved_flags3:1; | 93 | reserved_flags3:1; |
| 40 | #elif defined(__BIG_ENDIAN_BITFIELD) | 94 | #elif defined(__BIG_ENDIAN_BITFIELD) |
| 41 | __u8 reserved_flags1:1, | 95 | u8 reserved_flags1:1, |
| 42 | dont_learn:1, | 96 | dont_learn:1, |
| 43 | reserved_flags2:2, | 97 | reserved_flags2:2, |
| 44 | policy_applied:1, | 98 | policy_applied:1, |
| @@ -50,7 +104,10 @@ struct vxlanhdr_gbp { | |||
| 50 | __be32 vx_vni; | 104 | __be32 vx_vni; |
| 51 | }; | 105 | }; |
| 52 | 106 | ||
| 53 | #define VXLAN_GBP_USED_BITS (VXLAN_HF_GBP | 0xFFFFFF) | 107 | /* VXLAN-GBP header flags. */ |
| 108 | #define VXLAN_HF_GBP cpu_to_be32(BIT(31)) | ||
| 109 | |||
| 110 | #define VXLAN_GBP_USED_BITS (VXLAN_HF_GBP | cpu_to_be32(0xFFFFFF)) | ||
| 54 | 111 | ||
| 55 | /* skb->mark mapping | 112 | /* skb->mark mapping |
| 56 | * | 113 | * |
| @@ -62,44 +119,6 @@ struct vxlanhdr_gbp { | |||
| 62 | #define VXLAN_GBP_POLICY_APPLIED (BIT(3) << 16) | 119 | #define VXLAN_GBP_POLICY_APPLIED (BIT(3) << 16) |
| 63 | #define VXLAN_GBP_ID_MASK (0xFFFF) | 120 | #define VXLAN_GBP_ID_MASK (0xFFFF) |
| 64 | 121 | ||
| 65 | /* VXLAN protocol header: | ||
| 66 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
| 67 | * |G|R|R|R|I|R|R|C| Reserved | | ||
| 68 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
| 69 | * | VXLAN Network Identifier (VNI) | Reserved | | ||
| 70 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
| 71 | * | ||
| 72 | * G = 1 Group Policy (VXLAN-GBP) | ||
| 73 | * I = 1 VXLAN Network Identifier (VNI) present | ||
| 74 | * C = 1 Remote checksum offload (RCO) | ||
| 75 | */ | ||
| 76 | struct vxlanhdr { | ||
| 77 | __be32 vx_flags; | ||
| 78 | __be32 vx_vni; | ||
| 79 | }; | ||
| 80 | |||
| 81 | /* VXLAN header flags. */ | ||
| 82 | #define VXLAN_HF_RCO BIT(21) | ||
| 83 | #define VXLAN_HF_VNI BIT(27) | ||
| 84 | #define VXLAN_HF_GBP BIT(31) | ||
| 85 | |||
| 86 | /* Remote checksum offload header option */ | ||
| 87 | #define VXLAN_RCO_MASK 0x7f /* Last byte of vni field */ | ||
| 88 | #define VXLAN_RCO_UDP 0x80 /* Indicate UDP RCO (TCP when not set *) */ | ||
| 89 | #define VXLAN_RCO_SHIFT 1 /* Left shift of start */ | ||
| 90 | #define VXLAN_RCO_SHIFT_MASK ((1 << VXLAN_RCO_SHIFT) - 1) | ||
| 91 | #define VXLAN_MAX_REMCSUM_START (VXLAN_RCO_MASK << VXLAN_RCO_SHIFT) | ||
| 92 | |||
| 93 | #define VXLAN_N_VID (1u << 24) | ||
| 94 | #define VXLAN_VID_MASK (VXLAN_N_VID - 1) | ||
| 95 | #define VXLAN_VNI_MASK (VXLAN_VID_MASK << 8) | ||
| 96 | #define VXLAN_HLEN (sizeof(struct udphdr) + sizeof(struct vxlanhdr)) | ||
| 97 | |||
| 98 | #define VNI_HASH_BITS 10 | ||
| 99 | #define VNI_HASH_SIZE (1<<VNI_HASH_BITS) | ||
| 100 | #define FDB_HASH_BITS 8 | ||
| 101 | #define FDB_HASH_SIZE (1<<FDB_HASH_BITS) | ||
| 102 | |||
| 103 | struct vxlan_metadata { | 122 | struct vxlan_metadata { |
| 104 | u32 gbp; | 123 | u32 gbp; |
| 105 | }; | 124 | }; |
| @@ -125,23 +144,25 @@ union vxlan_addr { | |||
| 125 | struct vxlan_rdst { | 144 | struct vxlan_rdst { |
| 126 | union vxlan_addr remote_ip; | 145 | union vxlan_addr remote_ip; |
| 127 | __be16 remote_port; | 146 | __be16 remote_port; |
| 128 | u32 remote_vni; | 147 | __be32 remote_vni; |
| 129 | u32 remote_ifindex; | 148 | u32 remote_ifindex; |
| 130 | struct list_head list; | 149 | struct list_head list; |
| 131 | struct rcu_head rcu; | 150 | struct rcu_head rcu; |
| 151 | struct dst_cache dst_cache; | ||
| 132 | }; | 152 | }; |
| 133 | 153 | ||
| 134 | struct vxlan_config { | 154 | struct vxlan_config { |
| 135 | union vxlan_addr remote_ip; | 155 | union vxlan_addr remote_ip; |
| 136 | union vxlan_addr saddr; | 156 | union vxlan_addr saddr; |
| 137 | u32 vni; | 157 | __be32 vni; |
| 138 | int remote_ifindex; | 158 | int remote_ifindex; |
| 139 | int mtu; | 159 | int mtu; |
| 140 | __be16 dst_port; | 160 | __be16 dst_port; |
| 141 | __u16 port_min; | 161 | u16 port_min; |
| 142 | __u16 port_max; | 162 | u16 port_max; |
| 143 | __u8 tos; | 163 | u8 tos; |
| 144 | __u8 ttl; | 164 | u8 ttl; |
| 165 | __be32 label; | ||
| 145 | u32 flags; | 166 | u32 flags; |
| 146 | unsigned long age_interval; | 167 | unsigned long age_interval; |
| 147 | unsigned int addrmax; | 168 | unsigned int addrmax; |
| @@ -177,7 +198,7 @@ struct vxlan_dev { | |||
| 177 | #define VXLAN_F_L2MISS 0x08 | 198 | #define VXLAN_F_L2MISS 0x08 |
| 178 | #define VXLAN_F_L3MISS 0x10 | 199 | #define VXLAN_F_L3MISS 0x10 |
| 179 | #define VXLAN_F_IPV6 0x20 | 200 | #define VXLAN_F_IPV6 0x20 |
| 180 | #define VXLAN_F_UDP_CSUM 0x40 | 201 | #define VXLAN_F_UDP_ZERO_CSUM_TX 0x40 |
| 181 | #define VXLAN_F_UDP_ZERO_CSUM6_TX 0x80 | 202 | #define VXLAN_F_UDP_ZERO_CSUM6_TX 0x80 |
| 182 | #define VXLAN_F_UDP_ZERO_CSUM6_RX 0x100 | 203 | #define VXLAN_F_UDP_ZERO_CSUM6_RX 0x100 |
| 183 | #define VXLAN_F_REMCSUM_TX 0x200 | 204 | #define VXLAN_F_REMCSUM_TX 0x200 |
| @@ -242,6 +263,68 @@ static inline netdev_features_t vxlan_features_check(struct sk_buff *skb, | |||
| 242 | /* IPv6 header + UDP + VXLAN + Ethernet header */ | 263 | /* IPv6 header + UDP + VXLAN + Ethernet header */ |
| 243 | #define VXLAN6_HEADROOM (40 + 8 + 8 + 14) | 264 | #define VXLAN6_HEADROOM (40 + 8 + 8 + 14) |
| 244 | 265 | ||
| 266 | static inline struct vxlanhdr *vxlan_hdr(struct sk_buff *skb) | ||
| 267 | { | ||
| 268 | return (struct vxlanhdr *)(udp_hdr(skb) + 1); | ||
| 269 | } | ||
| 270 | |||
| 271 | static inline __be32 vxlan_vni(__be32 vni_field) | ||
| 272 | { | ||
| 273 | #if defined(__BIG_ENDIAN) | ||
| 274 | return vni_field >> 8; | ||
| 275 | #else | ||
| 276 | return (vni_field & VXLAN_VNI_MASK) << 8; | ||
| 277 | #endif | ||
| 278 | } | ||
| 279 | |||
| 280 | static inline __be32 vxlan_vni_field(__be32 vni) | ||
| 281 | { | ||
| 282 | #if defined(__BIG_ENDIAN) | ||
| 283 | return vni << 8; | ||
| 284 | #else | ||
| 285 | return vni >> 8; | ||
| 286 | #endif | ||
| 287 | } | ||
| 288 | |||
| 289 | static inline __be32 vxlan_tun_id_to_vni(__be64 tun_id) | ||
| 290 | { | ||
| 291 | #if defined(__BIG_ENDIAN) | ||
| 292 | return tun_id; | ||
| 293 | #else | ||
| 294 | return tun_id >> 32; | ||
| 295 | #endif | ||
| 296 | } | ||
| 297 | |||
| 298 | static inline __be64 vxlan_vni_to_tun_id(__be32 vni) | ||
| 299 | { | ||
| 300 | #if defined(__BIG_ENDIAN) | ||
| 301 | return (__be64)vni; | ||
| 302 | #else | ||
| 303 | return (__be64)vni << 32; | ||
| 304 | #endif | ||
| 305 | } | ||
| 306 | |||
| 307 | static inline size_t vxlan_rco_start(__be32 vni_field) | ||
| 308 | { | ||
| 309 | return be32_to_cpu(vni_field & VXLAN_RCO_MASK) << VXLAN_RCO_SHIFT; | ||
| 310 | } | ||
| 311 | |||
| 312 | static inline size_t vxlan_rco_offset(__be32 vni_field) | ||
| 313 | { | ||
| 314 | return (vni_field & VXLAN_RCO_UDP) ? | ||
| 315 | offsetof(struct udphdr, check) : | ||
| 316 | offsetof(struct tcphdr, check); | ||
| 317 | } | ||
| 318 | |||
| 319 | static inline __be32 vxlan_compute_rco(unsigned int start, unsigned int offset) | ||
| 320 | { | ||
| 321 | __be32 vni_field = cpu_to_be32(start >> VXLAN_RCO_SHIFT); | ||
| 322 | |||
| 323 | if (offset == offsetof(struct udphdr, check)) | ||
| 324 | vni_field |= VXLAN_RCO_UDP; | ||
| 325 | return vni_field; | ||
| 326 | } | ||
| 327 | |||
| 245 | #if IS_ENABLED(CONFIG_VXLAN) | 328 | #if IS_ENABLED(CONFIG_VXLAN) |
| 246 | void vxlan_get_rx_port(struct net_device *netdev); | 329 | void vxlan_get_rx_port(struct net_device *netdev); |
| 247 | #else | 330 | #else |
diff --git a/include/rdma/ib_addr.h b/include/rdma/ib_addr.h index c34c9002460c..931a47ba4571 100644 --- a/include/rdma/ib_addr.h +++ b/include/rdma/ib_addr.h | |||
| @@ -262,24 +262,22 @@ static inline enum ib_mtu iboe_get_mtu(int mtu) | |||
| 262 | 262 | ||
| 263 | static inline int iboe_get_rate(struct net_device *dev) | 263 | static inline int iboe_get_rate(struct net_device *dev) |
| 264 | { | 264 | { |
| 265 | struct ethtool_cmd cmd; | 265 | struct ethtool_link_ksettings cmd; |
| 266 | u32 speed; | ||
| 267 | int err; | 266 | int err; |
| 268 | 267 | ||
| 269 | rtnl_lock(); | 268 | rtnl_lock(); |
| 270 | err = __ethtool_get_settings(dev, &cmd); | 269 | err = __ethtool_get_link_ksettings(dev, &cmd); |
| 271 | rtnl_unlock(); | 270 | rtnl_unlock(); |
| 272 | if (err) | 271 | if (err) |
| 273 | return IB_RATE_PORT_CURRENT; | 272 | return IB_RATE_PORT_CURRENT; |
| 274 | 273 | ||
| 275 | speed = ethtool_cmd_speed(&cmd); | 274 | if (cmd.base.speed >= 40000) |
| 276 | if (speed >= 40000) | ||
| 277 | return IB_RATE_40_GBPS; | 275 | return IB_RATE_40_GBPS; |
| 278 | else if (speed >= 30000) | 276 | else if (cmd.base.speed >= 30000) |
| 279 | return IB_RATE_30_GBPS; | 277 | return IB_RATE_30_GBPS; |
| 280 | else if (speed >= 20000) | 278 | else if (cmd.base.speed >= 20000) |
| 281 | return IB_RATE_20_GBPS; | 279 | return IB_RATE_20_GBPS; |
| 282 | else if (speed >= 10000) | 280 | else if (cmd.base.speed >= 10000) |
| 283 | return IB_RATE_10_GBPS; | 281 | return IB_RATE_10_GBPS; |
| 284 | else | 282 | else |
| 285 | return IB_RATE_PORT_CURRENT; | 283 | return IB_RATE_PORT_CURRENT; |
diff --git a/include/rxrpc/packet.h b/include/rxrpc/packet.h index 4dce116bfd80..9ebab3a8cf0a 100644 --- a/include/rxrpc/packet.h +++ b/include/rxrpc/packet.h | |||
| @@ -22,7 +22,7 @@ typedef __be32 rxrpc_serial_net_t; /* on-the-wire Rx message serial number */ | |||
| 22 | * on-the-wire Rx packet header | 22 | * on-the-wire Rx packet header |
| 23 | * - all multibyte fields should be in network byte order | 23 | * - all multibyte fields should be in network byte order |
| 24 | */ | 24 | */ |
| 25 | struct rxrpc_header { | 25 | struct rxrpc_wire_header { |
| 26 | __be32 epoch; /* client boot timestamp */ | 26 | __be32 epoch; /* client boot timestamp */ |
| 27 | 27 | ||
| 28 | __be32 cid; /* connection and channel ID */ | 28 | __be32 cid; /* connection and channel ID */ |
| @@ -68,10 +68,19 @@ struct rxrpc_header { | |||
| 68 | 68 | ||
| 69 | } __packed; | 69 | } __packed; |
| 70 | 70 | ||
| 71 | #define __rxrpc_header_off(X) offsetof(struct rxrpc_header,X) | ||
| 72 | |||
| 73 | extern const char *rxrpc_pkts[]; | 71 | extern const char *rxrpc_pkts[]; |
| 74 | 72 | ||
| 73 | #define RXRPC_SUPPORTED_PACKET_TYPES ( \ | ||
| 74 | (1 << RXRPC_PACKET_TYPE_DATA) | \ | ||
| 75 | (1 << RXRPC_PACKET_TYPE_ACK) | \ | ||
| 76 | (1 << RXRPC_PACKET_TYPE_BUSY) | \ | ||
| 77 | (1 << RXRPC_PACKET_TYPE_ABORT) | \ | ||
| 78 | (1 << RXRPC_PACKET_TYPE_ACKALL) | \ | ||
| 79 | (1 << RXRPC_PACKET_TYPE_CHALLENGE) | \ | ||
| 80 | (1 << RXRPC_PACKET_TYPE_RESPONSE) | \ | ||
| 81 | /*(1 << RXRPC_PACKET_TYPE_DEBUG) | */ \ | ||
| 82 | (1 << RXRPC_PACKET_TYPE_VERSION)) | ||
| 83 | |||
| 75 | /*****************************************************************************/ | 84 | /*****************************************************************************/ |
| 76 | /* | 85 | /* |
| 77 | * jumbo packet secondary header | 86 | * jumbo packet secondary header |
diff --git a/include/trace/events/sunvnet.h b/include/trace/events/sunvnet.h new file mode 100644 index 000000000000..eb080b267e55 --- /dev/null +++ b/include/trace/events/sunvnet.h | |||
| @@ -0,0 +1,139 @@ | |||
| 1 | #undef TRACE_SYSTEM | ||
| 2 | #define TRACE_SYSTEM sunvnet | ||
| 3 | |||
| 4 | #if !defined(_TRACE_SUNVNET_H) || defined(TRACE_HEADER_MULTI_READ) | ||
| 5 | #define _TRACE_SUNVNET_H | ||
| 6 | |||
| 7 | #include <linux/tracepoint.h> | ||
| 8 | |||
| 9 | TRACE_EVENT(vnet_rx_one, | ||
| 10 | |||
| 11 | TP_PROTO(int lsid, int rsid, int index, int needs_ack), | ||
| 12 | |||
| 13 | TP_ARGS(lsid, rsid, index, needs_ack), | ||
| 14 | |||
| 15 | TP_STRUCT__entry( | ||
| 16 | __field(int, lsid) | ||
| 17 | __field(int, rsid) | ||
| 18 | __field(int, index) | ||
| 19 | __field(int, needs_ack) | ||
| 20 | ), | ||
| 21 | |||
| 22 | TP_fast_assign( | ||
| 23 | __entry->lsid = lsid; | ||
| 24 | __entry->rsid = rsid; | ||
| 25 | __entry->index = index; | ||
| 26 | __entry->needs_ack = needs_ack; | ||
| 27 | ), | ||
| 28 | |||
| 29 | TP_printk("(%x:%x) walk_rx_one index %d; needs_ack %d", | ||
| 30 | __entry->lsid, __entry->rsid, | ||
| 31 | __entry->index, __entry->needs_ack) | ||
| 32 | ); | ||
| 33 | |||
| 34 | DECLARE_EVENT_CLASS(vnet_tx_stopped_ack_template, | ||
| 35 | |||
| 36 | TP_PROTO(int lsid, int rsid, int ack_end, int npkts), | ||
| 37 | |||
| 38 | TP_ARGS(lsid, rsid, ack_end, npkts), | ||
| 39 | |||
| 40 | TP_STRUCT__entry( | ||
| 41 | __field(int, lsid) | ||
| 42 | __field(int, rsid) | ||
| 43 | __field(int, ack_end) | ||
| 44 | __field(int, npkts) | ||
| 45 | ), | ||
| 46 | |||
| 47 | TP_fast_assign( | ||
| 48 | __entry->lsid = lsid; | ||
| 49 | __entry->rsid = rsid; | ||
| 50 | __entry->ack_end = ack_end; | ||
| 51 | __entry->npkts = npkts; | ||
| 52 | ), | ||
| 53 | |||
| 54 | TP_printk("(%x:%x) stopped ack for %d; npkts %d", | ||
| 55 | __entry->lsid, __entry->rsid, | ||
| 56 | __entry->ack_end, __entry->npkts) | ||
| 57 | ); | ||
| 58 | DEFINE_EVENT(vnet_tx_stopped_ack_template, vnet_tx_send_stopped_ack, | ||
| 59 | TP_PROTO(int lsid, int rsid, int ack_end, int npkts), | ||
| 60 | TP_ARGS(lsid, rsid, ack_end, npkts)); | ||
| 61 | DEFINE_EVENT(vnet_tx_stopped_ack_template, vnet_tx_defer_stopped_ack, | ||
| 62 | TP_PROTO(int lsid, int rsid, int ack_end, int npkts), | ||
| 63 | TP_ARGS(lsid, rsid, ack_end, npkts)); | ||
| 64 | DEFINE_EVENT(vnet_tx_stopped_ack_template, vnet_tx_pending_stopped_ack, | ||
| 65 | TP_PROTO(int lsid, int rsid, int ack_end, int npkts), | ||
| 66 | TP_ARGS(lsid, rsid, ack_end, npkts)); | ||
| 67 | |||
| 68 | TRACE_EVENT(vnet_rx_stopped_ack, | ||
| 69 | |||
| 70 | TP_PROTO(int lsid, int rsid, int end), | ||
| 71 | |||
| 72 | TP_ARGS(lsid, rsid, end), | ||
| 73 | |||
| 74 | TP_STRUCT__entry( | ||
| 75 | __field(int, lsid) | ||
| 76 | __field(int, rsid) | ||
| 77 | __field(int, end) | ||
| 78 | ), | ||
| 79 | |||
| 80 | TP_fast_assign( | ||
| 81 | __entry->lsid = lsid; | ||
| 82 | __entry->rsid = rsid; | ||
| 83 | __entry->end = end; | ||
| 84 | ), | ||
| 85 | |||
| 86 | TP_printk("(%x:%x) stopped ack for index %d", | ||
| 87 | __entry->lsid, __entry->rsid, __entry->end) | ||
| 88 | ); | ||
| 89 | |||
| 90 | TRACE_EVENT(vnet_tx_trigger, | ||
| 91 | |||
| 92 | TP_PROTO(int lsid, int rsid, int start, int err), | ||
| 93 | |||
| 94 | TP_ARGS(lsid, rsid, start, err), | ||
| 95 | |||
| 96 | TP_STRUCT__entry( | ||
| 97 | __field(int, lsid) | ||
| 98 | __field(int, rsid) | ||
| 99 | __field(int, start) | ||
| 100 | __field(int, err) | ||
| 101 | ), | ||
| 102 | |||
| 103 | TP_fast_assign( | ||
| 104 | __entry->lsid = lsid; | ||
| 105 | __entry->rsid = rsid; | ||
| 106 | __entry->start = start; | ||
| 107 | __entry->err = err; | ||
| 108 | ), | ||
| 109 | |||
| 110 | TP_printk("(%x:%x) Tx trigger for %d sent with err %d %s", | ||
| 111 | __entry->lsid, __entry->rsid, __entry->start, | ||
| 112 | __entry->err, __entry->err > 0 ? "(ok)" : " ") | ||
| 113 | ); | ||
| 114 | |||
| 115 | TRACE_EVENT(vnet_skip_tx_trigger, | ||
| 116 | |||
| 117 | TP_PROTO(int lsid, int rsid, int last), | ||
| 118 | |||
| 119 | TP_ARGS(lsid, rsid, last), | ||
| 120 | |||
| 121 | TP_STRUCT__entry( | ||
| 122 | __field(int, lsid) | ||
| 123 | __field(int, rsid) | ||
| 124 | __field(int, last) | ||
| 125 | ), | ||
| 126 | |||
| 127 | TP_fast_assign( | ||
| 128 | __entry->lsid = lsid; | ||
| 129 | __entry->rsid = rsid; | ||
| 130 | __entry->last = last; | ||
| 131 | ), | ||
| 132 | |||
| 133 | TP_printk("(%x:%x) Skip Tx trigger. Last trigger sent was %d", | ||
| 134 | __entry->lsid, __entry->rsid, __entry->last) | ||
| 135 | ); | ||
| 136 | #endif /* _TRACE_SOCK_H */ | ||
| 137 | |||
| 138 | /* This part must be outside protection */ | ||
| 139 | #include <trace/define_trace.h> | ||
diff --git a/include/uapi/asm-generic/socket.h b/include/uapi/asm-generic/socket.h index fb8a41668382..67d632f1743d 100644 --- a/include/uapi/asm-generic/socket.h +++ b/include/uapi/asm-generic/socket.h | |||
| @@ -90,4 +90,6 @@ | |||
| 90 | #define SO_ATTACH_REUSEPORT_CBPF 51 | 90 | #define SO_ATTACH_REUSEPORT_CBPF 51 |
| 91 | #define SO_ATTACH_REUSEPORT_EBPF 52 | 91 | #define SO_ATTACH_REUSEPORT_EBPF 52 |
| 92 | 92 | ||
| 93 | #define SO_CNX_ADVICE 53 | ||
| 94 | |||
| 93 | #endif /* __ASM_GENERIC_SOCKET_H */ | 95 | #endif /* __ASM_GENERIC_SOCKET_H */ |
diff --git a/include/uapi/linux/Kbuild b/include/uapi/linux/Kbuild index 5c9ae6a9b7f5..0495884defc1 100644 --- a/include/uapi/linux/Kbuild +++ b/include/uapi/linux/Kbuild | |||
| @@ -174,6 +174,7 @@ header-y += if_hippi.h | |||
| 174 | header-y += if_infiniband.h | 174 | header-y += if_infiniband.h |
| 175 | header-y += if_link.h | 175 | header-y += if_link.h |
| 176 | header-y += if_ltalk.h | 176 | header-y += if_ltalk.h |
| 177 | header-y += if_macsec.h | ||
| 177 | header-y += if_packet.h | 178 | header-y += if_packet.h |
| 178 | header-y += if_phonet.h | 179 | header-y += if_phonet.h |
| 179 | header-y += if_plip.h | 180 | header-y += if_plip.h |
diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index 5df4881dea7b..924f537183fd 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h | |||
| @@ -81,6 +81,9 @@ enum bpf_map_type { | |||
| 81 | BPF_MAP_TYPE_ARRAY, | 81 | BPF_MAP_TYPE_ARRAY, |
| 82 | BPF_MAP_TYPE_PROG_ARRAY, | 82 | BPF_MAP_TYPE_PROG_ARRAY, |
| 83 | BPF_MAP_TYPE_PERF_EVENT_ARRAY, | 83 | BPF_MAP_TYPE_PERF_EVENT_ARRAY, |
| 84 | BPF_MAP_TYPE_PERCPU_HASH, | ||
| 85 | BPF_MAP_TYPE_PERCPU_ARRAY, | ||
| 86 | BPF_MAP_TYPE_STACK_TRACE, | ||
| 84 | }; | 87 | }; |
| 85 | 88 | ||
| 86 | enum bpf_prog_type { | 89 | enum bpf_prog_type { |
| @@ -98,12 +101,15 @@ enum bpf_prog_type { | |||
| 98 | #define BPF_NOEXIST 1 /* create new element if it didn't exist */ | 101 | #define BPF_NOEXIST 1 /* create new element if it didn't exist */ |
| 99 | #define BPF_EXIST 2 /* update existing element */ | 102 | #define BPF_EXIST 2 /* update existing element */ |
| 100 | 103 | ||
| 104 | #define BPF_F_NO_PREALLOC (1U << 0) | ||
| 105 | |||
| 101 | union bpf_attr { | 106 | union bpf_attr { |
| 102 | struct { /* anonymous struct used by BPF_MAP_CREATE command */ | 107 | struct { /* anonymous struct used by BPF_MAP_CREATE command */ |
| 103 | __u32 map_type; /* one of enum bpf_map_type */ | 108 | __u32 map_type; /* one of enum bpf_map_type */ |
| 104 | __u32 key_size; /* size of key in bytes */ | 109 | __u32 key_size; /* size of key in bytes */ |
| 105 | __u32 value_size; /* size of value in bytes */ | 110 | __u32 value_size; /* size of value in bytes */ |
| 106 | __u32 max_entries; /* max number of entries in a map */ | 111 | __u32 max_entries; /* max number of entries in a map */ |
| 112 | __u32 map_flags; /* prealloc or not */ | ||
| 107 | }; | 113 | }; |
| 108 | 114 | ||
| 109 | struct { /* anonymous struct used by BPF_MAP_*_ELEM commands */ | 115 | struct { /* anonymous struct used by BPF_MAP_*_ELEM commands */ |
| @@ -270,6 +276,42 @@ enum bpf_func_id { | |||
| 270 | */ | 276 | */ |
| 271 | BPF_FUNC_perf_event_output, | 277 | BPF_FUNC_perf_event_output, |
| 272 | BPF_FUNC_skb_load_bytes, | 278 | BPF_FUNC_skb_load_bytes, |
| 279 | |||
| 280 | /** | ||
| 281 | * bpf_get_stackid(ctx, map, flags) - walk user or kernel stack and return id | ||
| 282 | * @ctx: struct pt_regs* | ||
| 283 | * @map: pointer to stack_trace map | ||
| 284 | * @flags: bits 0-7 - numer of stack frames to skip | ||
| 285 | * bit 8 - collect user stack instead of kernel | ||
| 286 | * bit 9 - compare stacks by hash only | ||
| 287 | * bit 10 - if two different stacks hash into the same stackid | ||
| 288 | * discard old | ||
| 289 | * other bits - reserved | ||
| 290 | * Return: >= 0 stackid on success or negative error | ||
| 291 | */ | ||
| 292 | BPF_FUNC_get_stackid, | ||
| 293 | |||
| 294 | /** | ||
| 295 | * bpf_csum_diff(from, from_size, to, to_size, seed) - calculate csum diff | ||
| 296 | * @from: raw from buffer | ||
| 297 | * @from_size: length of from buffer | ||
| 298 | * @to: raw to buffer | ||
| 299 | * @to_size: length of to buffer | ||
| 300 | * @seed: optional seed | ||
| 301 | * Return: csum result | ||
| 302 | */ | ||
| 303 | BPF_FUNC_csum_diff, | ||
| 304 | |||
| 305 | /** | ||
| 306 | * bpf_skb_[gs]et_tunnel_opt(skb, opt, size) | ||
| 307 | * retrieve or populate tunnel options metadata | ||
| 308 | * @skb: pointer to skb | ||
| 309 | * @opt: pointer to raw tunnel option data | ||
| 310 | * @size: size of @opt | ||
| 311 | * Return: 0 on success for set, option size for get | ||
| 312 | */ | ||
| 313 | BPF_FUNC_skb_get_tunnel_opt, | ||
| 314 | BPF_FUNC_skb_set_tunnel_opt, | ||
| 273 | __BPF_FUNC_MAX_ID, | 315 | __BPF_FUNC_MAX_ID, |
| 274 | }; | 316 | }; |
| 275 | 317 | ||
| @@ -277,6 +319,7 @@ enum bpf_func_id { | |||
| 277 | 319 | ||
| 278 | /* BPF_FUNC_skb_store_bytes flags. */ | 320 | /* BPF_FUNC_skb_store_bytes flags. */ |
| 279 | #define BPF_F_RECOMPUTE_CSUM (1ULL << 0) | 321 | #define BPF_F_RECOMPUTE_CSUM (1ULL << 0) |
| 322 | #define BPF_F_INVALIDATE_HASH (1ULL << 1) | ||
| 280 | 323 | ||
| 281 | /* BPF_FUNC_l3_csum_replace and BPF_FUNC_l4_csum_replace flags. | 324 | /* BPF_FUNC_l3_csum_replace and BPF_FUNC_l4_csum_replace flags. |
| 282 | * First 4 bits are for passing the header field size. | 325 | * First 4 bits are for passing the header field size. |
| @@ -285,6 +328,7 @@ enum bpf_func_id { | |||
| 285 | 328 | ||
| 286 | /* BPF_FUNC_l4_csum_replace flags. */ | 329 | /* BPF_FUNC_l4_csum_replace flags. */ |
| 287 | #define BPF_F_PSEUDO_HDR (1ULL << 4) | 330 | #define BPF_F_PSEUDO_HDR (1ULL << 4) |
| 331 | #define BPF_F_MARK_MANGLED_0 (1ULL << 5) | ||
| 288 | 332 | ||
| 289 | /* BPF_FUNC_clone_redirect and BPF_FUNC_redirect flags. */ | 333 | /* BPF_FUNC_clone_redirect and BPF_FUNC_redirect flags. */ |
| 290 | #define BPF_F_INGRESS (1ULL << 0) | 334 | #define BPF_F_INGRESS (1ULL << 0) |
| @@ -292,8 +336,15 @@ enum bpf_func_id { | |||
| 292 | /* BPF_FUNC_skb_set_tunnel_key and BPF_FUNC_skb_get_tunnel_key flags. */ | 336 | /* BPF_FUNC_skb_set_tunnel_key and BPF_FUNC_skb_get_tunnel_key flags. */ |
| 293 | #define BPF_F_TUNINFO_IPV6 (1ULL << 0) | 337 | #define BPF_F_TUNINFO_IPV6 (1ULL << 0) |
| 294 | 338 | ||
| 339 | /* BPF_FUNC_get_stackid flags. */ | ||
| 340 | #define BPF_F_SKIP_FIELD_MASK 0xffULL | ||
| 341 | #define BPF_F_USER_STACK (1ULL << 8) | ||
| 342 | #define BPF_F_FAST_STACK_CMP (1ULL << 9) | ||
| 343 | #define BPF_F_REUSE_STACKID (1ULL << 10) | ||
| 344 | |||
| 295 | /* BPF_FUNC_skb_set_tunnel_key flags. */ | 345 | /* BPF_FUNC_skb_set_tunnel_key flags. */ |
| 296 | #define BPF_F_ZERO_CSUM_TX (1ULL << 1) | 346 | #define BPF_F_ZERO_CSUM_TX (1ULL << 1) |
| 347 | #define BPF_F_DONT_FRAGMENT (1ULL << 2) | ||
| 297 | 348 | ||
| 298 | /* user accessible mirror of in-kernel sk_buff. | 349 | /* user accessible mirror of in-kernel sk_buff. |
| 299 | * new fields can only be added to the end of this structure | 350 | * new fields can only be added to the end of this structure |
| @@ -324,6 +375,7 @@ struct bpf_tunnel_key { | |||
| 324 | }; | 375 | }; |
| 325 | __u8 tunnel_tos; | 376 | __u8 tunnel_tos; |
| 326 | __u8 tunnel_ttl; | 377 | __u8 tunnel_ttl; |
| 378 | __u32 tunnel_label; | ||
| 327 | }; | 379 | }; |
| 328 | 380 | ||
| 329 | #endif /* _UAPI__LINUX_BPF_H__ */ | 381 | #endif /* _UAPI__LINUX_BPF_H__ */ |
diff --git a/include/uapi/linux/devlink.h b/include/uapi/linux/devlink.h new file mode 100644 index 000000000000..c9fee5781eb1 --- /dev/null +++ b/include/uapi/linux/devlink.h | |||
| @@ -0,0 +1,72 @@ | |||
| 1 | /* | ||
| 2 | * include/uapi/linux/devlink.h - Network physical device Netlink interface | ||
| 3 | * Copyright (c) 2016 Mellanox Technologies. All rights reserved. | ||
| 4 | * Copyright (c) 2016 Jiri Pirko <jiri@mellanox.com> | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License as published by | ||
| 8 | * the Free Software Foundation; either version 2 of the License, or | ||
| 9 | * (at your option) any later version. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef _UAPI_LINUX_DEVLINK_H_ | ||
| 13 | #define _UAPI_LINUX_DEVLINK_H_ | ||
| 14 | |||
| 15 | #define DEVLINK_GENL_NAME "devlink" | ||
| 16 | #define DEVLINK_GENL_VERSION 0x1 | ||
| 17 | #define DEVLINK_GENL_MCGRP_CONFIG_NAME "config" | ||
| 18 | |||
| 19 | enum devlink_command { | ||
| 20 | /* don't change the order or add anything between, this is ABI! */ | ||
| 21 | DEVLINK_CMD_UNSPEC, | ||
| 22 | |||
| 23 | DEVLINK_CMD_GET, /* can dump */ | ||
| 24 | DEVLINK_CMD_SET, | ||
| 25 | DEVLINK_CMD_NEW, | ||
| 26 | DEVLINK_CMD_DEL, | ||
| 27 | |||
| 28 | DEVLINK_CMD_PORT_GET, /* can dump */ | ||
| 29 | DEVLINK_CMD_PORT_SET, | ||
| 30 | DEVLINK_CMD_PORT_NEW, | ||
| 31 | DEVLINK_CMD_PORT_DEL, | ||
| 32 | |||
| 33 | DEVLINK_CMD_PORT_SPLIT, | ||
| 34 | DEVLINK_CMD_PORT_UNSPLIT, | ||
| 35 | |||
| 36 | /* add new commands above here */ | ||
| 37 | |||
| 38 | __DEVLINK_CMD_MAX, | ||
| 39 | DEVLINK_CMD_MAX = __DEVLINK_CMD_MAX - 1 | ||
| 40 | }; | ||
| 41 | |||
| 42 | enum devlink_port_type { | ||
| 43 | DEVLINK_PORT_TYPE_NOTSET, | ||
| 44 | DEVLINK_PORT_TYPE_AUTO, | ||
| 45 | DEVLINK_PORT_TYPE_ETH, | ||
| 46 | DEVLINK_PORT_TYPE_IB, | ||
| 47 | }; | ||
| 48 | |||
| 49 | enum devlink_attr { | ||
| 50 | /* don't change the order or add anything between, this is ABI! */ | ||
| 51 | DEVLINK_ATTR_UNSPEC, | ||
| 52 | |||
| 53 | /* bus name + dev name together are a handle for devlink entity */ | ||
| 54 | DEVLINK_ATTR_BUS_NAME, /* string */ | ||
| 55 | DEVLINK_ATTR_DEV_NAME, /* string */ | ||
| 56 | |||
| 57 | DEVLINK_ATTR_PORT_INDEX, /* u32 */ | ||
| 58 | DEVLINK_ATTR_PORT_TYPE, /* u16 */ | ||
| 59 | DEVLINK_ATTR_PORT_DESIRED_TYPE, /* u16 */ | ||
| 60 | DEVLINK_ATTR_PORT_NETDEV_IFINDEX, /* u32 */ | ||
| 61 | DEVLINK_ATTR_PORT_NETDEV_NAME, /* string */ | ||
| 62 | DEVLINK_ATTR_PORT_IBDEV_NAME, /* string */ | ||
| 63 | DEVLINK_ATTR_PORT_SPLIT_COUNT, /* u32 */ | ||
| 64 | DEVLINK_ATTR_PORT_SPLIT_GROUP, /* u32 */ | ||
| 65 | |||
| 66 | /* add new attributes above here, update the policy in devlink.c */ | ||
| 67 | |||
| 68 | __DEVLINK_ATTR_MAX, | ||
| 69 | DEVLINK_ATTR_MAX = __DEVLINK_ATTR_MAX - 1 | ||
| 70 | }; | ||
| 71 | |||
| 72 | #endif /* _UAPI_LINUX_DEVLINK_H_ */ | ||
diff --git a/include/uapi/linux/ethtool.h b/include/uapi/linux/ethtool.h index 57fa39005e79..2835b07416b7 100644 --- a/include/uapi/linux/ethtool.h +++ b/include/uapi/linux/ethtool.h | |||
| @@ -13,15 +13,21 @@ | |||
| 13 | #ifndef _UAPI_LINUX_ETHTOOL_H | 13 | #ifndef _UAPI_LINUX_ETHTOOL_H |
| 14 | #define _UAPI_LINUX_ETHTOOL_H | 14 | #define _UAPI_LINUX_ETHTOOL_H |
| 15 | 15 | ||
| 16 | #include <linux/kernel.h> | ||
| 16 | #include <linux/types.h> | 17 | #include <linux/types.h> |
| 17 | #include <linux/if_ether.h> | 18 | #include <linux/if_ether.h> |
| 18 | 19 | ||
| 20 | #ifndef __KERNEL__ | ||
| 21 | #include <limits.h> /* for INT_MAX */ | ||
| 22 | #endif | ||
| 23 | |||
| 19 | /* All structures exposed to userland should be defined such that they | 24 | /* All structures exposed to userland should be defined such that they |
| 20 | * have the same layout for 32-bit and 64-bit userland. | 25 | * have the same layout for 32-bit and 64-bit userland. |
| 21 | */ | 26 | */ |
| 22 | 27 | ||
| 23 | /** | 28 | /** |
| 24 | * struct ethtool_cmd - link control and status | 29 | * struct ethtool_cmd - DEPRECATED, link control and status |
| 30 | * This structure is DEPRECATED, please use struct ethtool_link_settings. | ||
| 25 | * @cmd: Command number = %ETHTOOL_GSET or %ETHTOOL_SSET | 31 | * @cmd: Command number = %ETHTOOL_GSET or %ETHTOOL_SSET |
| 26 | * @supported: Bitmask of %SUPPORTED_* flags for the link modes, | 32 | * @supported: Bitmask of %SUPPORTED_* flags for the link modes, |
| 27 | * physical connectors and other link features for which the | 33 | * physical connectors and other link features for which the |
| @@ -31,7 +37,7 @@ | |||
| 31 | * physical connectors and other link features that are | 37 | * physical connectors and other link features that are |
| 32 | * advertised through autonegotiation or enabled for | 38 | * advertised through autonegotiation or enabled for |
| 33 | * auto-detection. | 39 | * auto-detection. |
| 34 | * @speed: Low bits of the speed | 40 | * @speed: Low bits of the speed, 1Mb units, 0 to INT_MAX or SPEED_UNKNOWN |
| 35 | * @duplex: Duplex mode; one of %DUPLEX_* | 41 | * @duplex: Duplex mode; one of %DUPLEX_* |
| 36 | * @port: Physical connector type; one of %PORT_* | 42 | * @port: Physical connector type; one of %PORT_* |
| 37 | * @phy_address: MDIO address of PHY (transceiver); 0 or 255 if not | 43 | * @phy_address: MDIO address of PHY (transceiver); 0 or 255 if not |
| @@ -47,7 +53,7 @@ | |||
| 47 | * obsoleted by &struct ethtool_coalesce. Read-only; deprecated. | 53 | * obsoleted by &struct ethtool_coalesce. Read-only; deprecated. |
| 48 | * @maxrxpkt: Historically used to report RX IRQ coalescing; now | 54 | * @maxrxpkt: Historically used to report RX IRQ coalescing; now |
| 49 | * obsoleted by &struct ethtool_coalesce. Read-only; deprecated. | 55 | * obsoleted by &struct ethtool_coalesce. Read-only; deprecated. |
| 50 | * @speed_hi: High bits of the speed | 56 | * @speed_hi: High bits of the speed, 1Mb units, 0 to INT_MAX or SPEED_UNKNOWN |
| 51 | * @eth_tp_mdix: Ethernet twisted-pair MDI(-X) status; one of | 57 | * @eth_tp_mdix: Ethernet twisted-pair MDI(-X) status; one of |
| 52 | * %ETH_TP_MDI_*. If the status is unknown or not applicable, the | 58 | * %ETH_TP_MDI_*. If the status is unknown or not applicable, the |
| 53 | * value will be %ETH_TP_MDI_INVALID. Read-only. | 59 | * value will be %ETH_TP_MDI_INVALID. Read-only. |
| @@ -748,6 +754,56 @@ struct ethtool_usrip4_spec { | |||
| 748 | __u8 proto; | 754 | __u8 proto; |
| 749 | }; | 755 | }; |
| 750 | 756 | ||
| 757 | /** | ||
| 758 | * struct ethtool_tcpip6_spec - flow specification for TCP/IPv6 etc. | ||
| 759 | * @ip6src: Source host | ||
| 760 | * @ip6dst: Destination host | ||
| 761 | * @psrc: Source port | ||
| 762 | * @pdst: Destination port | ||
| 763 | * @tclass: Traffic Class | ||
| 764 | * | ||
| 765 | * This can be used to specify a TCP/IPv6, UDP/IPv6 or SCTP/IPv6 flow. | ||
| 766 | */ | ||
| 767 | struct ethtool_tcpip6_spec { | ||
| 768 | __be32 ip6src[4]; | ||
| 769 | __be32 ip6dst[4]; | ||
| 770 | __be16 psrc; | ||
| 771 | __be16 pdst; | ||
| 772 | __u8 tclass; | ||
| 773 | }; | ||
| 774 | |||
| 775 | /** | ||
| 776 | * struct ethtool_ah_espip6_spec - flow specification for IPsec/IPv6 | ||
| 777 | * @ip6src: Source host | ||
| 778 | * @ip6dst: Destination host | ||
| 779 | * @spi: Security parameters index | ||
| 780 | * @tclass: Traffic Class | ||
| 781 | * | ||
| 782 | * This can be used to specify an IPsec transport or tunnel over IPv6. | ||
| 783 | */ | ||
| 784 | struct ethtool_ah_espip6_spec { | ||
| 785 | __be32 ip6src[4]; | ||
| 786 | __be32 ip6dst[4]; | ||
| 787 | __be32 spi; | ||
| 788 | __u8 tclass; | ||
| 789 | }; | ||
| 790 | |||
| 791 | /** | ||
| 792 | * struct ethtool_usrip6_spec - general flow specification for IPv6 | ||
| 793 | * @ip6src: Source host | ||
| 794 | * @ip6dst: Destination host | ||
| 795 | * @l4_4_bytes: First 4 bytes of transport (layer 4) header | ||
| 796 | * @tclass: Traffic Class | ||
| 797 | * @l4_proto: Transport protocol number (nexthdr after any Extension Headers) | ||
| 798 | */ | ||
| 799 | struct ethtool_usrip6_spec { | ||
| 800 | __be32 ip6src[4]; | ||
| 801 | __be32 ip6dst[4]; | ||
| 802 | __be32 l4_4_bytes; | ||
| 803 | __u8 tclass; | ||
| 804 | __u8 l4_proto; | ||
| 805 | }; | ||
| 806 | |||
| 751 | union ethtool_flow_union { | 807 | union ethtool_flow_union { |
| 752 | struct ethtool_tcpip4_spec tcp_ip4_spec; | 808 | struct ethtool_tcpip4_spec tcp_ip4_spec; |
| 753 | struct ethtool_tcpip4_spec udp_ip4_spec; | 809 | struct ethtool_tcpip4_spec udp_ip4_spec; |
| @@ -755,6 +811,12 @@ union ethtool_flow_union { | |||
| 755 | struct ethtool_ah_espip4_spec ah_ip4_spec; | 811 | struct ethtool_ah_espip4_spec ah_ip4_spec; |
| 756 | struct ethtool_ah_espip4_spec esp_ip4_spec; | 812 | struct ethtool_ah_espip4_spec esp_ip4_spec; |
| 757 | struct ethtool_usrip4_spec usr_ip4_spec; | 813 | struct ethtool_usrip4_spec usr_ip4_spec; |
| 814 | struct ethtool_tcpip6_spec tcp_ip6_spec; | ||
| 815 | struct ethtool_tcpip6_spec udp_ip6_spec; | ||
| 816 | struct ethtool_tcpip6_spec sctp_ip6_spec; | ||
| 817 | struct ethtool_ah_espip6_spec ah_ip6_spec; | ||
| 818 | struct ethtool_ah_espip6_spec esp_ip6_spec; | ||
| 819 | struct ethtool_usrip6_spec usr_ip6_spec; | ||
| 758 | struct ethhdr ether_spec; | 820 | struct ethhdr ether_spec; |
| 759 | __u8 hdata[52]; | 821 | __u8 hdata[52]; |
| 760 | }; | 822 | }; |
| @@ -1146,10 +1208,29 @@ enum ethtool_sfeatures_retval_bits { | |||
| 1146 | #define ETHTOOL_F_WISH (1 << ETHTOOL_F_WISH__BIT) | 1208 | #define ETHTOOL_F_WISH (1 << ETHTOOL_F_WISH__BIT) |
| 1147 | #define ETHTOOL_F_COMPAT (1 << ETHTOOL_F_COMPAT__BIT) | 1209 | #define ETHTOOL_F_COMPAT (1 << ETHTOOL_F_COMPAT__BIT) |
| 1148 | 1210 | ||
| 1211 | #define MAX_NUM_QUEUE 4096 | ||
| 1212 | |||
| 1213 | /** | ||
| 1214 | * struct ethtool_per_queue_op - apply sub command to the queues in mask. | ||
| 1215 | * @cmd: ETHTOOL_PERQUEUE | ||
| 1216 | * @sub_command: the sub command which apply to each queues | ||
| 1217 | * @queue_mask: Bitmap of the queues which sub command apply to | ||
| 1218 | * @data: A complete command structure following for each of the queues addressed | ||
| 1219 | */ | ||
| 1220 | struct ethtool_per_queue_op { | ||
| 1221 | __u32 cmd; | ||
| 1222 | __u32 sub_command; | ||
| 1223 | __u32 queue_mask[__KERNEL_DIV_ROUND_UP(MAX_NUM_QUEUE, 32)]; | ||
| 1224 | char data[]; | ||
| 1225 | }; | ||
| 1149 | 1226 | ||
| 1150 | /* CMDs currently supported */ | 1227 | /* CMDs currently supported */ |
| 1151 | #define ETHTOOL_GSET 0x00000001 /* Get settings. */ | 1228 | #define ETHTOOL_GSET 0x00000001 /* DEPRECATED, Get settings. |
| 1152 | #define ETHTOOL_SSET 0x00000002 /* Set settings. */ | 1229 | * Please use ETHTOOL_GLINKSETTINGS |
| 1230 | */ | ||
| 1231 | #define ETHTOOL_SSET 0x00000002 /* DEPRECATED, Set settings. | ||
| 1232 | * Please use ETHTOOL_SLINKSETTINGS | ||
| 1233 | */ | ||
| 1153 | #define ETHTOOL_GDRVINFO 0x00000003 /* Get driver info. */ | 1234 | #define ETHTOOL_GDRVINFO 0x00000003 /* Get driver info. */ |
| 1154 | #define ETHTOOL_GREGS 0x00000004 /* Get NIC registers. */ | 1235 | #define ETHTOOL_GREGS 0x00000004 /* Get NIC registers. */ |
| 1155 | #define ETHTOOL_GWOL 0x00000005 /* Get wake-on-lan options. */ | 1236 | #define ETHTOOL_GWOL 0x00000005 /* Get wake-on-lan options. */ |
| @@ -1229,73 +1310,141 @@ enum ethtool_sfeatures_retval_bits { | |||
| 1229 | #define ETHTOOL_STUNABLE 0x00000049 /* Set tunable configuration */ | 1310 | #define ETHTOOL_STUNABLE 0x00000049 /* Set tunable configuration */ |
| 1230 | #define ETHTOOL_GPHYSTATS 0x0000004a /* get PHY-specific statistics */ | 1311 | #define ETHTOOL_GPHYSTATS 0x0000004a /* get PHY-specific statistics */ |
| 1231 | 1312 | ||
| 1313 | #define ETHTOOL_PERQUEUE 0x0000004b /* Set per queue options */ | ||
| 1314 | |||
| 1315 | #define ETHTOOL_GLINKSETTINGS 0x0000004c /* Get ethtool_link_settings */ | ||
| 1316 | #define ETHTOOL_SLINKSETTINGS 0x0000004d /* Set ethtool_link_settings */ | ||
| 1317 | |||
| 1318 | |||
| 1232 | /* compatibility with older code */ | 1319 | /* compatibility with older code */ |
| 1233 | #define SPARC_ETH_GSET ETHTOOL_GSET | 1320 | #define SPARC_ETH_GSET ETHTOOL_GSET |
| 1234 | #define SPARC_ETH_SSET ETHTOOL_SSET | 1321 | #define SPARC_ETH_SSET ETHTOOL_SSET |
| 1235 | 1322 | ||
| 1236 | #define SUPPORTED_10baseT_Half (1 << 0) | 1323 | /* Link mode bit indices */ |
| 1237 | #define SUPPORTED_10baseT_Full (1 << 1) | 1324 | enum ethtool_link_mode_bit_indices { |
| 1238 | #define SUPPORTED_100baseT_Half (1 << 2) | 1325 | ETHTOOL_LINK_MODE_10baseT_Half_BIT = 0, |
| 1239 | #define SUPPORTED_100baseT_Full (1 << 3) | 1326 | ETHTOOL_LINK_MODE_10baseT_Full_BIT = 1, |
| 1240 | #define SUPPORTED_1000baseT_Half (1 << 4) | 1327 | ETHTOOL_LINK_MODE_100baseT_Half_BIT = 2, |
| 1241 | #define SUPPORTED_1000baseT_Full (1 << 5) | 1328 | ETHTOOL_LINK_MODE_100baseT_Full_BIT = 3, |
| 1242 | #define SUPPORTED_Autoneg (1 << 6) | 1329 | ETHTOOL_LINK_MODE_1000baseT_Half_BIT = 4, |
| 1243 | #define SUPPORTED_TP (1 << 7) | 1330 | ETHTOOL_LINK_MODE_1000baseT_Full_BIT = 5, |
| 1244 | #define SUPPORTED_AUI (1 << 8) | 1331 | ETHTOOL_LINK_MODE_Autoneg_BIT = 6, |
| 1245 | #define SUPPORTED_MII (1 << 9) | 1332 | ETHTOOL_LINK_MODE_TP_BIT = 7, |
| 1246 | #define SUPPORTED_FIBRE (1 << 10) | 1333 | ETHTOOL_LINK_MODE_AUI_BIT = 8, |
| 1247 | #define SUPPORTED_BNC (1 << 11) | 1334 | ETHTOOL_LINK_MODE_MII_BIT = 9, |
| 1248 | #define SUPPORTED_10000baseT_Full (1 << 12) | 1335 | ETHTOOL_LINK_MODE_FIBRE_BIT = 10, |
| 1249 | #define SUPPORTED_Pause (1 << 13) | 1336 | ETHTOOL_LINK_MODE_BNC_BIT = 11, |
| 1250 | #define SUPPORTED_Asym_Pause (1 << 14) | 1337 | ETHTOOL_LINK_MODE_10000baseT_Full_BIT = 12, |
| 1251 | #define SUPPORTED_2500baseX_Full (1 << 15) | 1338 | ETHTOOL_LINK_MODE_Pause_BIT = 13, |
| 1252 | #define SUPPORTED_Backplane (1 << 16) | 1339 | ETHTOOL_LINK_MODE_Asym_Pause_BIT = 14, |
| 1253 | #define SUPPORTED_1000baseKX_Full (1 << 17) | 1340 | ETHTOOL_LINK_MODE_2500baseX_Full_BIT = 15, |
| 1254 | #define SUPPORTED_10000baseKX4_Full (1 << 18) | 1341 | ETHTOOL_LINK_MODE_Backplane_BIT = 16, |
| 1255 | #define SUPPORTED_10000baseKR_Full (1 << 19) | 1342 | ETHTOOL_LINK_MODE_1000baseKX_Full_BIT = 17, |
| 1256 | #define SUPPORTED_10000baseR_FEC (1 << 20) | 1343 | ETHTOOL_LINK_MODE_10000baseKX4_Full_BIT = 18, |
| 1257 | #define SUPPORTED_20000baseMLD2_Full (1 << 21) | 1344 | ETHTOOL_LINK_MODE_10000baseKR_Full_BIT = 19, |
| 1258 | #define SUPPORTED_20000baseKR2_Full (1 << 22) | 1345 | ETHTOOL_LINK_MODE_10000baseR_FEC_BIT = 20, |
| 1259 | #define SUPPORTED_40000baseKR4_Full (1 << 23) | 1346 | ETHTOOL_LINK_MODE_20000baseMLD2_Full_BIT = 21, |
| 1260 | #define SUPPORTED_40000baseCR4_Full (1 << 24) | 1347 | ETHTOOL_LINK_MODE_20000baseKR2_Full_BIT = 22, |
| 1261 | #define SUPPORTED_40000baseSR4_Full (1 << 25) | 1348 | ETHTOOL_LINK_MODE_40000baseKR4_Full_BIT = 23, |
| 1262 | #define SUPPORTED_40000baseLR4_Full (1 << 26) | 1349 | ETHTOOL_LINK_MODE_40000baseCR4_Full_BIT = 24, |
| 1263 | #define SUPPORTED_56000baseKR4_Full (1 << 27) | 1350 | ETHTOOL_LINK_MODE_40000baseSR4_Full_BIT = 25, |
| 1264 | #define SUPPORTED_56000baseCR4_Full (1 << 28) | 1351 | ETHTOOL_LINK_MODE_40000baseLR4_Full_BIT = 26, |
| 1265 | #define SUPPORTED_56000baseSR4_Full (1 << 29) | 1352 | ETHTOOL_LINK_MODE_56000baseKR4_Full_BIT = 27, |
| 1266 | #define SUPPORTED_56000baseLR4_Full (1 << 30) | 1353 | ETHTOOL_LINK_MODE_56000baseCR4_Full_BIT = 28, |
| 1267 | 1354 | ETHTOOL_LINK_MODE_56000baseSR4_Full_BIT = 29, | |
| 1268 | #define ADVERTISED_10baseT_Half (1 << 0) | 1355 | ETHTOOL_LINK_MODE_56000baseLR4_Full_BIT = 30, |
| 1269 | #define ADVERTISED_10baseT_Full (1 << 1) | 1356 | |
| 1270 | #define ADVERTISED_100baseT_Half (1 << 2) | 1357 | /* Last allowed bit for __ETHTOOL_LINK_MODE_LEGACY_MASK is bit |
| 1271 | #define ADVERTISED_100baseT_Full (1 << 3) | 1358 | * 31. Please do NOT define any SUPPORTED_* or ADVERTISED_* |
| 1272 | #define ADVERTISED_1000baseT_Half (1 << 4) | 1359 | * macro for bits > 31. The only way to use indices > 31 is to |
| 1273 | #define ADVERTISED_1000baseT_Full (1 << 5) | 1360 | * use the new ETHTOOL_GLINKSETTINGS/ETHTOOL_SLINKSETTINGS API. |
| 1274 | #define ADVERTISED_Autoneg (1 << 6) | 1361 | */ |
| 1275 | #define ADVERTISED_TP (1 << 7) | 1362 | |
| 1276 | #define ADVERTISED_AUI (1 << 8) | 1363 | __ETHTOOL_LINK_MODE_LAST |
| 1277 | #define ADVERTISED_MII (1 << 9) | 1364 | = ETHTOOL_LINK_MODE_56000baseLR4_Full_BIT, |
| 1278 | #define ADVERTISED_FIBRE (1 << 10) | 1365 | }; |
| 1279 | #define ADVERTISED_BNC (1 << 11) | 1366 | |
| 1280 | #define ADVERTISED_10000baseT_Full (1 << 12) | 1367 | #define __ETHTOOL_LINK_MODE_LEGACY_MASK(base_name) \ |
| 1281 | #define ADVERTISED_Pause (1 << 13) | 1368 | (1UL << (ETHTOOL_LINK_MODE_ ## base_name ## _BIT)) |
| 1282 | #define ADVERTISED_Asym_Pause (1 << 14) | 1369 | |
| 1283 | #define ADVERTISED_2500baseX_Full (1 << 15) | 1370 | /* DEPRECATED macros. Please migrate to |
| 1284 | #define ADVERTISED_Backplane (1 << 16) | 1371 | * ETHTOOL_GLINKSETTINGS/ETHTOOL_SLINKSETTINGS API. Please do NOT |
| 1285 | #define ADVERTISED_1000baseKX_Full (1 << 17) | 1372 | * define any new SUPPORTED_* macro for bits > 31. |
| 1286 | #define ADVERTISED_10000baseKX4_Full (1 << 18) | 1373 | */ |
| 1287 | #define ADVERTISED_10000baseKR_Full (1 << 19) | 1374 | #define SUPPORTED_10baseT_Half __ETHTOOL_LINK_MODE_LEGACY_MASK(10baseT_Half) |
| 1288 | #define ADVERTISED_10000baseR_FEC (1 << 20) | 1375 | #define SUPPORTED_10baseT_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(10baseT_Full) |
| 1289 | #define ADVERTISED_20000baseMLD2_Full (1 << 21) | 1376 | #define SUPPORTED_100baseT_Half __ETHTOOL_LINK_MODE_LEGACY_MASK(100baseT_Half) |
| 1290 | #define ADVERTISED_20000baseKR2_Full (1 << 22) | 1377 | #define SUPPORTED_100baseT_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(100baseT_Full) |
| 1291 | #define ADVERTISED_40000baseKR4_Full (1 << 23) | 1378 | #define SUPPORTED_1000baseT_Half __ETHTOOL_LINK_MODE_LEGACY_MASK(1000baseT_Half) |
| 1292 | #define ADVERTISED_40000baseCR4_Full (1 << 24) | 1379 | #define SUPPORTED_1000baseT_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(1000baseT_Full) |
| 1293 | #define ADVERTISED_40000baseSR4_Full (1 << 25) | 1380 | #define SUPPORTED_Autoneg __ETHTOOL_LINK_MODE_LEGACY_MASK(Autoneg) |
| 1294 | #define ADVERTISED_40000baseLR4_Full (1 << 26) | 1381 | #define SUPPORTED_TP __ETHTOOL_LINK_MODE_LEGACY_MASK(TP) |
| 1295 | #define ADVERTISED_56000baseKR4_Full (1 << 27) | 1382 | #define SUPPORTED_AUI __ETHTOOL_LINK_MODE_LEGACY_MASK(AUI) |
| 1296 | #define ADVERTISED_56000baseCR4_Full (1 << 28) | 1383 | #define SUPPORTED_MII __ETHTOOL_LINK_MODE_LEGACY_MASK(MII) |
| 1297 | #define ADVERTISED_56000baseSR4_Full (1 << 29) | 1384 | #define SUPPORTED_FIBRE __ETHTOOL_LINK_MODE_LEGACY_MASK(FIBRE) |
| 1298 | #define ADVERTISED_56000baseLR4_Full (1 << 30) | 1385 | #define SUPPORTED_BNC __ETHTOOL_LINK_MODE_LEGACY_MASK(BNC) |
| 1386 | #define SUPPORTED_10000baseT_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(10000baseT_Full) | ||
| 1387 | #define SUPPORTED_Pause __ETHTOOL_LINK_MODE_LEGACY_MASK(Pause) | ||
| 1388 | #define SUPPORTED_Asym_Pause __ETHTOOL_LINK_MODE_LEGACY_MASK(Asym_Pause) | ||
| 1389 | #define SUPPORTED_2500baseX_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(2500baseX_Full) | ||
| 1390 | #define SUPPORTED_Backplane __ETHTOOL_LINK_MODE_LEGACY_MASK(Backplane) | ||
| 1391 | #define SUPPORTED_1000baseKX_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(1000baseKX_Full) | ||
| 1392 | #define SUPPORTED_10000baseKX4_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(10000baseKX4_Full) | ||
| 1393 | #define SUPPORTED_10000baseKR_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(10000baseKR_Full) | ||
| 1394 | #define SUPPORTED_10000baseR_FEC __ETHTOOL_LINK_MODE_LEGACY_MASK(10000baseR_FEC) | ||
| 1395 | #define SUPPORTED_20000baseMLD2_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(20000baseMLD2_Full) | ||
| 1396 | #define SUPPORTED_20000baseKR2_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(20000baseKR2_Full) | ||
| 1397 | #define SUPPORTED_40000baseKR4_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(40000baseKR4_Full) | ||
| 1398 | #define SUPPORTED_40000baseCR4_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(40000baseCR4_Full) | ||
| 1399 | #define SUPPORTED_40000baseSR4_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(40000baseSR4_Full) | ||
| 1400 | #define SUPPORTED_40000baseLR4_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(40000baseLR4_Full) | ||
| 1401 | #define SUPPORTED_56000baseKR4_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(56000baseKR4_Full) | ||
| 1402 | #define SUPPORTED_56000baseCR4_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(56000baseCR4_Full) | ||
| 1403 | #define SUPPORTED_56000baseSR4_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(56000baseSR4_Full) | ||
| 1404 | #define SUPPORTED_56000baseLR4_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(56000baseLR4_Full) | ||
| 1405 | /* Please do not define any new SUPPORTED_* macro for bits > 31, see | ||
| 1406 | * notice above. | ||
| 1407 | */ | ||
| 1408 | |||
| 1409 | /* | ||
| 1410 | * DEPRECATED macros. Please migrate to | ||
| 1411 | * ETHTOOL_GLINKSETTINGS/ETHTOOL_SLINKSETTINGS API. Please do NOT | ||
| 1412 | * define any new ADERTISE_* macro for bits > 31. | ||
| 1413 | */ | ||
| 1414 | #define ADVERTISED_10baseT_Half __ETHTOOL_LINK_MODE_LEGACY_MASK(10baseT_Half) | ||
| 1415 | #define ADVERTISED_10baseT_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(10baseT_Full) | ||
| 1416 | #define ADVERTISED_100baseT_Half __ETHTOOL_LINK_MODE_LEGACY_MASK(100baseT_Half) | ||
| 1417 | #define ADVERTISED_100baseT_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(100baseT_Full) | ||
| 1418 | #define ADVERTISED_1000baseT_Half __ETHTOOL_LINK_MODE_LEGACY_MASK(1000baseT_Half) | ||
| 1419 | #define ADVERTISED_1000baseT_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(1000baseT_Full) | ||
| 1420 | #define ADVERTISED_Autoneg __ETHTOOL_LINK_MODE_LEGACY_MASK(Autoneg) | ||
| 1421 | #define ADVERTISED_TP __ETHTOOL_LINK_MODE_LEGACY_MASK(TP) | ||
| 1422 | #define ADVERTISED_AUI __ETHTOOL_LINK_MODE_LEGACY_MASK(AUI) | ||
| 1423 | #define ADVERTISED_MII __ETHTOOL_LINK_MODE_LEGACY_MASK(MII) | ||
| 1424 | #define ADVERTISED_FIBRE __ETHTOOL_LINK_MODE_LEGACY_MASK(FIBRE) | ||
| 1425 | #define ADVERTISED_BNC __ETHTOOL_LINK_MODE_LEGACY_MASK(BNC) | ||
| 1426 | #define ADVERTISED_10000baseT_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(10000baseT_Full) | ||
| 1427 | #define ADVERTISED_Pause __ETHTOOL_LINK_MODE_LEGACY_MASK(Pause) | ||
| 1428 | #define ADVERTISED_Asym_Pause __ETHTOOL_LINK_MODE_LEGACY_MASK(Asym_Pause) | ||
| 1429 | #define ADVERTISED_2500baseX_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(2500baseX_Full) | ||
| 1430 | #define ADVERTISED_Backplane __ETHTOOL_LINK_MODE_LEGACY_MASK(Backplane) | ||
| 1431 | #define ADVERTISED_1000baseKX_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(1000baseKX_Full) | ||
| 1432 | #define ADVERTISED_10000baseKX4_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(10000baseKX4_Full) | ||
| 1433 | #define ADVERTISED_10000baseKR_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(10000baseKR_Full) | ||
| 1434 | #define ADVERTISED_10000baseR_FEC __ETHTOOL_LINK_MODE_LEGACY_MASK(10000baseR_FEC) | ||
| 1435 | #define ADVERTISED_20000baseMLD2_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(20000baseMLD2_Full) | ||
| 1436 | #define ADVERTISED_20000baseKR2_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(20000baseKR2_Full) | ||
| 1437 | #define ADVERTISED_40000baseKR4_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(40000baseKR4_Full) | ||
| 1438 | #define ADVERTISED_40000baseCR4_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(40000baseCR4_Full) | ||
| 1439 | #define ADVERTISED_40000baseSR4_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(40000baseSR4_Full) | ||
| 1440 | #define ADVERTISED_40000baseLR4_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(40000baseLR4_Full) | ||
| 1441 | #define ADVERTISED_56000baseKR4_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(56000baseKR4_Full) | ||
| 1442 | #define ADVERTISED_56000baseCR4_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(56000baseCR4_Full) | ||
| 1443 | #define ADVERTISED_56000baseSR4_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(56000baseSR4_Full) | ||
| 1444 | #define ADVERTISED_56000baseLR4_Full __ETHTOOL_LINK_MODE_LEGACY_MASK(56000baseLR4_Full) | ||
| 1445 | /* Please do not define any new ADVERTISED_* macro for bits > 31, see | ||
| 1446 | * notice above. | ||
| 1447 | */ | ||
| 1299 | 1448 | ||
| 1300 | /* The following are all involved in forcing a particular link | 1449 | /* The following are all involved in forcing a particular link |
| 1301 | * mode for the device for setting things. When getting the | 1450 | * mode for the device for setting things. When getting the |
| @@ -1303,7 +1452,7 @@ enum ethtool_sfeatures_retval_bits { | |||
| 1303 | * it was forced up into this mode or autonegotiated. | 1452 | * it was forced up into this mode or autonegotiated. |
| 1304 | */ | 1453 | */ |
| 1305 | 1454 | ||
| 1306 | /* The forced speed, 10Mb, 100Mb, gigabit, [2.5|5|10|20|25|40|50|56|100]GbE. */ | 1455 | /* The forced speed, in units of 1Mb. All values 0 to INT_MAX are legal. */ |
| 1307 | #define SPEED_10 10 | 1456 | #define SPEED_10 10 |
| 1308 | #define SPEED_100 100 | 1457 | #define SPEED_100 100 |
| 1309 | #define SPEED_1000 1000 | 1458 | #define SPEED_1000 1000 |
| @@ -1319,11 +1468,28 @@ enum ethtool_sfeatures_retval_bits { | |||
| 1319 | 1468 | ||
| 1320 | #define SPEED_UNKNOWN -1 | 1469 | #define SPEED_UNKNOWN -1 |
| 1321 | 1470 | ||
| 1471 | static inline int ethtool_validate_speed(__u32 speed) | ||
| 1472 | { | ||
| 1473 | return speed <= INT_MAX || speed == SPEED_UNKNOWN; | ||
| 1474 | } | ||
| 1475 | |||
| 1322 | /* Duplex, half or full. */ | 1476 | /* Duplex, half or full. */ |
| 1323 | #define DUPLEX_HALF 0x00 | 1477 | #define DUPLEX_HALF 0x00 |
| 1324 | #define DUPLEX_FULL 0x01 | 1478 | #define DUPLEX_FULL 0x01 |
| 1325 | #define DUPLEX_UNKNOWN 0xff | 1479 | #define DUPLEX_UNKNOWN 0xff |
| 1326 | 1480 | ||
| 1481 | static inline int ethtool_validate_duplex(__u8 duplex) | ||
| 1482 | { | ||
| 1483 | switch (duplex) { | ||
| 1484 | case DUPLEX_HALF: | ||
| 1485 | case DUPLEX_FULL: | ||
| 1486 | case DUPLEX_UNKNOWN: | ||
| 1487 | return 1; | ||
| 1488 | } | ||
| 1489 | |||
| 1490 | return 0; | ||
| 1491 | } | ||
| 1492 | |||
| 1327 | /* Which connector port. */ | 1493 | /* Which connector port. */ |
| 1328 | #define PORT_TP 0x00 | 1494 | #define PORT_TP 0x00 |
| 1329 | #define PORT_AUI 0x01 | 1495 | #define PORT_AUI 0x01 |
| @@ -1367,15 +1533,17 @@ enum ethtool_sfeatures_retval_bits { | |||
| 1367 | #define UDP_V4_FLOW 0x02 /* hash or spec (udp_ip4_spec) */ | 1533 | #define UDP_V4_FLOW 0x02 /* hash or spec (udp_ip4_spec) */ |
| 1368 | #define SCTP_V4_FLOW 0x03 /* hash or spec (sctp_ip4_spec) */ | 1534 | #define SCTP_V4_FLOW 0x03 /* hash or spec (sctp_ip4_spec) */ |
| 1369 | #define AH_ESP_V4_FLOW 0x04 /* hash only */ | 1535 | #define AH_ESP_V4_FLOW 0x04 /* hash only */ |
| 1370 | #define TCP_V6_FLOW 0x05 /* hash only */ | 1536 | #define TCP_V6_FLOW 0x05 /* hash or spec (tcp_ip6_spec; nfc only) */ |
| 1371 | #define UDP_V6_FLOW 0x06 /* hash only */ | 1537 | #define UDP_V6_FLOW 0x06 /* hash or spec (udp_ip6_spec; nfc only) */ |
| 1372 | #define SCTP_V6_FLOW 0x07 /* hash only */ | 1538 | #define SCTP_V6_FLOW 0x07 /* hash or spec (sctp_ip6_spec; nfc only) */ |
| 1373 | #define AH_ESP_V6_FLOW 0x08 /* hash only */ | 1539 | #define AH_ESP_V6_FLOW 0x08 /* hash only */ |
| 1374 | #define AH_V4_FLOW 0x09 /* hash or spec (ah_ip4_spec) */ | 1540 | #define AH_V4_FLOW 0x09 /* hash or spec (ah_ip4_spec) */ |
| 1375 | #define ESP_V4_FLOW 0x0a /* hash or spec (esp_ip4_spec) */ | 1541 | #define ESP_V4_FLOW 0x0a /* hash or spec (esp_ip4_spec) */ |
| 1376 | #define AH_V6_FLOW 0x0b /* hash only */ | 1542 | #define AH_V6_FLOW 0x0b /* hash or spec (ah_ip6_spec; nfc only) */ |
| 1377 | #define ESP_V6_FLOW 0x0c /* hash only */ | 1543 | #define ESP_V6_FLOW 0x0c /* hash or spec (esp_ip6_spec; nfc only) */ |
| 1378 | #define IP_USER_FLOW 0x0d /* spec only (usr_ip4_spec) */ | 1544 | #define IPV4_USER_FLOW 0x0d /* spec only (usr_ip4_spec) */ |
| 1545 | #define IP_USER_FLOW IPV4_USER_FLOW | ||
| 1546 | #define IPV6_USER_FLOW 0x0e /* spec only (usr_ip6_spec; nfc only) */ | ||
| 1379 | #define IPV4_FLOW 0x10 /* hash only */ | 1547 | #define IPV4_FLOW 0x10 /* hash only */ |
| 1380 | #define IPV6_FLOW 0x11 /* hash only */ | 1548 | #define IPV6_FLOW 0x11 /* hash only */ |
| 1381 | #define ETHER_FLOW 0x12 /* spec only (ether_spec) */ | 1549 | #define ETHER_FLOW 0x12 /* spec only (ether_spec) */ |
| @@ -1441,4 +1609,123 @@ enum ethtool_reset_flags { | |||
| 1441 | }; | 1609 | }; |
| 1442 | #define ETH_RESET_SHARED_SHIFT 16 | 1610 | #define ETH_RESET_SHARED_SHIFT 16 |
| 1443 | 1611 | ||
| 1612 | |||
| 1613 | /** | ||
| 1614 | * struct ethtool_link_settings - link control and status | ||
| 1615 | * | ||
| 1616 | * IMPORTANT, Backward compatibility notice: When implementing new | ||
| 1617 | * user-space tools, please first try %ETHTOOL_GLINKSETTINGS, and | ||
| 1618 | * if it succeeds use %ETHTOOL_SLINKSETTINGS to change link | ||
| 1619 | * settings; do not use %ETHTOOL_SSET if %ETHTOOL_GLINKSETTINGS | ||
| 1620 | * succeeded: stick to %ETHTOOL_GLINKSETTINGS/%SLINKSETTINGS in | ||
| 1621 | * that case. Conversely, if %ETHTOOL_GLINKSETTINGS fails, use | ||
| 1622 | * %ETHTOOL_GSET to query and %ETHTOOL_SSET to change link | ||
| 1623 | * settings; do not use %ETHTOOL_SLINKSETTINGS if | ||
| 1624 | * %ETHTOOL_GLINKSETTINGS failed: stick to | ||
| 1625 | * %ETHTOOL_GSET/%ETHTOOL_SSET in that case. | ||
| 1626 | * | ||
| 1627 | * @cmd: Command number = %ETHTOOL_GLINKSETTINGS or %ETHTOOL_SLINKSETTINGS | ||
| 1628 | * @speed: Link speed (Mbps) | ||
| 1629 | * @duplex: Duplex mode; one of %DUPLEX_* | ||
| 1630 | * @port: Physical connector type; one of %PORT_* | ||
| 1631 | * @phy_address: MDIO address of PHY (transceiver); 0 or 255 if not | ||
| 1632 | * applicable. For clause 45 PHYs this is the PRTAD. | ||
| 1633 | * @autoneg: Enable/disable autonegotiation and auto-detection; | ||
| 1634 | * either %AUTONEG_DISABLE or %AUTONEG_ENABLE | ||
| 1635 | * @mdio_support: Bitmask of %ETH_MDIO_SUPPORTS_* flags for the MDIO | ||
| 1636 | * protocols supported by the interface; 0 if unknown. | ||
| 1637 | * Read-only. | ||
| 1638 | * @eth_tp_mdix: Ethernet twisted-pair MDI(-X) status; one of | ||
| 1639 | * %ETH_TP_MDI_*. If the status is unknown or not applicable, the | ||
| 1640 | * value will be %ETH_TP_MDI_INVALID. Read-only. | ||
| 1641 | * @eth_tp_mdix_ctrl: Ethernet twisted pair MDI(-X) control; one of | ||
| 1642 | * %ETH_TP_MDI_*. If MDI(-X) control is not implemented, reads | ||
| 1643 | * yield %ETH_TP_MDI_INVALID and writes may be ignored or rejected. | ||
| 1644 | * When written successfully, the link should be renegotiated if | ||
| 1645 | * necessary. | ||
| 1646 | * @link_mode_masks_nwords: Number of 32-bit words for each of the | ||
| 1647 | * supported, advertising, lp_advertising link mode bitmaps. For | ||
| 1648 | * %ETHTOOL_GLINKSETTINGS: on entry, number of words passed by user | ||
| 1649 | * (>= 0); on return, if handshake in progress, negative if | ||
| 1650 | * request size unsupported by kernel: absolute value indicates | ||
| 1651 | * kernel recommended size and cmd field is 0, as well as all the | ||
| 1652 | * other fields; otherwise (handshake completed), strictly | ||
| 1653 | * positive to indicate size used by kernel and cmd field is | ||
| 1654 | * %ETHTOOL_GLINKSETTINGS, all other fields populated by driver. For | ||
| 1655 | * %ETHTOOL_SLINKSETTINGS: must be valid on entry, ie. a positive | ||
| 1656 | * value returned previously by %ETHTOOL_GLINKSETTINGS, otherwise | ||
| 1657 | * refused. For drivers: ignore this field (use kernel's | ||
| 1658 | * __ETHTOOL_LINK_MODE_MASK_NBITS instead), any change to it will | ||
| 1659 | * be overwritten by kernel. | ||
| 1660 | * @supported: Bitmap with each bit meaning given by | ||
| 1661 | * %ethtool_link_mode_bit_indices for the link modes, physical | ||
| 1662 | * connectors and other link features for which the interface | ||
| 1663 | * supports autonegotiation or auto-detection. Read-only. | ||
| 1664 | * @advertising: Bitmap with each bit meaning given by | ||
| 1665 | * %ethtool_link_mode_bit_indices for the link modes, physical | ||
| 1666 | * connectors and other link features that are advertised through | ||
| 1667 | * autonegotiation or enabled for auto-detection. | ||
| 1668 | * @lp_advertising: Bitmap with each bit meaning given by | ||
| 1669 | * %ethtool_link_mode_bit_indices for the link modes, and other | ||
| 1670 | * link features that the link partner advertised through | ||
| 1671 | * autonegotiation; 0 if unknown or not applicable. Read-only. | ||
| 1672 | * | ||
| 1673 | * If autonegotiation is disabled, the speed and @duplex represent the | ||
| 1674 | * fixed link mode and are writable if the driver supports multiple | ||
| 1675 | * link modes. If it is enabled then they are read-only; if the link | ||
| 1676 | * is up they represent the negotiated link mode; if the link is down, | ||
| 1677 | * the speed is 0, %SPEED_UNKNOWN or the highest enabled speed and | ||
| 1678 | * @duplex is %DUPLEX_UNKNOWN or the best enabled duplex mode. | ||
| 1679 | * | ||
| 1680 | * Some hardware interfaces may have multiple PHYs and/or physical | ||
| 1681 | * connectors fitted or do not allow the driver to detect which are | ||
| 1682 | * fitted. For these interfaces @port and/or @phy_address may be | ||
| 1683 | * writable, possibly dependent on @autoneg being %AUTONEG_DISABLE. | ||
| 1684 | * Otherwise, attempts to write different values may be ignored or | ||
| 1685 | * rejected. | ||
| 1686 | * | ||
| 1687 | * Deprecated %ethtool_cmd fields transceiver, maxtxpkt and maxrxpkt | ||
| 1688 | * are not available in %ethtool_link_settings. Until all drivers are | ||
| 1689 | * converted to ignore them or to the new %ethtool_link_settings API, | ||
| 1690 | * for both queries and changes, users should always try | ||
| 1691 | * %ETHTOOL_GLINKSETTINGS first, and if it fails with -ENOTSUPP stick | ||
| 1692 | * only to %ETHTOOL_GSET and %ETHTOOL_SSET consistently. If it | ||
| 1693 | * succeeds, then users should stick to %ETHTOOL_GLINKSETTINGS and | ||
| 1694 | * %ETHTOOL_SLINKSETTINGS (which would support drivers implementing | ||
| 1695 | * either %ethtool_cmd or %ethtool_link_settings). | ||
| 1696 | * | ||
| 1697 | * Users should assume that all fields not marked read-only are | ||
| 1698 | * writable and subject to validation by the driver. They should use | ||
| 1699 | * %ETHTOOL_GLINKSETTINGS to get the current values before making specific | ||
| 1700 | * changes and then applying them with %ETHTOOL_SLINKSETTINGS. | ||
| 1701 | * | ||
| 1702 | * Drivers that implement %get_link_ksettings and/or | ||
| 1703 | * %set_link_ksettings should ignore the @cmd | ||
| 1704 | * and @link_mode_masks_nwords fields (any change to them overwritten | ||
| 1705 | * by kernel), and rely only on kernel's internal | ||
| 1706 | * %__ETHTOOL_LINK_MODE_MASK_NBITS and | ||
| 1707 | * %ethtool_link_mode_mask_t. Drivers that implement | ||
| 1708 | * %set_link_ksettings() should validate all fields other than @cmd | ||
| 1709 | * and @link_mode_masks_nwords that are not described as read-only or | ||
| 1710 | * deprecated, and must ignore all fields described as read-only. | ||
| 1711 | */ | ||
| 1712 | struct ethtool_link_settings { | ||
| 1713 | __u32 cmd; | ||
| 1714 | __u32 speed; | ||
| 1715 | __u8 duplex; | ||
| 1716 | __u8 port; | ||
| 1717 | __u8 phy_address; | ||
| 1718 | __u8 autoneg; | ||
| 1719 | __u8 mdio_support; | ||
| 1720 | __u8 eth_tp_mdix; | ||
| 1721 | __u8 eth_tp_mdix_ctrl; | ||
| 1722 | __s8 link_mode_masks_nwords; | ||
| 1723 | __u32 reserved[8]; | ||
| 1724 | __u32 link_mode_masks[0]; | ||
| 1725 | /* layout of link_mode_masks fields: | ||
| 1726 | * __u32 map_supported[link_mode_masks_nwords]; | ||
| 1727 | * __u32 map_advertising[link_mode_masks_nwords]; | ||
| 1728 | * __u32 map_lp_advertising[link_mode_masks_nwords]; | ||
| 1729 | */ | ||
| 1730 | }; | ||
| 1444 | #endif /* _UAPI_LINUX_ETHTOOL_H */ | 1731 | #endif /* _UAPI_LINUX_ETHTOOL_H */ |
diff --git a/include/uapi/linux/genetlink.h b/include/uapi/linux/genetlink.h index c3363ba1ae05..5512c90af7e3 100644 --- a/include/uapi/linux/genetlink.h +++ b/include/uapi/linux/genetlink.h | |||
| @@ -21,6 +21,7 @@ struct genlmsghdr { | |||
| 21 | #define GENL_CMD_CAP_DO 0x02 | 21 | #define GENL_CMD_CAP_DO 0x02 |
| 22 | #define GENL_CMD_CAP_DUMP 0x04 | 22 | #define GENL_CMD_CAP_DUMP 0x04 |
| 23 | #define GENL_CMD_CAP_HASPOL 0x08 | 23 | #define GENL_CMD_CAP_HASPOL 0x08 |
| 24 | #define GENL_UNS_ADMIN_PERM 0x10 | ||
| 24 | 25 | ||
| 25 | /* | 26 | /* |
| 26 | * List of reserved static generic netlink identifiers: | 27 | * List of reserved static generic netlink identifiers: |
diff --git a/include/uapi/linux/if.h b/include/uapi/linux/if.h index 9cf2394f0bcf..f80277569f24 100644 --- a/include/uapi/linux/if.h +++ b/include/uapi/linux/if.h | |||
| @@ -37,7 +37,7 @@ | |||
| 37 | * are shared for all types of net_devices. The sysfs entries are available | 37 | * are shared for all types of net_devices. The sysfs entries are available |
| 38 | * via /sys/class/net/<dev>/flags. Flags which can be toggled through sysfs | 38 | * via /sys/class/net/<dev>/flags. Flags which can be toggled through sysfs |
| 39 | * are annotated below, note that only a few flags can be toggled and some | 39 | * are annotated below, note that only a few flags can be toggled and some |
| 40 | * other flags are always always preserved from the original net_device flags | 40 | * other flags are always preserved from the original net_device flags |
| 41 | * even if you try to set them via sysfs. Flags which are always preserved | 41 | * even if you try to set them via sysfs. Flags which are always preserved |
| 42 | * are kept under the flag grouping @IFF_VOLATILE. Flags which are volatile | 42 | * are kept under the flag grouping @IFF_VOLATILE. Flags which are volatile |
| 43 | * are annotated below as such. | 43 | * are annotated below as such. |
diff --git a/include/uapi/linux/if_bridge.h b/include/uapi/linux/if_bridge.h index 18db14477bdd..0536eefff9bf 100644 --- a/include/uapi/linux/if_bridge.h +++ b/include/uapi/linux/if_bridge.h | |||
| @@ -137,11 +137,17 @@ struct bridge_vlan_info { | |||
| 137 | /* Bridge multicast database attributes | 137 | /* Bridge multicast database attributes |
| 138 | * [MDBA_MDB] = { | 138 | * [MDBA_MDB] = { |
| 139 | * [MDBA_MDB_ENTRY] = { | 139 | * [MDBA_MDB_ENTRY] = { |
| 140 | * [MDBA_MDB_ENTRY_INFO] | 140 | * [MDBA_MDB_ENTRY_INFO] { |
| 141 | * struct br_mdb_entry | ||
| 142 | * [MDBA_MDB_EATTR attributes] | ||
| 143 | * } | ||
| 141 | * } | 144 | * } |
| 142 | * } | 145 | * } |
| 143 | * [MDBA_ROUTER] = { | 146 | * [MDBA_ROUTER] = { |
| 144 | * [MDBA_ROUTER_PORT] | 147 | * [MDBA_ROUTER_PORT] = { |
| 148 | * u32 ifindex | ||
| 149 | * [MDBA_ROUTER_PATTR attributes] | ||
| 150 | * } | ||
| 145 | * } | 151 | * } |
| 146 | */ | 152 | */ |
| 147 | enum { | 153 | enum { |
| @@ -166,6 +172,22 @@ enum { | |||
| 166 | }; | 172 | }; |
| 167 | #define MDBA_MDB_ENTRY_MAX (__MDBA_MDB_ENTRY_MAX - 1) | 173 | #define MDBA_MDB_ENTRY_MAX (__MDBA_MDB_ENTRY_MAX - 1) |
| 168 | 174 | ||
| 175 | /* per mdb entry additional attributes */ | ||
| 176 | enum { | ||
| 177 | MDBA_MDB_EATTR_UNSPEC, | ||
| 178 | MDBA_MDB_EATTR_TIMER, | ||
| 179 | __MDBA_MDB_EATTR_MAX | ||
| 180 | }; | ||
| 181 | #define MDBA_MDB_EATTR_MAX (__MDBA_MDB_EATTR_MAX - 1) | ||
| 182 | |||
| 183 | /* multicast router types */ | ||
| 184 | enum { | ||
| 185 | MDB_RTR_TYPE_DISABLED, | ||
| 186 | MDB_RTR_TYPE_TEMP_QUERY, | ||
| 187 | MDB_RTR_TYPE_PERM, | ||
| 188 | MDB_RTR_TYPE_TEMP | ||
| 189 | }; | ||
| 190 | |||
| 169 | enum { | 191 | enum { |
| 170 | MDBA_ROUTER_UNSPEC, | 192 | MDBA_ROUTER_UNSPEC, |
| 171 | MDBA_ROUTER_PORT, | 193 | MDBA_ROUTER_PORT, |
| @@ -173,6 +195,15 @@ enum { | |||
| 173 | }; | 195 | }; |
| 174 | #define MDBA_ROUTER_MAX (__MDBA_ROUTER_MAX - 1) | 196 | #define MDBA_ROUTER_MAX (__MDBA_ROUTER_MAX - 1) |
| 175 | 197 | ||
| 198 | /* router port attributes */ | ||
| 199 | enum { | ||
| 200 | MDBA_ROUTER_PATTR_UNSPEC, | ||
| 201 | MDBA_ROUTER_PATTR_TIMER, | ||
| 202 | MDBA_ROUTER_PATTR_TYPE, | ||
| 203 | __MDBA_ROUTER_PATTR_MAX | ||
| 204 | }; | ||
| 205 | #define MDBA_ROUTER_PATTR_MAX (__MDBA_ROUTER_PATTR_MAX - 1) | ||
| 206 | |||
| 176 | struct br_port_msg { | 207 | struct br_port_msg { |
| 177 | __u8 family; | 208 | __u8 family; |
| 178 | __u32 ifindex; | 209 | __u32 ifindex; |
| @@ -183,6 +214,8 @@ struct br_mdb_entry { | |||
| 183 | #define MDB_TEMPORARY 0 | 214 | #define MDB_TEMPORARY 0 |
| 184 | #define MDB_PERMANENT 1 | 215 | #define MDB_PERMANENT 1 |
| 185 | __u8 state; | 216 | __u8 state; |
| 217 | #define MDB_FLAGS_OFFLOAD (1 << 0) | ||
| 218 | __u8 flags; | ||
| 186 | __u16 vid; | 219 | __u16 vid; |
| 187 | struct { | 220 | struct { |
| 188 | union { | 221 | union { |
diff --git a/include/uapi/linux/if_ether.h b/include/uapi/linux/if_ether.h index ea9221b0331a..4a93051c578c 100644 --- a/include/uapi/linux/if_ether.h +++ b/include/uapi/linux/if_ether.h | |||
| @@ -83,6 +83,7 @@ | |||
| 83 | #define ETH_P_8021AD 0x88A8 /* 802.1ad Service VLAN */ | 83 | #define ETH_P_8021AD 0x88A8 /* 802.1ad Service VLAN */ |
| 84 | #define ETH_P_802_EX1 0x88B5 /* 802.1 Local Experimental 1. */ | 84 | #define ETH_P_802_EX1 0x88B5 /* 802.1 Local Experimental 1. */ |
| 85 | #define ETH_P_TIPC 0x88CA /* TIPC */ | 85 | #define ETH_P_TIPC 0x88CA /* TIPC */ |
| 86 | #define ETH_P_MACSEC 0x88E5 /* 802.1ae MACsec */ | ||
| 86 | #define ETH_P_8021AH 0x88E7 /* 802.1ah Backbone Service Tag */ | 87 | #define ETH_P_8021AH 0x88E7 /* 802.1ah Backbone Service Tag */ |
| 87 | #define ETH_P_MVRP 0x88F5 /* 802.1Q MVRP */ | 88 | #define ETH_P_MVRP 0x88F5 /* 802.1Q MVRP */ |
| 88 | #define ETH_P_1588 0x88F7 /* IEEE 1588 Timesync */ | 89 | #define ETH_P_1588 0x88F7 /* IEEE 1588 Timesync */ |
diff --git a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h index a30b78090594..8e3f88fa5b59 100644 --- a/include/uapi/linux/if_link.h +++ b/include/uapi/linux/if_link.h | |||
| @@ -35,6 +35,8 @@ struct rtnl_link_stats { | |||
| 35 | /* for cslip etc */ | 35 | /* for cslip etc */ |
| 36 | __u32 rx_compressed; | 36 | __u32 rx_compressed; |
| 37 | __u32 tx_compressed; | 37 | __u32 tx_compressed; |
| 38 | |||
| 39 | __u32 rx_nohandler; /* dropped, no handler found */ | ||
| 38 | }; | 40 | }; |
| 39 | 41 | ||
| 40 | /* The main device statistics structure */ | 42 | /* The main device statistics structure */ |
| @@ -68,6 +70,8 @@ struct rtnl_link_stats64 { | |||
| 68 | /* for cslip etc */ | 70 | /* for cslip etc */ |
| 69 | __u64 rx_compressed; | 71 | __u64 rx_compressed; |
| 70 | __u64 tx_compressed; | 72 | __u64 tx_compressed; |
| 73 | |||
| 74 | __u64 rx_nohandler; /* dropped, no handler found */ | ||
| 71 | }; | 75 | }; |
| 72 | 76 | ||
| 73 | /* The struct should be in sync with struct ifmap */ | 77 | /* The struct should be in sync with struct ifmap */ |
| @@ -401,6 +405,43 @@ enum { | |||
| 401 | 405 | ||
| 402 | #define IFLA_VRF_MAX (__IFLA_VRF_MAX - 1) | 406 | #define IFLA_VRF_MAX (__IFLA_VRF_MAX - 1) |
| 403 | 407 | ||
| 408 | enum { | ||
| 409 | IFLA_VRF_PORT_UNSPEC, | ||
| 410 | IFLA_VRF_PORT_TABLE, | ||
| 411 | __IFLA_VRF_PORT_MAX | ||
| 412 | }; | ||
| 413 | |||
| 414 | #define IFLA_VRF_PORT_MAX (__IFLA_VRF_PORT_MAX - 1) | ||
| 415 | |||
| 416 | /* MACSEC section */ | ||
| 417 | enum { | ||
| 418 | IFLA_MACSEC_UNSPEC, | ||
| 419 | IFLA_MACSEC_SCI, | ||
| 420 | IFLA_MACSEC_PORT, | ||
| 421 | IFLA_MACSEC_ICV_LEN, | ||
| 422 | IFLA_MACSEC_CIPHER_SUITE, | ||
| 423 | IFLA_MACSEC_WINDOW, | ||
| 424 | IFLA_MACSEC_ENCODING_SA, | ||
| 425 | IFLA_MACSEC_ENCRYPT, | ||
| 426 | IFLA_MACSEC_PROTECT, | ||
| 427 | IFLA_MACSEC_INC_SCI, | ||
| 428 | IFLA_MACSEC_ES, | ||
| 429 | IFLA_MACSEC_SCB, | ||
| 430 | IFLA_MACSEC_REPLAY_PROTECT, | ||
| 431 | IFLA_MACSEC_VALIDATION, | ||
| 432 | __IFLA_MACSEC_MAX, | ||
| 433 | }; | ||
| 434 | |||
| 435 | #define IFLA_MACSEC_MAX (__IFLA_MACSEC_MAX - 1) | ||
| 436 | |||
| 437 | enum macsec_validation_type { | ||
| 438 | MACSEC_VALIDATE_DISABLED = 0, | ||
| 439 | MACSEC_VALIDATE_CHECK = 1, | ||
| 440 | MACSEC_VALIDATE_STRICT = 2, | ||
| 441 | __MACSEC_VALIDATE_END, | ||
| 442 | MACSEC_VALIDATE_MAX = __MACSEC_VALIDATE_END - 1, | ||
| 443 | }; | ||
| 444 | |||
| 404 | /* IPVLAN section */ | 445 | /* IPVLAN section */ |
| 405 | enum { | 446 | enum { |
| 406 | IFLA_IPVLAN_UNSPEC, | 447 | IFLA_IPVLAN_UNSPEC, |
| @@ -444,6 +485,7 @@ enum { | |||
| 444 | IFLA_VXLAN_GBP, | 485 | IFLA_VXLAN_GBP, |
| 445 | IFLA_VXLAN_REMCSUM_NOPARTIAL, | 486 | IFLA_VXLAN_REMCSUM_NOPARTIAL, |
| 446 | IFLA_VXLAN_COLLECT_METADATA, | 487 | IFLA_VXLAN_COLLECT_METADATA, |
| 488 | IFLA_VXLAN_LABEL, | ||
| 447 | __IFLA_VXLAN_MAX | 489 | __IFLA_VXLAN_MAX |
| 448 | }; | 490 | }; |
| 449 | #define IFLA_VXLAN_MAX (__IFLA_VXLAN_MAX - 1) | 491 | #define IFLA_VXLAN_MAX (__IFLA_VXLAN_MAX - 1) |
| @@ -466,6 +508,7 @@ enum { | |||
| 466 | IFLA_GENEVE_UDP_CSUM, | 508 | IFLA_GENEVE_UDP_CSUM, |
| 467 | IFLA_GENEVE_UDP_ZERO_CSUM6_TX, | 509 | IFLA_GENEVE_UDP_ZERO_CSUM6_TX, |
| 468 | IFLA_GENEVE_UDP_ZERO_CSUM6_RX, | 510 | IFLA_GENEVE_UDP_ZERO_CSUM6_RX, |
| 511 | IFLA_GENEVE_LABEL, | ||
| 469 | __IFLA_GENEVE_MAX | 512 | __IFLA_GENEVE_MAX |
| 470 | }; | 513 | }; |
| 471 | #define IFLA_GENEVE_MAX (__IFLA_GENEVE_MAX - 1) | 514 | #define IFLA_GENEVE_MAX (__IFLA_GENEVE_MAX - 1) |
diff --git a/include/uapi/linux/if_macsec.h b/include/uapi/linux/if_macsec.h new file mode 100644 index 000000000000..26b0d1e3e3e7 --- /dev/null +++ b/include/uapi/linux/if_macsec.h | |||
| @@ -0,0 +1,161 @@ | |||
| 1 | /* | ||
| 2 | * include/uapi/linux/if_macsec.h - MACsec device | ||
| 3 | * | ||
| 4 | * Copyright (c) 2015 Sabrina Dubroca <sd@queasysnail.net> | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License as published by | ||
| 8 | * the Free Software Foundation; either version 2 of the License, or | ||
| 9 | * (at your option) any later version. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef _UAPI_MACSEC_H | ||
| 13 | #define _UAPI_MACSEC_H | ||
| 14 | |||
| 15 | #include <linux/types.h> | ||
| 16 | |||
| 17 | #define MACSEC_GENL_NAME "macsec" | ||
| 18 | #define MACSEC_GENL_VERSION 1 | ||
| 19 | |||
| 20 | #define MACSEC_MAX_KEY_LEN 128 | ||
| 21 | |||
| 22 | #define DEFAULT_CIPHER_ID 0x0080020001000001ULL | ||
| 23 | #define DEFAULT_CIPHER_ALT 0x0080C20001000001ULL | ||
| 24 | |||
| 25 | #define MACSEC_MIN_ICV_LEN 8 | ||
| 26 | #define MACSEC_MAX_ICV_LEN 32 | ||
| 27 | |||
| 28 | enum macsec_attrs { | ||
| 29 | MACSEC_ATTR_UNSPEC, | ||
| 30 | MACSEC_ATTR_IFINDEX, /* u32, ifindex of the MACsec netdevice */ | ||
| 31 | MACSEC_ATTR_RXSC_CONFIG, /* config, nested macsec_rxsc_attrs */ | ||
| 32 | MACSEC_ATTR_SA_CONFIG, /* config, nested macsec_sa_attrs */ | ||
| 33 | MACSEC_ATTR_SECY, /* dump, nested macsec_secy_attrs */ | ||
| 34 | MACSEC_ATTR_TXSA_LIST, /* dump, nested, macsec_sa_attrs for each TXSA */ | ||
| 35 | MACSEC_ATTR_RXSC_LIST, /* dump, nested, macsec_rxsc_attrs for each RXSC */ | ||
| 36 | MACSEC_ATTR_TXSC_STATS, /* dump, nested, macsec_txsc_stats_attr */ | ||
| 37 | MACSEC_ATTR_SECY_STATS, /* dump, nested, macsec_secy_stats_attr */ | ||
| 38 | __MACSEC_ATTR_END, | ||
| 39 | NUM_MACSEC_ATTR = __MACSEC_ATTR_END, | ||
| 40 | MACSEC_ATTR_MAX = __MACSEC_ATTR_END - 1, | ||
| 41 | }; | ||
| 42 | |||
| 43 | enum macsec_secy_attrs { | ||
| 44 | MACSEC_SECY_ATTR_UNSPEC, | ||
| 45 | MACSEC_SECY_ATTR_SCI, | ||
| 46 | MACSEC_SECY_ATTR_ENCODING_SA, | ||
| 47 | MACSEC_SECY_ATTR_WINDOW, | ||
| 48 | MACSEC_SECY_ATTR_CIPHER_SUITE, | ||
| 49 | MACSEC_SECY_ATTR_ICV_LEN, | ||
| 50 | MACSEC_SECY_ATTR_PROTECT, | ||
| 51 | MACSEC_SECY_ATTR_REPLAY, | ||
| 52 | MACSEC_SECY_ATTR_OPER, | ||
| 53 | MACSEC_SECY_ATTR_VALIDATE, | ||
| 54 | MACSEC_SECY_ATTR_ENCRYPT, | ||
| 55 | MACSEC_SECY_ATTR_INC_SCI, | ||
| 56 | MACSEC_SECY_ATTR_ES, | ||
| 57 | MACSEC_SECY_ATTR_SCB, | ||
| 58 | __MACSEC_SECY_ATTR_END, | ||
| 59 | NUM_MACSEC_SECY_ATTR = __MACSEC_SECY_ATTR_END, | ||
| 60 | MACSEC_SECY_ATTR_MAX = __MACSEC_SECY_ATTR_END - 1, | ||
| 61 | }; | ||
| 62 | |||
| 63 | enum macsec_rxsc_attrs { | ||
| 64 | MACSEC_RXSC_ATTR_UNSPEC, | ||
| 65 | MACSEC_RXSC_ATTR_SCI, /* config/dump, u64 */ | ||
| 66 | MACSEC_RXSC_ATTR_ACTIVE, /* config/dump, u8 0..1 */ | ||
| 67 | MACSEC_RXSC_ATTR_SA_LIST, /* dump, nested */ | ||
| 68 | MACSEC_RXSC_ATTR_STATS, /* dump, nested, macsec_rxsc_stats_attr */ | ||
| 69 | __MACSEC_RXSC_ATTR_END, | ||
| 70 | NUM_MACSEC_RXSC_ATTR = __MACSEC_RXSC_ATTR_END, | ||
| 71 | MACSEC_RXSC_ATTR_MAX = __MACSEC_RXSC_ATTR_END - 1, | ||
| 72 | }; | ||
| 73 | |||
| 74 | enum macsec_sa_attrs { | ||
| 75 | MACSEC_SA_ATTR_UNSPEC, | ||
| 76 | MACSEC_SA_ATTR_AN, /* config/dump, u8 0..3 */ | ||
| 77 | MACSEC_SA_ATTR_ACTIVE, /* config/dump, u8 0..1 */ | ||
| 78 | MACSEC_SA_ATTR_PN, /* config/dump, u32 */ | ||
| 79 | MACSEC_SA_ATTR_KEY, /* config, data */ | ||
| 80 | MACSEC_SA_ATTR_KEYID, /* config/dump, u64 */ | ||
| 81 | MACSEC_SA_ATTR_STATS, /* dump, nested, macsec_sa_stats_attr */ | ||
| 82 | __MACSEC_SA_ATTR_END, | ||
| 83 | NUM_MACSEC_SA_ATTR = __MACSEC_SA_ATTR_END, | ||
| 84 | MACSEC_SA_ATTR_MAX = __MACSEC_SA_ATTR_END - 1, | ||
| 85 | }; | ||
| 86 | |||
| 87 | enum macsec_nl_commands { | ||
| 88 | MACSEC_CMD_GET_TXSC, | ||
| 89 | MACSEC_CMD_ADD_RXSC, | ||
| 90 | MACSEC_CMD_DEL_RXSC, | ||
| 91 | MACSEC_CMD_UPD_RXSC, | ||
| 92 | MACSEC_CMD_ADD_TXSA, | ||
| 93 | MACSEC_CMD_DEL_TXSA, | ||
| 94 | MACSEC_CMD_UPD_TXSA, | ||
| 95 | MACSEC_CMD_ADD_RXSA, | ||
| 96 | MACSEC_CMD_DEL_RXSA, | ||
| 97 | MACSEC_CMD_UPD_RXSA, | ||
| 98 | }; | ||
| 99 | |||
| 100 | /* u64 per-RXSC stats */ | ||
| 101 | enum macsec_rxsc_stats_attr { | ||
| 102 | MACSEC_RXSC_STATS_ATTR_UNSPEC, | ||
| 103 | MACSEC_RXSC_STATS_ATTR_IN_OCTETS_VALIDATED, | ||
| 104 | MACSEC_RXSC_STATS_ATTR_IN_OCTETS_DECRYPTED, | ||
| 105 | MACSEC_RXSC_STATS_ATTR_IN_PKTS_UNCHECKED, | ||
| 106 | MACSEC_RXSC_STATS_ATTR_IN_PKTS_DELAYED, | ||
| 107 | MACSEC_RXSC_STATS_ATTR_IN_PKTS_OK, | ||
| 108 | MACSEC_RXSC_STATS_ATTR_IN_PKTS_INVALID, | ||
| 109 | MACSEC_RXSC_STATS_ATTR_IN_PKTS_LATE, | ||
| 110 | MACSEC_RXSC_STATS_ATTR_IN_PKTS_NOT_VALID, | ||
| 111 | MACSEC_RXSC_STATS_ATTR_IN_PKTS_NOT_USING_SA, | ||
| 112 | MACSEC_RXSC_STATS_ATTR_IN_PKTS_UNUSED_SA, | ||
| 113 | __MACSEC_RXSC_STATS_ATTR_END, | ||
| 114 | NUM_MACSEC_RXSC_STATS_ATTR = __MACSEC_RXSC_STATS_ATTR_END, | ||
| 115 | MACSEC_RXSC_STATS_ATTR_MAX = __MACSEC_RXSC_STATS_ATTR_END - 1, | ||
| 116 | }; | ||
| 117 | |||
| 118 | /* u32 per-{RX,TX}SA stats */ | ||
| 119 | enum macsec_sa_stats_attr { | ||
| 120 | MACSEC_SA_STATS_ATTR_UNSPEC, | ||
| 121 | MACSEC_SA_STATS_ATTR_IN_PKTS_OK, | ||
| 122 | MACSEC_SA_STATS_ATTR_IN_PKTS_INVALID, | ||
| 123 | MACSEC_SA_STATS_ATTR_IN_PKTS_NOT_VALID, | ||
| 124 | MACSEC_SA_STATS_ATTR_IN_PKTS_NOT_USING_SA, | ||
| 125 | MACSEC_SA_STATS_ATTR_IN_PKTS_UNUSED_SA, | ||
| 126 | MACSEC_SA_STATS_ATTR_OUT_PKTS_PROTECTED, | ||
| 127 | MACSEC_SA_STATS_ATTR_OUT_PKTS_ENCRYPTED, | ||
| 128 | __MACSEC_SA_STATS_ATTR_END, | ||
| 129 | NUM_MACSEC_SA_STATS_ATTR = __MACSEC_SA_STATS_ATTR_END, | ||
| 130 | MACSEC_SA_STATS_ATTR_MAX = __MACSEC_SA_STATS_ATTR_END - 1, | ||
| 131 | }; | ||
| 132 | |||
| 133 | /* u64 per-TXSC stats */ | ||
| 134 | enum macsec_txsc_stats_attr { | ||
| 135 | MACSEC_TXSC_STATS_ATTR_UNSPEC, | ||
| 136 | MACSEC_TXSC_STATS_ATTR_OUT_PKTS_PROTECTED, | ||
| 137 | MACSEC_TXSC_STATS_ATTR_OUT_PKTS_ENCRYPTED, | ||
| 138 | MACSEC_TXSC_STATS_ATTR_OUT_OCTETS_PROTECTED, | ||
| 139 | MACSEC_TXSC_STATS_ATTR_OUT_OCTETS_ENCRYPTED, | ||
| 140 | __MACSEC_TXSC_STATS_ATTR_END, | ||
| 141 | NUM_MACSEC_TXSC_STATS_ATTR = __MACSEC_TXSC_STATS_ATTR_END, | ||
| 142 | MACSEC_TXSC_STATS_ATTR_MAX = __MACSEC_TXSC_STATS_ATTR_END - 1, | ||
| 143 | }; | ||
| 144 | |||
| 145 | /* u64 per-SecY stats */ | ||
| 146 | enum macsec_secy_stats_attr { | ||
| 147 | MACSEC_SECY_STATS_ATTR_UNSPEC, | ||
| 148 | MACSEC_SECY_STATS_ATTR_OUT_PKTS_UNTAGGED, | ||
| 149 | MACSEC_SECY_STATS_ATTR_IN_PKTS_UNTAGGED, | ||
| 150 | MACSEC_SECY_STATS_ATTR_OUT_PKTS_TOO_LONG, | ||
| 151 | MACSEC_SECY_STATS_ATTR_IN_PKTS_NO_TAG, | ||
| 152 | MACSEC_SECY_STATS_ATTR_IN_PKTS_BAD_TAG, | ||
| 153 | MACSEC_SECY_STATS_ATTR_IN_PKTS_UNKNOWN_SCI, | ||
| 154 | MACSEC_SECY_STATS_ATTR_IN_PKTS_NO_SCI, | ||
| 155 | MACSEC_SECY_STATS_ATTR_IN_PKTS_OVERRUN, | ||
| 156 | __MACSEC_SECY_STATS_ATTR_END, | ||
| 157 | NUM_MACSEC_SECY_STATS_ATTR = __MACSEC_SECY_STATS_ATTR_END, | ||
| 158 | MACSEC_SECY_STATS_ATTR_MAX = __MACSEC_SECY_STATS_ATTR_END - 1, | ||
| 159 | }; | ||
| 160 | |||
| 161 | #endif /* _UAPI_MACSEC_H */ | ||
diff --git a/include/uapi/linux/ip.h b/include/uapi/linux/ip.h index 08f894d2ddbd..f291569768dd 100644 --- a/include/uapi/linux/ip.h +++ b/include/uapi/linux/ip.h | |||
| @@ -165,6 +165,8 @@ enum | |||
| 165 | IPV4_DEVCONF_IGMPV2_UNSOLICITED_REPORT_INTERVAL, | 165 | IPV4_DEVCONF_IGMPV2_UNSOLICITED_REPORT_INTERVAL, |
| 166 | IPV4_DEVCONF_IGMPV3_UNSOLICITED_REPORT_INTERVAL, | 166 | IPV4_DEVCONF_IGMPV3_UNSOLICITED_REPORT_INTERVAL, |
| 167 | IPV4_DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN, | 167 | IPV4_DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN, |
| 168 | IPV4_DEVCONF_DROP_UNICAST_IN_L2_MULTICAST, | ||
| 169 | IPV4_DEVCONF_DROP_GRATUITOUS_ARP, | ||
| 168 | __IPV4_DEVCONF_MAX | 170 | __IPV4_DEVCONF_MAX |
| 169 | }; | 171 | }; |
| 170 | 172 | ||
diff --git a/include/uapi/linux/ipv6.h b/include/uapi/linux/ipv6.h index 38b4fef20219..395876060f50 100644 --- a/include/uapi/linux/ipv6.h +++ b/include/uapi/linux/ipv6.h | |||
| @@ -174,6 +174,9 @@ enum { | |||
| 174 | DEVCONF_USE_OIF_ADDRS_ONLY, | 174 | DEVCONF_USE_OIF_ADDRS_ONLY, |
| 175 | DEVCONF_ACCEPT_RA_MIN_HOP_LIMIT, | 175 | DEVCONF_ACCEPT_RA_MIN_HOP_LIMIT, |
| 176 | DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN, | 176 | DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN, |
| 177 | DEVCONF_DROP_UNICAST_IN_L2_MULTICAST, | ||
| 178 | DEVCONF_DROP_UNSOLICITED_NA, | ||
| 179 | DEVCONF_KEEP_ADDR_ON_DOWN, | ||
| 177 | DEVCONF_MAX | 180 | DEVCONF_MAX |
| 178 | }; | 181 | }; |
| 179 | 182 | ||
diff --git a/include/uapi/linux/kcm.h b/include/uapi/linux/kcm.h new file mode 100644 index 000000000000..a5a530940b99 --- /dev/null +++ b/include/uapi/linux/kcm.h | |||
| @@ -0,0 +1,40 @@ | |||
| 1 | /* | ||
| 2 | * Kernel Connection Multiplexor | ||
| 3 | * | ||
| 4 | * Copyright (c) 2016 Tom Herbert <tom@herbertland.com> | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License version 2 | ||
| 8 | * as published by the Free Software Foundation. | ||
| 9 | * | ||
| 10 | * User API to clone KCM sockets and attach transport socket to a KCM | ||
| 11 | * multiplexor. | ||
| 12 | */ | ||
| 13 | |||
| 14 | #ifndef KCM_KERNEL_H | ||
| 15 | #define KCM_KERNEL_H | ||
| 16 | |||
| 17 | struct kcm_attach { | ||
| 18 | int fd; | ||
| 19 | int bpf_fd; | ||
| 20 | }; | ||
| 21 | |||
| 22 | struct kcm_unattach { | ||
| 23 | int fd; | ||
| 24 | }; | ||
| 25 | |||
| 26 | struct kcm_clone { | ||
| 27 | int fd; | ||
| 28 | }; | ||
| 29 | |||
| 30 | #define SIOCKCMATTACH (SIOCPROTOPRIVATE + 0) | ||
| 31 | #define SIOCKCMUNATTACH (SIOCPROTOPRIVATE + 1) | ||
| 32 | #define SIOCKCMCLONE (SIOCPROTOPRIVATE + 2) | ||
| 33 | |||
| 34 | #define KCMPROTO_CONNECTED 0 | ||
| 35 | |||
| 36 | /* Socket options */ | ||
| 37 | #define KCM_RECV_DISABLE 1 | ||
| 38 | |||
| 39 | #endif | ||
| 40 | |||
diff --git a/include/uapi/linux/kernel.h b/include/uapi/linux/kernel.h index 321e399457f5..466073f0ce46 100644 --- a/include/uapi/linux/kernel.h +++ b/include/uapi/linux/kernel.h | |||
| @@ -9,5 +9,6 @@ | |||
| 9 | #define __ALIGN_KERNEL(x, a) __ALIGN_KERNEL_MASK(x, (typeof(x))(a) - 1) | 9 | #define __ALIGN_KERNEL(x, a) __ALIGN_KERNEL_MASK(x, (typeof(x))(a) - 1) |
| 10 | #define __ALIGN_KERNEL_MASK(x, mask) (((x) + (mask)) & ~(mask)) | 10 | #define __ALIGN_KERNEL_MASK(x, mask) (((x) + (mask)) & ~(mask)) |
| 11 | 11 | ||
| 12 | #define __KERNEL_DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) | ||
| 12 | 13 | ||
| 13 | #endif /* _UAPI_LINUX_KERNEL_H */ | 14 | #endif /* _UAPI_LINUX_KERNEL_H */ |
diff --git a/include/uapi/linux/mroute6.h b/include/uapi/linux/mroute6.h index ce91215cf7e6..5062fb5751e1 100644 --- a/include/uapi/linux/mroute6.h +++ b/include/uapi/linux/mroute6.h | |||
| @@ -1,6 +1,7 @@ | |||
| 1 | #ifndef _UAPI__LINUX_MROUTE6_H | 1 | #ifndef _UAPI__LINUX_MROUTE6_H |
| 2 | #define _UAPI__LINUX_MROUTE6_H | 2 | #define _UAPI__LINUX_MROUTE6_H |
| 3 | 3 | ||
| 4 | #include <linux/kernel.h> | ||
| 4 | #include <linux/types.h> | 5 | #include <linux/types.h> |
| 5 | #include <linux/sockios.h> | 6 | #include <linux/sockios.h> |
| 6 | 7 | ||
| @@ -46,14 +47,8 @@ typedef unsigned short mifi_t; | |||
| 46 | typedef __u32 if_mask; | 47 | typedef __u32 if_mask; |
| 47 | #define NIFBITS (sizeof(if_mask) * 8) /* bits per mask */ | 48 | #define NIFBITS (sizeof(if_mask) * 8) /* bits per mask */ |
| 48 | 49 | ||
| 49 | #if !defined(__KERNEL__) | ||
| 50 | #if !defined(DIV_ROUND_UP) | ||
| 51 | #define DIV_ROUND_UP(x,y) (((x) + ((y) - 1)) / (y)) | ||
| 52 | #endif | ||
| 53 | #endif | ||
| 54 | |||
| 55 | typedef struct if_set { | 50 | typedef struct if_set { |
| 56 | if_mask ifs_bits[DIV_ROUND_UP(IF_SETSIZE, NIFBITS)]; | 51 | if_mask ifs_bits[__KERNEL_DIV_ROUND_UP(IF_SETSIZE, NIFBITS)]; |
| 57 | } if_set; | 52 | } if_set; |
| 58 | 53 | ||
| 59 | #define IF_SET(n, p) ((p)->ifs_bits[(n)/NIFBITS] |= (1 << ((n) % NIFBITS))) | 54 | #define IF_SET(n, p) ((p)->ifs_bits[(n)/NIFBITS] |= (1 << ((n) % NIFBITS))) |
diff --git a/include/uapi/linux/netconf.h b/include/uapi/linux/netconf.h index 23cbd34e4ac7..45dfad509c4d 100644 --- a/include/uapi/linux/netconf.h +++ b/include/uapi/linux/netconf.h | |||
| @@ -19,6 +19,7 @@ enum { | |||
| 19 | __NETCONFA_MAX | 19 | __NETCONFA_MAX |
| 20 | }; | 20 | }; |
| 21 | #define NETCONFA_MAX (__NETCONFA_MAX - 1) | 21 | #define NETCONFA_MAX (__NETCONFA_MAX - 1) |
| 22 | #define NETCONFA_ALL -1 | ||
| 22 | 23 | ||
| 23 | #define NETCONFA_IFINDEX_ALL -1 | 24 | #define NETCONFA_IFINDEX_ALL -1 |
| 24 | #define NETCONFA_IFINDEX_DEFAULT -2 | 25 | #define NETCONFA_IFINDEX_DEFAULT -2 |
diff --git a/include/uapi/linux/netfilter/nf_conntrack_common.h b/include/uapi/linux/netfilter/nf_conntrack_common.h index 319f47128db8..6d074d14ee27 100644 --- a/include/uapi/linux/netfilter/nf_conntrack_common.h +++ b/include/uapi/linux/netfilter/nf_conntrack_common.h | |||
| @@ -20,9 +20,15 @@ enum ip_conntrack_info { | |||
| 20 | 20 | ||
| 21 | IP_CT_ESTABLISHED_REPLY = IP_CT_ESTABLISHED + IP_CT_IS_REPLY, | 21 | IP_CT_ESTABLISHED_REPLY = IP_CT_ESTABLISHED + IP_CT_IS_REPLY, |
| 22 | IP_CT_RELATED_REPLY = IP_CT_RELATED + IP_CT_IS_REPLY, | 22 | IP_CT_RELATED_REPLY = IP_CT_RELATED + IP_CT_IS_REPLY, |
| 23 | IP_CT_NEW_REPLY = IP_CT_NEW + IP_CT_IS_REPLY, | 23 | /* No NEW in reply direction. */ |
| 24 | /* Number of distinct IP_CT types (no NEW in reply dirn). */ | 24 | |
| 25 | IP_CT_NUMBER = IP_CT_IS_REPLY * 2 - 1 | 25 | /* Number of distinct IP_CT types. */ |
| 26 | IP_CT_NUMBER, | ||
| 27 | |||
| 28 | /* only for userspace compatibility */ | ||
| 29 | #ifndef __KERNEL__ | ||
| 30 | IP_CT_NEW_REPLY = IP_CT_NUMBER, | ||
| 31 | #endif | ||
| 26 | }; | 32 | }; |
| 27 | 33 | ||
| 28 | #define NF_CT_STATE_INVALID_BIT (1 << 0) | 34 | #define NF_CT_STATE_INVALID_BIT (1 << 0) |
diff --git a/include/uapi/linux/netfilter/nf_tables.h b/include/uapi/linux/netfilter/nf_tables.h index be41ffc128b8..eeffde196f80 100644 --- a/include/uapi/linux/netfilter/nf_tables.h +++ b/include/uapi/linux/netfilter/nf_tables.h | |||
| @@ -681,6 +681,7 @@ enum nft_exthdr_attributes { | |||
| 681 | * @NFT_META_IIFGROUP: packet input interface group | 681 | * @NFT_META_IIFGROUP: packet input interface group |
| 682 | * @NFT_META_OIFGROUP: packet output interface group | 682 | * @NFT_META_OIFGROUP: packet output interface group |
| 683 | * @NFT_META_CGROUP: socket control group (skb->sk->sk_classid) | 683 | * @NFT_META_CGROUP: socket control group (skb->sk->sk_classid) |
| 684 | * @NFT_META_PRANDOM: a 32bit pseudo-random number | ||
| 684 | */ | 685 | */ |
| 685 | enum nft_meta_keys { | 686 | enum nft_meta_keys { |
| 686 | NFT_META_LEN, | 687 | NFT_META_LEN, |
| @@ -707,6 +708,7 @@ enum nft_meta_keys { | |||
| 707 | NFT_META_IIFGROUP, | 708 | NFT_META_IIFGROUP, |
| 708 | NFT_META_OIFGROUP, | 709 | NFT_META_OIFGROUP, |
| 709 | NFT_META_CGROUP, | 710 | NFT_META_CGROUP, |
| 711 | NFT_META_PRANDOM, | ||
| 710 | }; | 712 | }; |
| 711 | 713 | ||
| 712 | /** | 714 | /** |
| @@ -949,10 +951,14 @@ enum nft_nat_attributes { | |||
| 949 | * enum nft_masq_attributes - nf_tables masquerade expression attributes | 951 | * enum nft_masq_attributes - nf_tables masquerade expression attributes |
| 950 | * | 952 | * |
| 951 | * @NFTA_MASQ_FLAGS: NAT flags (see NF_NAT_RANGE_* in linux/netfilter/nf_nat.h) (NLA_U32) | 953 | * @NFTA_MASQ_FLAGS: NAT flags (see NF_NAT_RANGE_* in linux/netfilter/nf_nat.h) (NLA_U32) |
| 954 | * @NFTA_MASQ_REG_PROTO_MIN: source register of proto range start (NLA_U32: nft_registers) | ||
| 955 | * @NFTA_MASQ_REG_PROTO_MAX: source register of proto range end (NLA_U32: nft_registers) | ||
| 952 | */ | 956 | */ |
| 953 | enum nft_masq_attributes { | 957 | enum nft_masq_attributes { |
| 954 | NFTA_MASQ_UNSPEC, | 958 | NFTA_MASQ_UNSPEC, |
| 955 | NFTA_MASQ_FLAGS, | 959 | NFTA_MASQ_FLAGS, |
| 960 | NFTA_MASQ_REG_PROTO_MIN, | ||
| 961 | NFTA_MASQ_REG_PROTO_MAX, | ||
| 956 | __NFTA_MASQ_MAX | 962 | __NFTA_MASQ_MAX |
| 957 | }; | 963 | }; |
| 958 | #define NFTA_MASQ_MAX (__NFTA_MASQ_MAX - 1) | 964 | #define NFTA_MASQ_MAX (__NFTA_MASQ_MAX - 1) |
diff --git a/include/uapi/linux/netlink.h b/include/uapi/linux/netlink.h index f095155d8749..0dba4e4ed2be 100644 --- a/include/uapi/linux/netlink.h +++ b/include/uapi/linux/netlink.h | |||
| @@ -107,8 +107,10 @@ struct nlmsgerr { | |||
| 107 | #define NETLINK_PKTINFO 3 | 107 | #define NETLINK_PKTINFO 3 |
| 108 | #define NETLINK_BROADCAST_ERROR 4 | 108 | #define NETLINK_BROADCAST_ERROR 4 |
| 109 | #define NETLINK_NO_ENOBUFS 5 | 109 | #define NETLINK_NO_ENOBUFS 5 |
| 110 | #ifndef __KERNEL__ | ||
| 110 | #define NETLINK_RX_RING 6 | 111 | #define NETLINK_RX_RING 6 |
| 111 | #define NETLINK_TX_RING 7 | 112 | #define NETLINK_TX_RING 7 |
| 113 | #endif | ||
| 112 | #define NETLINK_LISTEN_ALL_NSID 8 | 114 | #define NETLINK_LISTEN_ALL_NSID 8 |
| 113 | #define NETLINK_LIST_MEMBERSHIPS 9 | 115 | #define NETLINK_LIST_MEMBERSHIPS 9 |
| 114 | #define NETLINK_CAP_ACK 10 | 116 | #define NETLINK_CAP_ACK 10 |
| @@ -134,6 +136,7 @@ struct nl_mmap_hdr { | |||
| 134 | __u32 nm_gid; | 136 | __u32 nm_gid; |
| 135 | }; | 137 | }; |
| 136 | 138 | ||
| 139 | #ifndef __KERNEL__ | ||
| 137 | enum nl_mmap_status { | 140 | enum nl_mmap_status { |
| 138 | NL_MMAP_STATUS_UNUSED, | 141 | NL_MMAP_STATUS_UNUSED, |
| 139 | NL_MMAP_STATUS_RESERVED, | 142 | NL_MMAP_STATUS_RESERVED, |
| @@ -145,6 +148,7 @@ enum nl_mmap_status { | |||
| 145 | #define NL_MMAP_MSG_ALIGNMENT NLMSG_ALIGNTO | 148 | #define NL_MMAP_MSG_ALIGNMENT NLMSG_ALIGNTO |
| 146 | #define NL_MMAP_MSG_ALIGN(sz) __ALIGN_KERNEL(sz, NL_MMAP_MSG_ALIGNMENT) | 149 | #define NL_MMAP_MSG_ALIGN(sz) __ALIGN_KERNEL(sz, NL_MMAP_MSG_ALIGNMENT) |
| 147 | #define NL_MMAP_HDRLEN NL_MMAP_MSG_ALIGN(sizeof(struct nl_mmap_hdr)) | 150 | #define NL_MMAP_HDRLEN NL_MMAP_MSG_ALIGN(sizeof(struct nl_mmap_hdr)) |
| 151 | #endif | ||
| 148 | 152 | ||
| 149 | #define NET_MAJOR 36 /* Major 36 is reserved for networking */ | 153 | #define NET_MAJOR 36 /* Major 36 is reserved for networking */ |
| 150 | 154 | ||
diff --git a/include/uapi/linux/netlink_diag.h b/include/uapi/linux/netlink_diag.h index f2159d30d1f5..d79399394b46 100644 --- a/include/uapi/linux/netlink_diag.h +++ b/include/uapi/linux/netlink_diag.h | |||
| @@ -48,6 +48,8 @@ enum { | |||
| 48 | 48 | ||
| 49 | #define NDIAG_SHOW_MEMINFO 0x00000001 /* show memory info of a socket */ | 49 | #define NDIAG_SHOW_MEMINFO 0x00000001 /* show memory info of a socket */ |
| 50 | #define NDIAG_SHOW_GROUPS 0x00000002 /* show groups of a netlink socket */ | 50 | #define NDIAG_SHOW_GROUPS 0x00000002 /* show groups of a netlink socket */ |
| 51 | #ifndef __KERNEL__ | ||
| 51 | #define NDIAG_SHOW_RING_CFG 0x00000004 /* show ring configuration */ | 52 | #define NDIAG_SHOW_RING_CFG 0x00000004 /* show ring configuration */ |
| 53 | #endif | ||
| 52 | 54 | ||
| 53 | #endif | 55 | #endif |
diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h index 5b7b5ebe7ca8..5a30a7563633 100644 --- a/include/uapi/linux/nl80211.h +++ b/include/uapi/linux/nl80211.h | |||
| @@ -1727,6 +1727,8 @@ enum nl80211_commands { | |||
| 1727 | * underlying device supports these minimal RRM features: | 1727 | * underlying device supports these minimal RRM features: |
| 1728 | * %NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES, | 1728 | * %NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES, |
| 1729 | * %NL80211_FEATURE_QUIET, | 1729 | * %NL80211_FEATURE_QUIET, |
| 1730 | * Or, if global RRM is supported, see: | ||
| 1731 | * %NL80211_EXT_FEATURE_RRM | ||
| 1730 | * If this flag is used, driver must add the Power Capabilities IE to the | 1732 | * If this flag is used, driver must add the Power Capabilities IE to the |
| 1731 | * association request. In addition, it must also set the RRM capability | 1733 | * association request. In addition, it must also set the RRM capability |
| 1732 | * flag in the association request's Capability Info field. | 1734 | * flag in the association request's Capability Info field. |
| @@ -1789,6 +1791,10 @@ enum nl80211_commands { | |||
| 1789 | * thus it must not specify the number of iterations, only the interval | 1791 | * thus it must not specify the number of iterations, only the interval |
| 1790 | * between scans. The scan plans are executed sequentially. | 1792 | * between scans. The scan plans are executed sequentially. |
| 1791 | * Each scan plan is a nested attribute of &enum nl80211_sched_scan_plan. | 1793 | * Each scan plan is a nested attribute of &enum nl80211_sched_scan_plan. |
| 1794 | * @NL80211_ATTR_PBSS: flag attribute. If set it means operate | ||
| 1795 | * in a PBSS. Specified in %NL80211_CMD_CONNECT to request | ||
| 1796 | * connecting to a PCP, and in %NL80211_CMD_START_AP to start | ||
| 1797 | * a PCP instead of AP. Relevant for DMG networks only. | ||
| 1792 | * | 1798 | * |
| 1793 | * @NUM_NL80211_ATTR: total number of nl80211_attrs available | 1799 | * @NUM_NL80211_ATTR: total number of nl80211_attrs available |
| 1794 | * @NL80211_ATTR_MAX: highest attribute number currently defined | 1800 | * @NL80211_ATTR_MAX: highest attribute number currently defined |
| @@ -2164,6 +2170,8 @@ enum nl80211_attrs { | |||
| 2164 | NL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS, | 2170 | NL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS, |
| 2165 | NL80211_ATTR_SCHED_SCAN_PLANS, | 2171 | NL80211_ATTR_SCHED_SCAN_PLANS, |
| 2166 | 2172 | ||
| 2173 | NL80211_ATTR_PBSS, | ||
| 2174 | |||
| 2167 | /* add attributes here, update the policy in nl80211.c */ | 2175 | /* add attributes here, update the policy in nl80211.c */ |
| 2168 | 2176 | ||
| 2169 | __NL80211_ATTR_AFTER_LAST, | 2177 | __NL80211_ATTR_AFTER_LAST, |
| @@ -4396,12 +4404,18 @@ enum nl80211_feature_flags { | |||
| 4396 | /** | 4404 | /** |
| 4397 | * enum nl80211_ext_feature_index - bit index of extended features. | 4405 | * enum nl80211_ext_feature_index - bit index of extended features. |
| 4398 | * @NL80211_EXT_FEATURE_VHT_IBSS: This driver supports IBSS with VHT datarates. | 4406 | * @NL80211_EXT_FEATURE_VHT_IBSS: This driver supports IBSS with VHT datarates. |
| 4407 | * @NL80211_EXT_FEATURE_RRM: This driver supports RRM. When featured, user can | ||
| 4408 | * can request to use RRM (see %NL80211_ATTR_USE_RRM) with | ||
| 4409 | * %NL80211_CMD_ASSOCIATE and %NL80211_CMD_CONNECT requests, which will set | ||
| 4410 | * the ASSOC_REQ_USE_RRM flag in the association request even if | ||
| 4411 | * NL80211_FEATURE_QUIET is not advertized. | ||
| 4399 | * | 4412 | * |
| 4400 | * @NUM_NL80211_EXT_FEATURES: number of extended features. | 4413 | * @NUM_NL80211_EXT_FEATURES: number of extended features. |
| 4401 | * @MAX_NL80211_EXT_FEATURES: highest extended feature index. | 4414 | * @MAX_NL80211_EXT_FEATURES: highest extended feature index. |
| 4402 | */ | 4415 | */ |
| 4403 | enum nl80211_ext_feature_index { | 4416 | enum nl80211_ext_feature_index { |
| 4404 | NL80211_EXT_FEATURE_VHT_IBSS, | 4417 | NL80211_EXT_FEATURE_VHT_IBSS, |
| 4418 | NL80211_EXT_FEATURE_RRM, | ||
| 4405 | 4419 | ||
| 4406 | /* add new features before the definition below */ | 4420 | /* add new features before the definition below */ |
| 4407 | NUM_NL80211_EXT_FEATURES, | 4421 | NUM_NL80211_EXT_FEATURES, |
diff --git a/include/uapi/linux/openvswitch.h b/include/uapi/linux/openvswitch.h index a27222d5b413..616d04761730 100644 --- a/include/uapi/linux/openvswitch.h +++ b/include/uapi/linux/openvswitch.h | |||
| @@ -454,6 +454,14 @@ struct ovs_key_ct_labels { | |||
| 454 | #define OVS_CS_F_REPLY_DIR 0x08 /* Flow is in the reply direction. */ | 454 | #define OVS_CS_F_REPLY_DIR 0x08 /* Flow is in the reply direction. */ |
| 455 | #define OVS_CS_F_INVALID 0x10 /* Could not track connection. */ | 455 | #define OVS_CS_F_INVALID 0x10 /* Could not track connection. */ |
| 456 | #define OVS_CS_F_TRACKED 0x20 /* Conntrack has occurred. */ | 456 | #define OVS_CS_F_TRACKED 0x20 /* Conntrack has occurred. */ |
| 457 | #define OVS_CS_F_SRC_NAT 0x40 /* Packet's source address/port was | ||
| 458 | * mangled by NAT. | ||
| 459 | */ | ||
| 460 | #define OVS_CS_F_DST_NAT 0x80 /* Packet's destination address/port | ||
| 461 | * was mangled by NAT. | ||
| 462 | */ | ||
| 463 | |||
| 464 | #define OVS_CS_F_NAT_MASK (OVS_CS_F_SRC_NAT | OVS_CS_F_DST_NAT) | ||
| 457 | 465 | ||
| 458 | /** | 466 | /** |
| 459 | * enum ovs_flow_attr - attributes for %OVS_FLOW_* commands. | 467 | * enum ovs_flow_attr - attributes for %OVS_FLOW_* commands. |
| @@ -632,6 +640,8 @@ struct ovs_action_hash { | |||
| 632 | * mask. For each bit set in the mask, the corresponding bit in the value is | 640 | * mask. For each bit set in the mask, the corresponding bit in the value is |
| 633 | * copied to the connection tracking label field in the connection. | 641 | * copied to the connection tracking label field in the connection. |
| 634 | * @OVS_CT_ATTR_HELPER: variable length string defining conntrack ALG. | 642 | * @OVS_CT_ATTR_HELPER: variable length string defining conntrack ALG. |
| 643 | * @OVS_CT_ATTR_NAT: Nested OVS_NAT_ATTR_* for performing L3 network address | ||
| 644 | * translation (NAT) on the packet. | ||
| 635 | */ | 645 | */ |
| 636 | enum ovs_ct_attr { | 646 | enum ovs_ct_attr { |
| 637 | OVS_CT_ATTR_UNSPEC, | 647 | OVS_CT_ATTR_UNSPEC, |
| @@ -641,12 +651,51 @@ enum ovs_ct_attr { | |||
| 641 | OVS_CT_ATTR_LABELS, /* labels to associate with this connection. */ | 651 | OVS_CT_ATTR_LABELS, /* labels to associate with this connection. */ |
| 642 | OVS_CT_ATTR_HELPER, /* netlink helper to assist detection of | 652 | OVS_CT_ATTR_HELPER, /* netlink helper to assist detection of |
| 643 | related connections. */ | 653 | related connections. */ |
| 654 | OVS_CT_ATTR_NAT, /* Nested OVS_NAT_ATTR_* */ | ||
| 644 | __OVS_CT_ATTR_MAX | 655 | __OVS_CT_ATTR_MAX |
| 645 | }; | 656 | }; |
| 646 | 657 | ||
| 647 | #define OVS_CT_ATTR_MAX (__OVS_CT_ATTR_MAX - 1) | 658 | #define OVS_CT_ATTR_MAX (__OVS_CT_ATTR_MAX - 1) |
| 648 | 659 | ||
| 649 | /** | 660 | /** |
| 661 | * enum ovs_nat_attr - Attributes for %OVS_CT_ATTR_NAT. | ||
| 662 | * | ||
| 663 | * @OVS_NAT_ATTR_SRC: Flag for Source NAT (mangle source address/port). | ||
| 664 | * @OVS_NAT_ATTR_DST: Flag for Destination NAT (mangle destination | ||
| 665 | * address/port). Only one of (@OVS_NAT_ATTR_SRC, @OVS_NAT_ATTR_DST) may be | ||
| 666 | * specified. Effective only for packets for ct_state NEW connections. | ||
| 667 | * Packets of committed connections are mangled by the NAT action according to | ||
| 668 | * the committed NAT type regardless of the flags specified. As a corollary, a | ||
| 669 | * NAT action without a NAT type flag will only mangle packets of committed | ||
| 670 | * connections. The following NAT attributes only apply for NEW | ||
| 671 | * (non-committed) connections, and they may be included only when the CT | ||
| 672 | * action has the @OVS_CT_ATTR_COMMIT flag and either @OVS_NAT_ATTR_SRC or | ||
| 673 | * @OVS_NAT_ATTR_DST is also included. | ||
| 674 | * @OVS_NAT_ATTR_IP_MIN: struct in_addr or struct in6_addr | ||
| 675 | * @OVS_NAT_ATTR_IP_MAX: struct in_addr or struct in6_addr | ||
| 676 | * @OVS_NAT_ATTR_PROTO_MIN: u16 L4 protocol specific lower boundary (port) | ||
| 677 | * @OVS_NAT_ATTR_PROTO_MAX: u16 L4 protocol specific upper boundary (port) | ||
| 678 | * @OVS_NAT_ATTR_PERSISTENT: Flag for persistent IP mapping across reboots | ||
| 679 | * @OVS_NAT_ATTR_PROTO_HASH: Flag for pseudo random L4 port mapping (MD5) | ||
| 680 | * @OVS_NAT_ATTR_PROTO_RANDOM: Flag for fully randomized L4 port mapping | ||
| 681 | */ | ||
| 682 | enum ovs_nat_attr { | ||
| 683 | OVS_NAT_ATTR_UNSPEC, | ||
| 684 | OVS_NAT_ATTR_SRC, | ||
| 685 | OVS_NAT_ATTR_DST, | ||
| 686 | OVS_NAT_ATTR_IP_MIN, | ||
| 687 | OVS_NAT_ATTR_IP_MAX, | ||
| 688 | OVS_NAT_ATTR_PROTO_MIN, | ||
| 689 | OVS_NAT_ATTR_PROTO_MAX, | ||
| 690 | OVS_NAT_ATTR_PERSISTENT, | ||
| 691 | OVS_NAT_ATTR_PROTO_HASH, | ||
| 692 | OVS_NAT_ATTR_PROTO_RANDOM, | ||
| 693 | __OVS_NAT_ATTR_MAX, | ||
| 694 | }; | ||
| 695 | |||
| 696 | #define OVS_NAT_ATTR_MAX (__OVS_NAT_ATTR_MAX - 1) | ||
| 697 | |||
| 698 | /** | ||
| 650 | * enum ovs_action_attr - Action types. | 699 | * enum ovs_action_attr - Action types. |
| 651 | * | 700 | * |
| 652 | * @OVS_ACTION_ATTR_OUTPUT: Output packet to port. | 701 | * @OVS_ACTION_ATTR_OUTPUT: Output packet to port. |
diff --git a/include/uapi/linux/pkt_cls.h b/include/uapi/linux/pkt_cls.h index 439873775d49..c43c5f78b9c4 100644 --- a/include/uapi/linux/pkt_cls.h +++ b/include/uapi/linux/pkt_cls.h | |||
| @@ -172,6 +172,7 @@ enum { | |||
| 172 | TCA_U32_INDEV, | 172 | TCA_U32_INDEV, |
| 173 | TCA_U32_PCNT, | 173 | TCA_U32_PCNT, |
| 174 | TCA_U32_MARK, | 174 | TCA_U32_MARK, |
| 175 | TCA_U32_FLAGS, | ||
| 175 | __TCA_U32_MAX | 176 | __TCA_U32_MAX |
| 176 | }; | 177 | }; |
| 177 | 178 | ||
| @@ -416,6 +417,8 @@ enum { | |||
| 416 | TCA_FLOWER_KEY_TCP_DST, /* be16 */ | 417 | TCA_FLOWER_KEY_TCP_DST, /* be16 */ |
| 417 | TCA_FLOWER_KEY_UDP_SRC, /* be16 */ | 418 | TCA_FLOWER_KEY_UDP_SRC, /* be16 */ |
| 418 | TCA_FLOWER_KEY_UDP_DST, /* be16 */ | 419 | TCA_FLOWER_KEY_UDP_DST, /* be16 */ |
| 420 | |||
| 421 | TCA_FLOWER_FLAGS, | ||
| 419 | __TCA_FLOWER_MAX, | 422 | __TCA_FLOWER_MAX, |
| 420 | }; | 423 | }; |
| 421 | 424 | ||
diff --git a/include/uapi/linux/rfkill.h b/include/uapi/linux/rfkill.h index 058757f7a733..2e00dcebebd0 100644 --- a/include/uapi/linux/rfkill.h +++ b/include/uapi/linux/rfkill.h | |||
| @@ -59,6 +59,8 @@ enum rfkill_type { | |||
| 59 | * @RFKILL_OP_DEL: a device was removed | 59 | * @RFKILL_OP_DEL: a device was removed |
| 60 | * @RFKILL_OP_CHANGE: a device's state changed -- userspace changes one device | 60 | * @RFKILL_OP_CHANGE: a device's state changed -- userspace changes one device |
| 61 | * @RFKILL_OP_CHANGE_ALL: userspace changes all devices (of a type, or all) | 61 | * @RFKILL_OP_CHANGE_ALL: userspace changes all devices (of a type, or all) |
| 62 | * into a state, also updating the default state used for devices that | ||
| 63 | * are hot-plugged later. | ||
| 62 | */ | 64 | */ |
| 63 | enum rfkill_operation { | 65 | enum rfkill_operation { |
| 64 | RFKILL_OP_ADD = 0, | 66 | RFKILL_OP_ADD = 0, |
diff --git a/include/uapi/linux/tc_act/tc_ife.h b/include/uapi/linux/tc_act/tc_ife.h new file mode 100644 index 000000000000..d648ff66586f --- /dev/null +++ b/include/uapi/linux/tc_act/tc_ife.h | |||
| @@ -0,0 +1,38 @@ | |||
| 1 | #ifndef __UAPI_TC_IFE_H | ||
| 2 | #define __UAPI_TC_IFE_H | ||
| 3 | |||
| 4 | #include <linux/types.h> | ||
| 5 | #include <linux/pkt_cls.h> | ||
| 6 | |||
| 7 | #define TCA_ACT_IFE 25 | ||
| 8 | /* Flag bits for now just encoding/decoding; mutually exclusive */ | ||
| 9 | #define IFE_ENCODE 1 | ||
| 10 | #define IFE_DECODE 0 | ||
| 11 | |||
| 12 | struct tc_ife { | ||
| 13 | tc_gen; | ||
| 14 | __u16 flags; | ||
| 15 | }; | ||
| 16 | |||
| 17 | /*XXX: We need to encode the total number of bytes consumed */ | ||
| 18 | enum { | ||
| 19 | TCA_IFE_UNSPEC, | ||
| 20 | TCA_IFE_PARMS, | ||
| 21 | TCA_IFE_TM, | ||
| 22 | TCA_IFE_DMAC, | ||
| 23 | TCA_IFE_SMAC, | ||
| 24 | TCA_IFE_TYPE, | ||
| 25 | TCA_IFE_METALST, | ||
| 26 | __TCA_IFE_MAX | ||
| 27 | }; | ||
| 28 | #define TCA_IFE_MAX (__TCA_IFE_MAX - 1) | ||
| 29 | |||
| 30 | #define IFE_META_SKBMARK 1 | ||
| 31 | #define IFE_META_HASHID 2 | ||
| 32 | #define IFE_META_PRIO 3 | ||
| 33 | #define IFE_META_QMAP 4 | ||
| 34 | /*Can be overridden at runtime by module option*/ | ||
| 35 | #define __IFE_META_MAX 5 | ||
| 36 | #define IFE_META_MAX (__IFE_META_MAX - 1) | ||
| 37 | |||
| 38 | #endif | ||
diff --git a/include/uapi/linux/tcp.h b/include/uapi/linux/tcp.h index 65a77b071e22..53e8e3fe6b1b 100644 --- a/include/uapi/linux/tcp.h +++ b/include/uapi/linux/tcp.h | |||
| @@ -196,6 +196,11 @@ struct tcp_info { | |||
| 196 | __u64 tcpi_bytes_received; /* RFC4898 tcpEStatsAppHCThruOctetsReceived */ | 196 | __u64 tcpi_bytes_received; /* RFC4898 tcpEStatsAppHCThruOctetsReceived */ |
| 197 | __u32 tcpi_segs_out; /* RFC4898 tcpEStatsPerfSegsOut */ | 197 | __u32 tcpi_segs_out; /* RFC4898 tcpEStatsPerfSegsOut */ |
| 198 | __u32 tcpi_segs_in; /* RFC4898 tcpEStatsPerfSegsIn */ | 198 | __u32 tcpi_segs_in; /* RFC4898 tcpEStatsPerfSegsIn */ |
| 199 | |||
| 200 | __u32 tcpi_notsent_bytes; | ||
| 201 | __u32 tcpi_min_rtt; | ||
| 202 | __u32 tcpi_data_segs_in; /* RFC4898 tcpEStatsDataSegsIn */ | ||
| 203 | __u32 tcpi_data_segs_out; /* RFC4898 tcpEStatsDataSegsOut */ | ||
| 199 | }; | 204 | }; |
| 200 | 205 | ||
| 201 | /* for TCP_MD5SIG socket option */ | 206 | /* for TCP_MD5SIG socket option */ |
diff --git a/include/xen/interface/io/netif.h b/include/xen/interface/io/netif.h index 252ffd4801ef..4f20dbc42910 100644 --- a/include/xen/interface/io/netif.h +++ b/include/xen/interface/io/netif.h | |||
| @@ -1,16 +1,34 @@ | |||
| 1 | /****************************************************************************** | 1 | /****************************************************************************** |
| 2 | * netif.h | 2 | * xen_netif.h |
| 3 | * | 3 | * |
| 4 | * Unified network-device I/O interface for Xen guest OSes. | 4 | * Unified network-device I/O interface for Xen guest OSes. |
| 5 | * | 5 | * |
| 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy | ||
| 7 | * of this software and associated documentation files (the "Software"), to | ||
| 8 | * deal in the Software without restriction, including without limitation the | ||
| 9 | * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or | ||
| 10 | * sell copies of the Software, and to permit persons to whom the Software is | ||
| 11 | * furnished to do so, subject to the following conditions: | ||
| 12 | * | ||
| 13 | * The above copyright notice and this permission notice shall be included in | ||
| 14 | * all copies or substantial portions of the Software. | ||
| 15 | * | ||
| 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
| 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
| 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||
| 21 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | ||
| 22 | * DEALINGS IN THE SOFTWARE. | ||
| 23 | * | ||
| 6 | * Copyright (c) 2003-2004, Keir Fraser | 24 | * Copyright (c) 2003-2004, Keir Fraser |
| 7 | */ | 25 | */ |
| 8 | 26 | ||
| 9 | #ifndef __XEN_PUBLIC_IO_NETIF_H__ | 27 | #ifndef __XEN_PUBLIC_IO_XEN_NETIF_H__ |
| 10 | #define __XEN_PUBLIC_IO_NETIF_H__ | 28 | #define __XEN_PUBLIC_IO_XEN_NETIF_H__ |
| 11 | 29 | ||
| 12 | #include <xen/interface/io/ring.h> | 30 | #include "ring.h" |
| 13 | #include <xen/interface/grant_table.h> | 31 | #include "../grant_table.h" |
| 14 | 32 | ||
| 15 | /* | 33 | /* |
| 16 | * Older implementation of Xen network frontend / backend has an | 34 | * Older implementation of Xen network frontend / backend has an |
| @@ -38,10 +56,10 @@ | |||
| 38 | * that it cannot safely queue packets (as it may not be kicked to send them). | 56 | * that it cannot safely queue packets (as it may not be kicked to send them). |
| 39 | */ | 57 | */ |
| 40 | 58 | ||
| 41 | /* | 59 | /* |
| 42 | * "feature-split-event-channels" is introduced to separate guest TX | 60 | * "feature-split-event-channels" is introduced to separate guest TX |
| 43 | * and RX notificaion. Backend either doesn't support this feature or | 61 | * and RX notification. Backend either doesn't support this feature or |
| 44 | * advertise it via xenstore as 0 (disabled) or 1 (enabled). | 62 | * advertises it via xenstore as 0 (disabled) or 1 (enabled). |
| 45 | * | 63 | * |
| 46 | * To make use of this feature, frontend should allocate two event | 64 | * To make use of this feature, frontend should allocate two event |
| 47 | * channels for TX and RX, advertise them to backend as | 65 | * channels for TX and RX, advertise them to backend as |
| @@ -118,151 +136,804 @@ | |||
| 118 | */ | 136 | */ |
| 119 | 137 | ||
| 120 | /* | 138 | /* |
| 121 | * This is the 'wire' format for packets: | 139 | * "feature-multicast-control" and "feature-dynamic-multicast-control" |
| 122 | * Request 1: xen_netif_tx_request -- XEN_NETTXF_* (any flags) | 140 | * advertise the capability to filter ethernet multicast packets in the |
| 123 | * [Request 2: xen_netif_extra_info] (only if request 1 has XEN_NETTXF_extra_info) | 141 | * backend. If the frontend wishes to take advantage of this feature then |
| 124 | * [Request 3: xen_netif_extra_info] (only if request 2 has XEN_NETIF_EXTRA_MORE) | 142 | * it may set "request-multicast-control". If the backend only advertises |
| 125 | * Request 4: xen_netif_tx_request -- XEN_NETTXF_more_data | 143 | * "feature-multicast-control" then "request-multicast-control" must be set |
| 126 | * Request 5: xen_netif_tx_request -- XEN_NETTXF_more_data | 144 | * before the frontend moves into the connected state. The backend will |
| 145 | * sample the value on this state transition and any subsequent change in | ||
| 146 | * value will have no effect. However, if the backend also advertises | ||
| 147 | * "feature-dynamic-multicast-control" then "request-multicast-control" | ||
| 148 | * may be set by the frontend at any time. In this case, the backend will | ||
| 149 | * watch the value and re-sample on watch events. | ||
| 150 | * | ||
| 151 | * If the sampled value of "request-multicast-control" is set then the | ||
| 152 | * backend transmit side should no longer flood multicast packets to the | ||
| 153 | * frontend, it should instead drop any multicast packet that does not | ||
| 154 | * match in a filter list. | ||
| 155 | * The list is amended by the frontend by sending dummy transmit requests | ||
| 156 | * containing XEN_NETIF_EXTRA_TYPE_MCAST_{ADD,DEL} extra-info fragments as | ||
| 157 | * specified below. | ||
| 158 | * Note that the filter list may be amended even if the sampled value of | ||
| 159 | * "request-multicast-control" is not set, however the filter should only | ||
| 160 | * be applied if it is set. | ||
| 161 | */ | ||
| 162 | |||
| 163 | /* | ||
| 164 | * Control ring | ||
| 165 | * ============ | ||
| 166 | * | ||
| 167 | * Some features, such as hashing (detailed below), require a | ||
| 168 | * significant amount of out-of-band data to be passed from frontend to | ||
| 169 | * backend. Use of xenstore is not suitable for large quantities of data | ||
| 170 | * because of quota limitations and so a dedicated 'control ring' is used. | ||
| 171 | * The ability of the backend to use a control ring is advertised by | ||
| 172 | * setting: | ||
| 173 | * | ||
| 174 | * /local/domain/X/backend/<domid>/<vif>/feature-ctrl-ring = "1" | ||
| 175 | * | ||
| 176 | * The frontend provides a control ring to the backend by setting: | ||
| 177 | * | ||
| 178 | * /local/domain/<domid>/device/vif/<vif>/ctrl-ring-ref = <gref> | ||
| 179 | * /local/domain/<domid>/device/vif/<vif>/event-channel-ctrl = <port> | ||
| 180 | * | ||
| 181 | * where <gref> is the grant reference of the shared page used to | ||
| 182 | * implement the control ring and <port> is an event channel to be used | ||
| 183 | * as a mailbox interrupt. These keys must be set before the frontend | ||
| 184 | * moves into the connected state. | ||
| 185 | * | ||
| 186 | * The control ring uses a fixed request/response message size and is | ||
| 187 | * balanced (i.e. one request to one response), so operationally it is much | ||
| 188 | * the same as a transmit or receive ring. | ||
| 189 | * Note that there is no requirement that responses are issued in the same | ||
| 190 | * order as requests. | ||
| 191 | */ | ||
| 192 | |||
| 193 | /* | ||
| 194 | * Hash types | ||
| 195 | * ========== | ||
| 196 | * | ||
| 197 | * For the purposes of the definitions below, 'Packet[]' is an array of | ||
| 198 | * octets containing an IP packet without options, 'Array[X..Y]' means a | ||
| 199 | * sub-array of 'Array' containing bytes X thru Y inclusive, and '+' is | ||
| 200 | * used to indicate concatenation of arrays. | ||
| 201 | */ | ||
| 202 | |||
| 203 | /* | ||
| 204 | * A hash calculated over an IP version 4 header as follows: | ||
| 205 | * | ||
| 206 | * Buffer[0..8] = Packet[12..15] (source address) + | ||
| 207 | * Packet[16..19] (destination address) | ||
| 208 | * | ||
| 209 | * Result = Hash(Buffer, 8) | ||
| 210 | */ | ||
| 211 | #define _XEN_NETIF_CTRL_HASH_TYPE_IPV4 0 | ||
| 212 | #define XEN_NETIF_CTRL_HASH_TYPE_IPV4 \ | ||
| 213 | (1 << _XEN_NETIF_CTRL_HASH_TYPE_IPV4) | ||
| 214 | |||
| 215 | /* | ||
| 216 | * A hash calculated over an IP version 4 header and TCP header as | ||
| 217 | * follows: | ||
| 218 | * | ||
| 219 | * Buffer[0..12] = Packet[12..15] (source address) + | ||
| 220 | * Packet[16..19] (destination address) + | ||
| 221 | * Packet[20..21] (source port) + | ||
| 222 | * Packet[22..23] (destination port) | ||
| 223 | * | ||
| 224 | * Result = Hash(Buffer, 12) | ||
| 225 | */ | ||
| 226 | #define _XEN_NETIF_CTRL_HASH_TYPE_IPV4_TCP 1 | ||
| 227 | #define XEN_NETIF_CTRL_HASH_TYPE_IPV4_TCP \ | ||
| 228 | (1 << _XEN_NETIF_CTRL_HASH_TYPE_IPV4_TCP) | ||
| 229 | |||
| 230 | /* | ||
| 231 | * A hash calculated over an IP version 6 header as follows: | ||
| 232 | * | ||
| 233 | * Buffer[0..32] = Packet[8..23] (source address ) + | ||
| 234 | * Packet[24..39] (destination address) | ||
| 235 | * | ||
| 236 | * Result = Hash(Buffer, 32) | ||
| 237 | */ | ||
| 238 | #define _XEN_NETIF_CTRL_HASH_TYPE_IPV6 2 | ||
| 239 | #define XEN_NETIF_CTRL_HASH_TYPE_IPV6 \ | ||
| 240 | (1 << _XEN_NETIF_CTRL_HASH_TYPE_IPV6) | ||
| 241 | |||
| 242 | /* | ||
| 243 | * A hash calculated over an IP version 6 header and TCP header as | ||
| 244 | * follows: | ||
| 245 | * | ||
| 246 | * Buffer[0..36] = Packet[8..23] (source address) + | ||
| 247 | * Packet[24..39] (destination address) + | ||
| 248 | * Packet[40..41] (source port) + | ||
| 249 | * Packet[42..43] (destination port) | ||
| 250 | * | ||
| 251 | * Result = Hash(Buffer, 36) | ||
| 252 | */ | ||
| 253 | #define _XEN_NETIF_CTRL_HASH_TYPE_IPV6_TCP 3 | ||
| 254 | #define XEN_NETIF_CTRL_HASH_TYPE_IPV6_TCP \ | ||
| 255 | (1 << _XEN_NETIF_CTRL_HASH_TYPE_IPV6_TCP) | ||
| 256 | |||
| 257 | /* | ||
| 258 | * Hash algorithms | ||
| 259 | * =============== | ||
| 260 | */ | ||
| 261 | |||
| 262 | #define XEN_NETIF_CTRL_HASH_ALGORITHM_NONE 0 | ||
| 263 | |||
| 264 | /* | ||
| 265 | * Toeplitz hash: | ||
| 266 | */ | ||
| 267 | |||
| 268 | #define XEN_NETIF_CTRL_HASH_ALGORITHM_TOEPLITZ 1 | ||
| 269 | |||
| 270 | /* | ||
| 271 | * This algorithm uses a 'key' as well as the data buffer itself. | ||
| 272 | * (Buffer[] and Key[] are treated as shift-registers where the MSB of | ||
| 273 | * Buffer/Key[0] is considered 'left-most' and the LSB of Buffer/Key[N-1] | ||
| 274 | * is the 'right-most'). | ||
| 275 | * | ||
| 276 | * Value = 0 | ||
| 277 | * For number of bits in Buffer[] | ||
| 278 | * If (left-most bit of Buffer[] is 1) | ||
| 279 | * Value ^= left-most 32 bits of Key[] | ||
| 280 | * Key[] << 1 | ||
| 281 | * Buffer[] << 1 | ||
| 282 | * | ||
| 283 | * The code below is provided for convenience where an operating system | ||
| 284 | * does not already provide an implementation. | ||
| 285 | */ | ||
| 286 | #ifdef XEN_NETIF_DEFINE_TOEPLITZ | ||
| 287 | static uint32_t xen_netif_toeplitz_hash(const uint8_t *key, | ||
| 288 | unsigned int keylen, | ||
| 289 | const uint8_t *buf, unsigned int buflen) | ||
| 290 | { | ||
| 291 | unsigned int keyi, bufi; | ||
| 292 | uint64_t prefix = 0; | ||
| 293 | uint64_t hash = 0; | ||
| 294 | |||
| 295 | /* Pre-load prefix with the first 8 bytes of the key */ | ||
| 296 | for (keyi = 0; keyi < 8; keyi++) { | ||
| 297 | prefix <<= 8; | ||
| 298 | prefix |= (keyi < keylen) ? key[keyi] : 0; | ||
| 299 | } | ||
| 300 | |||
| 301 | for (bufi = 0; bufi < buflen; bufi++) { | ||
| 302 | uint8_t byte = buf[bufi]; | ||
| 303 | unsigned int bit; | ||
| 304 | |||
| 305 | for (bit = 0; bit < 8; bit++) { | ||
| 306 | if (byte & 0x80) | ||
| 307 | hash ^= prefix; | ||
| 308 | prefix <<= 1; | ||
| 309 | byte <<= 1; | ||
| 310 | } | ||
| 311 | |||
| 312 | /* | ||
| 313 | * 'prefix' has now been left-shifted by 8, so | ||
| 314 | * OR in the next byte. | ||
| 315 | */ | ||
| 316 | prefix |= (keyi < keylen) ? key[keyi] : 0; | ||
| 317 | keyi++; | ||
| 318 | } | ||
| 319 | |||
| 320 | /* The valid part of the hash is in the upper 32 bits. */ | ||
| 321 | return hash >> 32; | ||
| 322 | } | ||
| 323 | #endif /* XEN_NETIF_DEFINE_TOEPLITZ */ | ||
| 324 | |||
| 325 | /* | ||
| 326 | * Control requests (struct xen_netif_ctrl_request) | ||
| 327 | * ================================================ | ||
| 328 | * | ||
| 329 | * All requests have the following format: | ||
| 330 | * | ||
| 331 | * 0 1 2 3 4 5 6 7 octet | ||
| 332 | * +-----+-----+-----+-----+-----+-----+-----+-----+ | ||
| 333 | * | id | type | data[0] | | ||
| 334 | * +-----+-----+-----+-----+-----+-----+-----+-----+ | ||
| 335 | * | data[1] | data[2] | | ||
| 336 | * +-----+-----+-----+-----+-----------------------+ | ||
| 337 | * | ||
| 338 | * id: the request identifier, echoed in response. | ||
| 339 | * type: the type of request (see below) | ||
| 340 | * data[]: any data associated with the request (determined by type) | ||
| 341 | */ | ||
| 342 | |||
| 343 | struct xen_netif_ctrl_request { | ||
| 344 | uint16_t id; | ||
| 345 | uint16_t type; | ||
| 346 | |||
| 347 | #define XEN_NETIF_CTRL_TYPE_INVALID 0 | ||
| 348 | #define XEN_NETIF_CTRL_TYPE_GET_HASH_FLAGS 1 | ||
| 349 | #define XEN_NETIF_CTRL_TYPE_SET_HASH_FLAGS 2 | ||
| 350 | #define XEN_NETIF_CTRL_TYPE_SET_HASH_KEY 3 | ||
| 351 | #define XEN_NETIF_CTRL_TYPE_GET_HASH_MAPPING_SIZE 4 | ||
| 352 | #define XEN_NETIF_CTRL_TYPE_SET_HASH_MAPPING_SIZE 5 | ||
| 353 | #define XEN_NETIF_CTRL_TYPE_SET_HASH_MAPPING 6 | ||
| 354 | #define XEN_NETIF_CTRL_TYPE_SET_HASH_ALGORITHM 7 | ||
| 355 | |||
| 356 | uint32_t data[3]; | ||
| 357 | }; | ||
| 358 | |||
| 359 | /* | ||
| 360 | * Control responses (struct xen_netif_ctrl_response) | ||
| 361 | * ================================================== | ||
| 362 | * | ||
| 363 | * All responses have the following format: | ||
| 364 | * | ||
| 365 | * 0 1 2 3 4 5 6 7 octet | ||
| 366 | * +-----+-----+-----+-----+-----+-----+-----+-----+ | ||
| 367 | * | id | type | status | | ||
| 368 | * +-----+-----+-----+-----+-----+-----+-----+-----+ | ||
| 369 | * | data | | ||
| 370 | * +-----+-----+-----+-----+ | ||
| 371 | * | ||
| 372 | * id: the corresponding request identifier | ||
| 373 | * type: the type of the corresponding request | ||
| 374 | * status: the status of request processing | ||
| 375 | * data: any data associated with the response (determined by type and | ||
| 376 | * status) | ||
| 377 | */ | ||
| 378 | |||
| 379 | struct xen_netif_ctrl_response { | ||
| 380 | uint16_t id; | ||
| 381 | uint16_t type; | ||
| 382 | uint32_t status; | ||
| 383 | |||
| 384 | #define XEN_NETIF_CTRL_STATUS_SUCCESS 0 | ||
| 385 | #define XEN_NETIF_CTRL_STATUS_NOT_SUPPORTED 1 | ||
| 386 | #define XEN_NETIF_CTRL_STATUS_INVALID_PARAMETER 2 | ||
| 387 | #define XEN_NETIF_CTRL_STATUS_BUFFER_OVERFLOW 3 | ||
| 388 | |||
| 389 | uint32_t data; | ||
| 390 | }; | ||
| 391 | |||
| 392 | /* | ||
| 393 | * Control messages | ||
| 394 | * ================ | ||
| 395 | * | ||
| 396 | * XEN_NETIF_CTRL_TYPE_SET_HASH_ALGORITHM | ||
| 397 | * -------------------------------------- | ||
| 398 | * | ||
| 399 | * This is sent by the frontend to set the desired hash algorithm. | ||
| 400 | * | ||
| 401 | * Request: | ||
| 402 | * | ||
| 403 | * type = XEN_NETIF_CTRL_TYPE_SET_HASH_ALGORITHM | ||
| 404 | * data[0] = a XEN_NETIF_CTRL_HASH_ALGORITHM_* value | ||
| 405 | * data[1] = 0 | ||
| 406 | * data[2] = 0 | ||
| 407 | * | ||
| 408 | * Response: | ||
| 409 | * | ||
| 410 | * status = XEN_NETIF_CTRL_STATUS_NOT_SUPPORTED - Operation not | ||
| 411 | * supported | ||
| 412 | * XEN_NETIF_CTRL_STATUS_INVALID_PARAMETER - The algorithm is not | ||
| 413 | * supported | ||
| 414 | * XEN_NETIF_CTRL_STATUS_SUCCESS - Operation successful | ||
| 415 | * | ||
| 416 | * NOTE: Setting data[0] to XEN_NETIF_CTRL_HASH_ALGORITHM_NONE disables | ||
| 417 | * hashing and the backend is free to choose how it steers packets | ||
| 418 | * to queues (which is the default behaviour). | ||
| 419 | * | ||
| 420 | * XEN_NETIF_CTRL_TYPE_GET_HASH_FLAGS | ||
| 421 | * ---------------------------------- | ||
| 422 | * | ||
| 423 | * This is sent by the frontend to query the types of hash supported by | ||
| 424 | * the backend. | ||
| 425 | * | ||
| 426 | * Request: | ||
| 427 | * | ||
| 428 | * type = XEN_NETIF_CTRL_TYPE_GET_HASH_FLAGS | ||
| 429 | * data[0] = 0 | ||
| 430 | * data[1] = 0 | ||
| 431 | * data[2] = 0 | ||
| 432 | * | ||
| 433 | * Response: | ||
| 434 | * | ||
| 435 | * status = XEN_NETIF_CTRL_STATUS_NOT_SUPPORTED - Operation not supported | ||
| 436 | * XEN_NETIF_CTRL_STATUS_SUCCESS - Operation successful | ||
| 437 | * data = supported hash types (if operation was successful) | ||
| 438 | * | ||
| 439 | * NOTE: A valid hash algorithm must be selected before this operation can | ||
| 440 | * succeed. | ||
| 441 | * | ||
| 442 | * XEN_NETIF_CTRL_TYPE_SET_HASH_FLAGS | ||
| 443 | * ---------------------------------- | ||
| 444 | * | ||
| 445 | * This is sent by the frontend to set the types of hash that the backend | ||
| 446 | * should calculate. (See above for hash type definitions). | ||
| 447 | * Note that the 'maximal' type of hash should always be chosen. For | ||
| 448 | * example, if the frontend sets both IPV4 and IPV4_TCP hash types then | ||
| 449 | * the latter hash type should be calculated for any TCP packet and the | ||
| 450 | * former only calculated for non-TCP packets. | ||
| 451 | * | ||
| 452 | * Request: | ||
| 453 | * | ||
| 454 | * type = XEN_NETIF_CTRL_TYPE_SET_HASH_FLAGS | ||
| 455 | * data[0] = bitwise OR of XEN_NETIF_CTRL_HASH_TYPE_* values | ||
| 456 | * data[1] = 0 | ||
| 457 | * data[2] = 0 | ||
| 458 | * | ||
| 459 | * Response: | ||
| 460 | * | ||
| 461 | * status = XEN_NETIF_CTRL_STATUS_NOT_SUPPORTED - Operation not | ||
| 462 | * supported | ||
| 463 | * XEN_NETIF_CTRL_STATUS_INVALID_PARAMETER - One or more flag | ||
| 464 | * value is invalid or | ||
| 465 | * unsupported | ||
| 466 | * XEN_NETIF_CTRL_STATUS_SUCCESS - Operation successful | ||
| 467 | * data = 0 | ||
| 468 | * | ||
| 469 | * NOTE: A valid hash algorithm must be selected before this operation can | ||
| 470 | * succeed. | ||
| 471 | * Also, setting data[0] to zero disables hashing and the backend | ||
| 472 | * is free to choose how it steers packets to queues. | ||
| 473 | * | ||
| 474 | * XEN_NETIF_CTRL_TYPE_SET_HASH_KEY | ||
| 475 | * -------------------------------- | ||
| 476 | * | ||
| 477 | * This is sent by the frontend to set the key of the hash if the algorithm | ||
| 478 | * requires it. (See hash algorithms above). | ||
| 479 | * | ||
| 480 | * Request: | ||
| 481 | * | ||
| 482 | * type = XEN_NETIF_CTRL_TYPE_SET_HASH_KEY | ||
| 483 | * data[0] = grant reference of page containing the key (assumed to | ||
| 484 | * start at beginning of grant) | ||
| 485 | * data[1] = size of key in octets | ||
| 486 | * data[2] = 0 | ||
| 487 | * | ||
| 488 | * Response: | ||
| 489 | * | ||
| 490 | * status = XEN_NETIF_CTRL_STATUS_NOT_SUPPORTED - Operation not | ||
| 491 | * supported | ||
| 492 | * XEN_NETIF_CTRL_STATUS_INVALID_PARAMETER - Key size is invalid | ||
| 493 | * XEN_NETIF_CTRL_STATUS_BUFFER_OVERFLOW - Key size is larger | ||
| 494 | * than the backend | ||
| 495 | * supports | ||
| 496 | * XEN_NETIF_CTRL_STATUS_SUCCESS - Operation successful | ||
| 497 | * data = 0 | ||
| 498 | * | ||
| 499 | * NOTE: Any key octets not specified are assumed to be zero (the key | ||
| 500 | * is assumed to be empty by default) and specifying a new key | ||
| 501 | * invalidates any previous key, hence specifying a key size of | ||
| 502 | * zero will clear the key (which ensures that the calculated hash | ||
| 503 | * will always be zero). | ||
| 504 | * The maximum size of key is algorithm and backend specific, but | ||
| 505 | * is also limited by the single grant reference. | ||
| 506 | * The grant reference may be read-only and must remain valid until | ||
| 507 | * the response has been processed. | ||
| 508 | * | ||
| 509 | * XEN_NETIF_CTRL_TYPE_GET_HASH_MAPPING_SIZE | ||
| 510 | * ----------------------------------------- | ||
| 511 | * | ||
| 512 | * This is sent by the frontend to query the maximum size of mapping | ||
| 513 | * table supported by the backend. The size is specified in terms of | ||
| 514 | * table entries. | ||
| 515 | * | ||
| 516 | * Request: | ||
| 517 | * | ||
| 518 | * type = XEN_NETIF_CTRL_TYPE_GET_HASH_MAPPING_SIZE | ||
| 519 | * data[0] = 0 | ||
| 520 | * data[1] = 0 | ||
| 521 | * data[2] = 0 | ||
| 522 | * | ||
| 523 | * Response: | ||
| 524 | * | ||
| 525 | * status = XEN_NETIF_CTRL_STATUS_NOT_SUPPORTED - Operation not supported | ||
| 526 | * XEN_NETIF_CTRL_STATUS_SUCCESS - Operation successful | ||
| 527 | * data = maximum number of entries allowed in the mapping table | ||
| 528 | * (if operation was successful) or zero if a mapping table is | ||
| 529 | * not supported (i.e. hash mapping is done only by modular | ||
| 530 | * arithmetic). | ||
| 531 | * | ||
| 532 | * XEN_NETIF_CTRL_TYPE_SET_HASH_MAPPING_SIZE | ||
| 533 | * ------------------------------------- | ||
| 534 | * | ||
| 535 | * This is sent by the frontend to set the actual size of the mapping | ||
| 536 | * table to be used by the backend. The size is specified in terms of | ||
| 537 | * table entries. | ||
| 538 | * Any previous table is invalidated by this message and any new table | ||
| 539 | * is assumed to be zero filled. | ||
| 540 | * | ||
| 541 | * Request: | ||
| 542 | * | ||
| 543 | * type = XEN_NETIF_CTRL_TYPE_SET_HASH_MAPPING_SIZE | ||
| 544 | * data[0] = number of entries in mapping table | ||
| 545 | * data[1] = 0 | ||
| 546 | * data[2] = 0 | ||
| 547 | * | ||
| 548 | * Response: | ||
| 549 | * | ||
| 550 | * status = XEN_NETIF_CTRL_STATUS_NOT_SUPPORTED - Operation not | ||
| 551 | * supported | ||
| 552 | * XEN_NETIF_CTRL_STATUS_INVALID_PARAMETER - Table size is invalid | ||
| 553 | * XEN_NETIF_CTRL_STATUS_SUCCESS - Operation successful | ||
| 554 | * data = 0 | ||
| 555 | * | ||
| 556 | * NOTE: Setting data[0] to 0 means that hash mapping should be done | ||
| 557 | * using modular arithmetic. | ||
| 558 | * | ||
| 559 | * XEN_NETIF_CTRL_TYPE_SET_HASH_MAPPING | ||
| 560 | * ------------------------------------ | ||
| 561 | * | ||
| 562 | * This is sent by the frontend to set the content of the table mapping | ||
| 563 | * hash value to queue number. The backend should calculate the hash from | ||
| 564 | * the packet header, use it as an index into the table (modulo the size | ||
| 565 | * of the table) and then steer the packet to the queue number found at | ||
| 566 | * that index. | ||
| 567 | * | ||
| 568 | * Request: | ||
| 569 | * | ||
| 570 | * type = XEN_NETIF_CTRL_TYPE_SET_HASH_MAPPING | ||
| 571 | * data[0] = grant reference of page containing the mapping (sub-)table | ||
| 572 | * (assumed to start at beginning of grant) | ||
| 573 | * data[1] = size of (sub-)table in entries | ||
| 574 | * data[2] = offset, in entries, of sub-table within overall table | ||
| 575 | * | ||
| 576 | * Response: | ||
| 577 | * | ||
| 578 | * status = XEN_NETIF_CTRL_STATUS_NOT_SUPPORTED - Operation not | ||
| 579 | * supported | ||
| 580 | * XEN_NETIF_CTRL_STATUS_INVALID_PARAMETER - Table size or content | ||
| 581 | * is invalid | ||
| 582 | * XEN_NETIF_CTRL_STATUS_BUFFER_OVERFLOW - Table size is larger | ||
| 583 | * than the backend | ||
| 584 | * supports | ||
| 585 | * XEN_NETIF_CTRL_STATUS_SUCCESS - Operation successful | ||
| 586 | * data = 0 | ||
| 587 | * | ||
| 588 | * NOTE: The overall table has the following format: | ||
| 589 | * | ||
| 590 | * 0 1 2 3 4 5 6 7 octet | ||
| 591 | * +-----+-----+-----+-----+-----+-----+-----+-----+ | ||
| 592 | * | mapping[0] | mapping[1] | | ||
| 593 | * +-----+-----+-----+-----+-----+-----+-----+-----+ | ||
| 594 | * | . | | ||
| 595 | * | . | | ||
| 596 | * | . | | ||
| 597 | * +-----+-----+-----+-----+-----+-----+-----+-----+ | ||
| 598 | * | mapping[N-2] | mapping[N-1] | | ||
| 599 | * +-----+-----+-----+-----+-----+-----+-----+-----+ | ||
| 600 | * | ||
| 601 | * where N is specified by a XEN_NETIF_CTRL_TYPE_SET_HASH_MAPPING_SIZE | ||
| 602 | * message and each mapping must specifies a queue between 0 and | ||
| 603 | * "multi-queue-num-queues" (see above). | ||
| 604 | * The backend may support a mapping table larger than can be | ||
| 605 | * mapped by a single grant reference. Thus sub-tables within a | ||
| 606 | * larger table can be individually set by sending multiple messages | ||
| 607 | * with differing offset values. Specifying a new sub-table does not | ||
| 608 | * invalidate any table data outside that range. | ||
| 609 | * The grant reference may be read-only and must remain valid until | ||
| 610 | * the response has been processed. | ||
| 611 | */ | ||
| 612 | |||
| 613 | DEFINE_RING_TYPES(xen_netif_ctrl, | ||
| 614 | struct xen_netif_ctrl_request, | ||
| 615 | struct xen_netif_ctrl_response); | ||
| 616 | |||
| 617 | /* | ||
| 618 | * Guest transmit | ||
| 619 | * ============== | ||
| 620 | * | ||
| 621 | * This is the 'wire' format for transmit (frontend -> backend) packets: | ||
| 622 | * | ||
| 623 | * Fragment 1: xen_netif_tx_request_t - flags = XEN_NETTXF_* | ||
| 624 | * size = total packet size | ||
| 625 | * [Extra 1: xen_netif_extra_info_t] - (only if fragment 1 flags include | ||
| 626 | * XEN_NETTXF_extra_info) | ||
| 627 | * ... | ||
| 628 | * [Extra N: xen_netif_extra_info_t] - (only if extra N-1 flags include | ||
| 629 | * XEN_NETIF_EXTRA_MORE) | ||
| 127 | * ... | 630 | * ... |
| 128 | * Request N: xen_netif_tx_request -- 0 | 631 | * Fragment N: xen_netif_tx_request_t - (only if fragment N-1 flags include |
| 632 | * XEN_NETTXF_more_data - flags on preceding | ||
| 633 | * extras are not relevant here) | ||
| 634 | * flags = 0 | ||
| 635 | * size = fragment size | ||
| 636 | * | ||
| 637 | * NOTE: | ||
| 638 | * | ||
| 639 | * This format slightly is different from that used for receive | ||
| 640 | * (backend -> frontend) packets. Specifically, in a multi-fragment | ||
| 641 | * packet the actual size of fragment 1 can only be determined by | ||
| 642 | * subtracting the sizes of fragments 2..N from the total packet size. | ||
| 643 | * | ||
| 644 | * Ring slot size is 12 octets, however not all request/response | ||
| 645 | * structs use the full size. | ||
| 646 | * | ||
| 647 | * tx request data (xen_netif_tx_request_t) | ||
| 648 | * ------------------------------------ | ||
| 649 | * | ||
| 650 | * 0 1 2 3 4 5 6 7 octet | ||
| 651 | * +-----+-----+-----+-----+-----+-----+-----+-----+ | ||
| 652 | * | grant ref | offset | flags | | ||
| 653 | * +-----+-----+-----+-----+-----+-----+-----+-----+ | ||
| 654 | * | id | size | | ||
| 655 | * +-----+-----+-----+-----+ | ||
| 656 | * | ||
| 657 | * grant ref: Reference to buffer page. | ||
| 658 | * offset: Offset within buffer page. | ||
| 659 | * flags: XEN_NETTXF_*. | ||
| 660 | * id: request identifier, echoed in response. | ||
| 661 | * size: packet size in bytes. | ||
| 662 | * | ||
| 663 | * tx response (xen_netif_tx_response_t) | ||
| 664 | * --------------------------------- | ||
| 665 | * | ||
| 666 | * 0 1 2 3 4 5 6 7 octet | ||
| 667 | * +-----+-----+-----+-----+-----+-----+-----+-----+ | ||
| 668 | * | id | status | unused | | ||
| 669 | * +-----+-----+-----+-----+-----+-----+-----+-----+ | ||
| 670 | * | unused | | ||
| 671 | * +-----+-----+-----+-----+ | ||
| 672 | * | ||
| 673 | * id: reflects id in transmit request | ||
| 674 | * status: XEN_NETIF_RSP_* | ||
| 675 | * | ||
| 676 | * Guest receive | ||
| 677 | * ============= | ||
| 678 | * | ||
| 679 | * This is the 'wire' format for receive (backend -> frontend) packets: | ||
| 680 | * | ||
| 681 | * Fragment 1: xen_netif_rx_request_t - flags = XEN_NETRXF_* | ||
| 682 | * size = fragment size | ||
| 683 | * [Extra 1: xen_netif_extra_info_t] - (only if fragment 1 flags include | ||
| 684 | * XEN_NETRXF_extra_info) | ||
| 685 | * ... | ||
| 686 | * [Extra N: xen_netif_extra_info_t] - (only if extra N-1 flags include | ||
| 687 | * XEN_NETIF_EXTRA_MORE) | ||
| 688 | * ... | ||
| 689 | * Fragment N: xen_netif_rx_request_t - (only if fragment N-1 flags include | ||
| 690 | * XEN_NETRXF_more_data - flags on preceding | ||
| 691 | * extras are not relevant here) | ||
| 692 | * flags = 0 | ||
| 693 | * size = fragment size | ||
| 694 | * | ||
| 695 | * NOTE: | ||
| 696 | * | ||
| 697 | * This format slightly is different from that used for transmit | ||
| 698 | * (frontend -> backend) packets. Specifically, in a multi-fragment | ||
| 699 | * packet the size of the packet can only be determined by summing the | ||
| 700 | * sizes of fragments 1..N. | ||
| 701 | * | ||
| 702 | * Ring slot size is 8 octets. | ||
| 703 | * | ||
| 704 | * rx request (xen_netif_rx_request_t) | ||
| 705 | * ------------------------------- | ||
| 706 | * | ||
| 707 | * 0 1 2 3 4 5 6 7 octet | ||
| 708 | * +-----+-----+-----+-----+-----+-----+-----+-----+ | ||
| 709 | * | id | pad | gref | | ||
| 710 | * +-----+-----+-----+-----+-----+-----+-----+-----+ | ||
| 711 | * | ||
| 712 | * id: request identifier, echoed in response. | ||
| 713 | * gref: reference to incoming granted frame. | ||
| 714 | * | ||
| 715 | * rx response (xen_netif_rx_response_t) | ||
| 716 | * --------------------------------- | ||
| 717 | * | ||
| 718 | * 0 1 2 3 4 5 6 7 octet | ||
| 719 | * +-----+-----+-----+-----+-----+-----+-----+-----+ | ||
| 720 | * | id | offset | flags | status | | ||
| 721 | * +-----+-----+-----+-----+-----+-----+-----+-----+ | ||
| 722 | * | ||
| 723 | * id: reflects id in receive request | ||
| 724 | * offset: offset in page of start of received packet | ||
| 725 | * flags: XEN_NETRXF_* | ||
| 726 | * status: -ve: XEN_NETIF_RSP_*; +ve: Rx'ed pkt size. | ||
| 727 | * | ||
| 728 | * NOTE: Historically, to support GSO on the frontend receive side, Linux | ||
| 729 | * netfront does not make use of the rx response id (because, as | ||
| 730 | * described below, extra info structures overlay the id field). | ||
| 731 | * Instead it assumes that responses always appear in the same ring | ||
| 732 | * slot as their corresponding request. Thus, to maintain | ||
| 733 | * compatibility, backends must make sure this is the case. | ||
| 734 | * | ||
| 735 | * Extra Info | ||
| 736 | * ========== | ||
| 737 | * | ||
| 738 | * Can be present if initial request or response has NET{T,R}XF_extra_info, | ||
| 739 | * or previous extra request has XEN_NETIF_EXTRA_MORE. | ||
| 740 | * | ||
| 741 | * The struct therefore needs to fit into either a tx or rx slot and | ||
| 742 | * is therefore limited to 8 octets. | ||
| 743 | * | ||
| 744 | * NOTE: Because extra info data overlays the usual request/response | ||
| 745 | * structures, there is no id information in the opposite direction. | ||
| 746 | * So, if an extra info overlays an rx response the frontend can | ||
| 747 | * assume that it is in the same ring slot as the request that was | ||
| 748 | * consumed to make the slot available, and the backend must ensure | ||
| 749 | * this assumption is true. | ||
| 750 | * | ||
| 751 | * extra info (xen_netif_extra_info_t) | ||
| 752 | * ------------------------------- | ||
| 753 | * | ||
| 754 | * General format: | ||
| 755 | * | ||
| 756 | * 0 1 2 3 4 5 6 7 octet | ||
| 757 | * +-----+-----+-----+-----+-----+-----+-----+-----+ | ||
| 758 | * |type |flags| type specific data | | ||
| 759 | * +-----+-----+-----+-----+-----+-----+-----+-----+ | ||
| 760 | * | padding for tx | | ||
| 761 | * +-----+-----+-----+-----+ | ||
| 762 | * | ||
| 763 | * type: XEN_NETIF_EXTRA_TYPE_* | ||
| 764 | * flags: XEN_NETIF_EXTRA_FLAG_* | ||
| 765 | * padding for tx: present only in the tx case due to 8 octet limit | ||
| 766 | * from rx case. Not shown in type specific entries | ||
| 767 | * below. | ||
| 768 | * | ||
| 769 | * XEN_NETIF_EXTRA_TYPE_GSO: | ||
| 770 | * | ||
| 771 | * 0 1 2 3 4 5 6 7 octet | ||
| 772 | * +-----+-----+-----+-----+-----+-----+-----+-----+ | ||
| 773 | * |type |flags| size |type | pad | features | | ||
| 774 | * +-----+-----+-----+-----+-----+-----+-----+-----+ | ||
| 775 | * | ||
| 776 | * type: Must be XEN_NETIF_EXTRA_TYPE_GSO | ||
| 777 | * flags: XEN_NETIF_EXTRA_FLAG_* | ||
| 778 | * size: Maximum payload size of each segment. For example, | ||
| 779 | * for TCP this is just the path MSS. | ||
| 780 | * type: XEN_NETIF_GSO_TYPE_*: This determines the protocol of | ||
| 781 | * the packet and any extra features required to segment the | ||
| 782 | * packet properly. | ||
| 783 | * features: EN_XEN_NETIF_GSO_FEAT_*: This specifies any extra GSO | ||
| 784 | * features required to process this packet, such as ECN | ||
| 785 | * support for TCPv4. | ||
| 786 | * | ||
| 787 | * XEN_NETIF_EXTRA_TYPE_MCAST_{ADD,DEL}: | ||
| 788 | * | ||
| 789 | * 0 1 2 3 4 5 6 7 octet | ||
| 790 | * +-----+-----+-----+-----+-----+-----+-----+-----+ | ||
| 791 | * |type |flags| addr | | ||
| 792 | * +-----+-----+-----+-----+-----+-----+-----+-----+ | ||
| 793 | * | ||
| 794 | * type: Must be XEN_NETIF_EXTRA_TYPE_MCAST_{ADD,DEL} | ||
| 795 | * flags: XEN_NETIF_EXTRA_FLAG_* | ||
| 796 | * addr: address to add/remove | ||
| 797 | * | ||
| 798 | * XEN_NETIF_EXTRA_TYPE_HASH: | ||
| 799 | * | ||
| 800 | * A backend that supports teoplitz hashing is assumed to accept | ||
| 801 | * this type of extra info in transmit packets. | ||
| 802 | * A frontend that enables hashing is assumed to accept | ||
| 803 | * this type of extra info in receive packets. | ||
| 804 | * | ||
| 805 | * 0 1 2 3 4 5 6 7 octet | ||
| 806 | * +-----+-----+-----+-----+-----+-----+-----+-----+ | ||
| 807 | * |type |flags|htype| alg |LSB ---- value ---- MSB| | ||
| 808 | * +-----+-----+-----+-----+-----+-----+-----+-----+ | ||
| 809 | * | ||
| 810 | * type: Must be XEN_NETIF_EXTRA_TYPE_HASH | ||
| 811 | * flags: XEN_NETIF_EXTRA_FLAG_* | ||
| 812 | * htype: Hash type (one of _XEN_NETIF_CTRL_HASH_TYPE_* - see above) | ||
| 813 | * alg: The algorithm used to calculate the hash (one of | ||
| 814 | * XEN_NETIF_CTRL_HASH_TYPE_ALGORITHM_* - see above) | ||
| 815 | * value: Hash value | ||
| 129 | */ | 816 | */ |
| 130 | 817 | ||
| 131 | /* Protocol checksum field is blank in the packet (hardware offload)? */ | 818 | /* Protocol checksum field is blank in the packet (hardware offload)? */ |
| 132 | #define _XEN_NETTXF_csum_blank (0) | 819 | #define _XEN_NETTXF_csum_blank (0) |
| 133 | #define XEN_NETTXF_csum_blank (1U<<_XEN_NETTXF_csum_blank) | 820 | #define XEN_NETTXF_csum_blank (1U<<_XEN_NETTXF_csum_blank) |
| 134 | 821 | ||
| 135 | /* Packet data has been validated against protocol checksum. */ | 822 | /* Packet data has been validated against protocol checksum. */ |
| 136 | #define _XEN_NETTXF_data_validated (1) | 823 | #define _XEN_NETTXF_data_validated (1) |
| 137 | #define XEN_NETTXF_data_validated (1U<<_XEN_NETTXF_data_validated) | 824 | #define XEN_NETTXF_data_validated (1U<<_XEN_NETTXF_data_validated) |
| 138 | 825 | ||
| 139 | /* Packet continues in the next request descriptor. */ | 826 | /* Packet continues in the next request descriptor. */ |
| 140 | #define _XEN_NETTXF_more_data (2) | 827 | #define _XEN_NETTXF_more_data (2) |
| 141 | #define XEN_NETTXF_more_data (1U<<_XEN_NETTXF_more_data) | 828 | #define XEN_NETTXF_more_data (1U<<_XEN_NETTXF_more_data) |
| 142 | 829 | ||
| 143 | /* Packet to be followed by extra descriptor(s). */ | 830 | /* Packet to be followed by extra descriptor(s). */ |
| 144 | #define _XEN_NETTXF_extra_info (3) | 831 | #define _XEN_NETTXF_extra_info (3) |
| 145 | #define XEN_NETTXF_extra_info (1U<<_XEN_NETTXF_extra_info) | 832 | #define XEN_NETTXF_extra_info (1U<<_XEN_NETTXF_extra_info) |
| 146 | 833 | ||
| 147 | #define XEN_NETIF_MAX_TX_SIZE 0xFFFF | 834 | #define XEN_NETIF_MAX_TX_SIZE 0xFFFF |
| 148 | struct xen_netif_tx_request { | 835 | struct xen_netif_tx_request { |
| 149 | grant_ref_t gref; /* Reference to buffer page */ | 836 | grant_ref_t gref; |
| 150 | uint16_t offset; /* Offset within buffer page */ | 837 | uint16_t offset; |
| 151 | uint16_t flags; /* XEN_NETTXF_* */ | 838 | uint16_t flags; |
| 152 | uint16_t id; /* Echoed in response message. */ | 839 | uint16_t id; |
| 153 | uint16_t size; /* Packet size in bytes. */ | 840 | uint16_t size; |
| 154 | }; | 841 | }; |
| 155 | 842 | ||
| 156 | /* Types of xen_netif_extra_info descriptors. */ | 843 | /* Types of xen_netif_extra_info descriptors. */ |
| 157 | #define XEN_NETIF_EXTRA_TYPE_NONE (0) /* Never used - invalid */ | 844 | #define XEN_NETIF_EXTRA_TYPE_NONE (0) /* Never used - invalid */ |
| 158 | #define XEN_NETIF_EXTRA_TYPE_GSO (1) /* u.gso */ | 845 | #define XEN_NETIF_EXTRA_TYPE_GSO (1) /* u.gso */ |
| 159 | #define XEN_NETIF_EXTRA_TYPE_MCAST_ADD (2) /* u.mcast */ | 846 | #define XEN_NETIF_EXTRA_TYPE_MCAST_ADD (2) /* u.mcast */ |
| 160 | #define XEN_NETIF_EXTRA_TYPE_MCAST_DEL (3) /* u.mcast */ | 847 | #define XEN_NETIF_EXTRA_TYPE_MCAST_DEL (3) /* u.mcast */ |
| 161 | #define XEN_NETIF_EXTRA_TYPE_MAX (4) | 848 | #define XEN_NETIF_EXTRA_TYPE_HASH (4) /* u.hash */ |
| 849 | #define XEN_NETIF_EXTRA_TYPE_MAX (5) | ||
| 162 | 850 | ||
| 163 | /* xen_netif_extra_info flags. */ | 851 | /* xen_netif_extra_info_t flags. */ |
| 164 | #define _XEN_NETIF_EXTRA_FLAG_MORE (0) | 852 | #define _XEN_NETIF_EXTRA_FLAG_MORE (0) |
| 165 | #define XEN_NETIF_EXTRA_FLAG_MORE (1U<<_XEN_NETIF_EXTRA_FLAG_MORE) | 853 | #define XEN_NETIF_EXTRA_FLAG_MORE (1U<<_XEN_NETIF_EXTRA_FLAG_MORE) |
| 166 | 854 | ||
| 167 | /* GSO types */ | 855 | /* GSO types */ |
| 168 | #define XEN_NETIF_GSO_TYPE_NONE (0) | 856 | #define XEN_NETIF_GSO_TYPE_NONE (0) |
| 169 | #define XEN_NETIF_GSO_TYPE_TCPV4 (1) | 857 | #define XEN_NETIF_GSO_TYPE_TCPV4 (1) |
| 170 | #define XEN_NETIF_GSO_TYPE_TCPV6 (2) | 858 | #define XEN_NETIF_GSO_TYPE_TCPV6 (2) |
| 171 | 859 | ||
| 172 | /* | 860 | /* |
| 173 | * This structure needs to fit within both netif_tx_request and | 861 | * This structure needs to fit within both xen_netif_tx_request_t and |
| 174 | * netif_rx_response for compatibility. | 862 | * xen_netif_rx_response_t for compatibility. |
| 175 | */ | 863 | */ |
| 176 | struct xen_netif_extra_info { | 864 | struct xen_netif_extra_info { |
| 177 | uint8_t type; /* XEN_NETIF_EXTRA_TYPE_* */ | 865 | uint8_t type; |
| 178 | uint8_t flags; /* XEN_NETIF_EXTRA_FLAG_* */ | 866 | uint8_t flags; |
| 179 | |||
| 180 | union { | 867 | union { |
| 181 | struct { | 868 | struct { |
| 182 | /* | ||
| 183 | * Maximum payload size of each segment. For | ||
| 184 | * example, for TCP this is just the path MSS. | ||
| 185 | */ | ||
| 186 | uint16_t size; | 869 | uint16_t size; |
| 187 | 870 | uint8_t type; | |
| 188 | /* | ||
| 189 | * GSO type. This determines the protocol of | ||
| 190 | * the packet and any extra features required | ||
| 191 | * to segment the packet properly. | ||
| 192 | */ | ||
| 193 | uint8_t type; /* XEN_NETIF_GSO_TYPE_* */ | ||
| 194 | |||
| 195 | /* Future expansion. */ | ||
| 196 | uint8_t pad; | 871 | uint8_t pad; |
| 197 | 872 | uint16_t features; | |
| 198 | /* | ||
| 199 | * GSO features. This specifies any extra GSO | ||
| 200 | * features required to process this packet, | ||
| 201 | * such as ECN support for TCPv4. | ||
| 202 | */ | ||
| 203 | uint16_t features; /* XEN_NETIF_GSO_FEAT_* */ | ||
| 204 | } gso; | 873 | } gso; |
| 205 | |||
| 206 | struct { | 874 | struct { |
| 207 | uint8_t addr[6]; /* Address to add/remove. */ | 875 | uint8_t addr[6]; |
| 208 | } mcast; | 876 | } mcast; |
| 209 | 877 | struct { | |
| 878 | uint8_t type; | ||
| 879 | uint8_t algorithm; | ||
| 880 | uint8_t value[4]; | ||
| 881 | } hash; | ||
| 210 | uint16_t pad[3]; | 882 | uint16_t pad[3]; |
| 211 | } u; | 883 | } u; |
| 212 | }; | 884 | }; |
| 213 | 885 | ||
| 214 | struct xen_netif_tx_response { | 886 | struct xen_netif_tx_response { |
| 215 | uint16_t id; | 887 | uint16_t id; |
| 216 | int16_t status; /* XEN_NETIF_RSP_* */ | 888 | int16_t status; |
| 217 | }; | 889 | }; |
| 218 | 890 | ||
| 219 | struct xen_netif_rx_request { | 891 | struct xen_netif_rx_request { |
| 220 | uint16_t id; /* Echoed in response message. */ | 892 | uint16_t id; /* Echoed in response message. */ |
| 221 | grant_ref_t gref; /* Reference to incoming granted frame */ | 893 | uint16_t pad; |
| 894 | grant_ref_t gref; | ||
| 222 | }; | 895 | }; |
| 223 | 896 | ||
| 224 | /* Packet data has been validated against protocol checksum. */ | 897 | /* Packet data has been validated against protocol checksum. */ |
| 225 | #define _XEN_NETRXF_data_validated (0) | 898 | #define _XEN_NETRXF_data_validated (0) |
| 226 | #define XEN_NETRXF_data_validated (1U<<_XEN_NETRXF_data_validated) | 899 | #define XEN_NETRXF_data_validated (1U<<_XEN_NETRXF_data_validated) |
| 227 | 900 | ||
| 228 | /* Protocol checksum field is blank in the packet (hardware offload)? */ | 901 | /* Protocol checksum field is blank in the packet (hardware offload)? */ |
| 229 | #define _XEN_NETRXF_csum_blank (1) | 902 | #define _XEN_NETRXF_csum_blank (1) |
| 230 | #define XEN_NETRXF_csum_blank (1U<<_XEN_NETRXF_csum_blank) | 903 | #define XEN_NETRXF_csum_blank (1U<<_XEN_NETRXF_csum_blank) |
| 231 | 904 | ||
| 232 | /* Packet continues in the next request descriptor. */ | 905 | /* Packet continues in the next request descriptor. */ |
| 233 | #define _XEN_NETRXF_more_data (2) | 906 | #define _XEN_NETRXF_more_data (2) |
| 234 | #define XEN_NETRXF_more_data (1U<<_XEN_NETRXF_more_data) | 907 | #define XEN_NETRXF_more_data (1U<<_XEN_NETRXF_more_data) |
| 235 | 908 | ||
| 236 | /* Packet to be followed by extra descriptor(s). */ | 909 | /* Packet to be followed by extra descriptor(s). */ |
| 237 | #define _XEN_NETRXF_extra_info (3) | 910 | #define _XEN_NETRXF_extra_info (3) |
| 238 | #define XEN_NETRXF_extra_info (1U<<_XEN_NETRXF_extra_info) | 911 | #define XEN_NETRXF_extra_info (1U<<_XEN_NETRXF_extra_info) |
| 239 | 912 | ||
| 240 | /* GSO Prefix descriptor. */ | 913 | /* Packet has GSO prefix. Deprecated but included for compatibility */ |
| 241 | #define _XEN_NETRXF_gso_prefix (4) | 914 | #define _XEN_NETRXF_gso_prefix (4) |
| 242 | #define XEN_NETRXF_gso_prefix (1U<<_XEN_NETRXF_gso_prefix) | 915 | #define XEN_NETRXF_gso_prefix (1U<<_XEN_NETRXF_gso_prefix) |
| 243 | 916 | ||
| 244 | struct xen_netif_rx_response { | 917 | struct xen_netif_rx_response { |
| 245 | uint16_t id; | 918 | uint16_t id; |
| 246 | uint16_t offset; /* Offset in page of start of received packet */ | 919 | uint16_t offset; |
| 247 | uint16_t flags; /* XEN_NETRXF_* */ | 920 | uint16_t flags; |
| 248 | int16_t status; /* -ve: BLKIF_RSP_* ; +ve: Rx'ed pkt size. */ | 921 | int16_t status; |
| 249 | }; | 922 | }; |
| 250 | 923 | ||
| 251 | /* | 924 | /* |
| 252 | * Generate netif ring structures and types. | 925 | * Generate xen_netif ring structures and types. |
| 253 | */ | 926 | */ |
| 254 | 927 | ||
| 255 | DEFINE_RING_TYPES(xen_netif_tx, | 928 | DEFINE_RING_TYPES(xen_netif_tx, struct xen_netif_tx_request, |
| 256 | struct xen_netif_tx_request, | ||
| 257 | struct xen_netif_tx_response); | 929 | struct xen_netif_tx_response); |
| 258 | DEFINE_RING_TYPES(xen_netif_rx, | 930 | DEFINE_RING_TYPES(xen_netif_rx, struct xen_netif_rx_request, |
| 259 | struct xen_netif_rx_request, | ||
| 260 | struct xen_netif_rx_response); | 931 | struct xen_netif_rx_response); |
| 261 | 932 | ||
| 262 | #define XEN_NETIF_RSP_DROPPED -2 | 933 | #define XEN_NETIF_RSP_DROPPED -2 |
| 263 | #define XEN_NETIF_RSP_ERROR -1 | 934 | #define XEN_NETIF_RSP_ERROR -1 |
| 264 | #define XEN_NETIF_RSP_OKAY 0 | 935 | #define XEN_NETIF_RSP_OKAY 0 |
| 265 | /* No response: used for auxiliary requests (e.g., xen_netif_extra_info). */ | 936 | /* No response: used for auxiliary requests (e.g., xen_netif_extra_info_t). */ |
| 266 | #define XEN_NETIF_RSP_NULL 1 | 937 | #define XEN_NETIF_RSP_NULL 1 |
| 267 | 938 | ||
| 268 | #endif | 939 | #endif |
