1
0
Fork 0

Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net

Pull networking fixes from David Miller:
 "Several bug fixes, many are quick merge-window regression cures:

   - When NLM_F_EXCL is not set, allow same fib rule insertion. From
     Hangbin Liu.

   - Several cures in sja1105 DSA driver (while loop exit condition fix,
     return of negative u8, etc.) from Vladimir Oltean.

   - Handle tx/rx delays in realtek PHY driver properly, from Serge
     Semin.

   - Double free in cls_matchall, from Pieter Jansen van Vuuren.

   - Disable SIOCSHWTSTAMP in macvlan/vlan containers, from Hangbin Liu.

   - Endainness fixes in aqc111, from Oliver Neukum.

   - Handle errors in packet_init properly, from Haibing Yue.

   - Various W=1 warning fixes in kTLS, from Jakub Kicinski"

* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (34 commits)
  nfp: add missing kdoc
  net/tls: handle errors from padding_length()
  net/tls: remove set but not used variables
  docs/btf: fix the missing section marks
  nfp: bpf: fix static check error through tightening shift amount adjustment
  selftests: bpf: initialize bpf_object pointers where needed
  packet: Fix error path in packet_init
  net/tcp: use deferred jump label for TCP acked data hook
  net: aquantia: fix undefined devm_hwmon_device_register_with_info reference
  aqc111: fix double endianness swap on BE
  aqc111: fix writing to the phy on BE
  aqc111: fix endianness issue in aqc111_change_mtu
  vlan: disable SIOCSHWTSTAMP in container
  macvlan: disable SIOCSHWTSTAMP in container
  tipc: fix hanging clients using poll with EPOLLOUT flag
  tuntap: synchronize through tfiles array instead of tun->numqueues
  tuntap: fix dividing by zero in ebpf queue selection
  dwmac4_prog_mtl_tx_algorithms() missing write operation
  ptp_qoriq: fix NULL access if ptp dt node missing
  net/sched: avoid double free on matchall reoffload
  ...
hifive-unleashed-5.2
Linus Torvalds 2019-05-09 17:00:51 -07:00
commit 601e6bcc4e
35 changed files with 250 additions and 74 deletions

View File

@ -578,6 +578,7 @@ For line_info, the line number and column number are defined as below:
#define BPF_LINE_INFO_LINE_COL(line_col) ((line_col) & 0x3ff) #define BPF_LINE_INFO_LINE_COL(line_col) ((line_col) & 0x3ff)
3.4 BPF_{PROG,MAP}_GET_NEXT_ID 3.4 BPF_{PROG,MAP}_GET_NEXT_ID
==============================
In kernel, every loaded program, map or btf has a unique id. The id won't In kernel, every loaded program, map or btf has a unique id. The id won't
change during the lifetime of a program, map, or btf. change during the lifetime of a program, map, or btf.
@ -587,6 +588,7 @@ each command, to user space, for bpf program or maps, respectively, so an
inspection tool can inspect all programs and maps. inspection tool can inspect all programs and maps.
3.5 BPF_{PROG,MAP}_GET_FD_BY_ID 3.5 BPF_{PROG,MAP}_GET_FD_BY_ID
===============================
An introspection tool cannot use id to get details about program or maps. An introspection tool cannot use id to get details about program or maps.
A file descriptor needs to be obtained first for reference-counting purpose. A file descriptor needs to be obtained first for reference-counting purpose.

View File

@ -1235,7 +1235,7 @@ static void gswip_port_fast_age(struct dsa_switch *ds, int port)
err = gswip_pce_table_entry_read(priv, &mac_bridge); err = gswip_pce_table_entry_read(priv, &mac_bridge);
if (err) { if (err) {
dev_err(priv->dev, "failed to read mac brigde: %d\n", dev_err(priv->dev, "failed to read mac bridge: %d\n",
err); err);
return; return;
} }
@ -1252,7 +1252,7 @@ static void gswip_port_fast_age(struct dsa_switch *ds, int port)
mac_bridge.valid = false; mac_bridge.valid = false;
err = gswip_pce_table_entry_write(priv, &mac_bridge); err = gswip_pce_table_entry_write(priv, &mac_bridge);
if (err) { if (err) {
dev_err(priv->dev, "failed to write mac brigde: %d\n", dev_err(priv->dev, "failed to write mac bridge: %d\n",
err); err);
return; return;
} }
@ -1328,7 +1328,7 @@ static int gswip_port_fdb(struct dsa_switch *ds, int port,
err = gswip_pce_table_entry_write(priv, &mac_bridge); err = gswip_pce_table_entry_write(priv, &mac_bridge);
if (err) if (err)
dev_err(priv->dev, "failed to write mac brigde: %d\n", err); dev_err(priv->dev, "failed to write mac bridge: %d\n", err);
return err; return err;
} }
@ -1360,7 +1360,7 @@ static int gswip_port_fdb_dump(struct dsa_switch *ds, int port,
err = gswip_pce_table_entry_read(priv, &mac_bridge); err = gswip_pce_table_entry_read(priv, &mac_bridge);
if (err) { if (err) {
dev_err(priv->dev, "failed to write mac brigde: %d\n", dev_err(priv->dev, "failed to write mac bridge: %d\n",
err); err);
return err; return err;
} }

View File

@ -1070,7 +1070,11 @@ static u8 sja1105_stp_state_get(struct sja1105_private *priv, int port)
return BR_STATE_LEARNING; return BR_STATE_LEARNING;
if (mac[port].ingress && mac[port].egress && mac[port].dyn_learn) if (mac[port].ingress && mac[port].egress && mac[port].dyn_learn)
return BR_STATE_FORWARDING; return BR_STATE_FORWARDING;
return -EINVAL; /* This is really an error condition if the MAC was in none of the STP
* states above. But treating the port as disabled does nothing, which
* is adequate, and it also resets the MAC to a known state later on.
*/
return BR_STATE_DISABLED;
} }
/* For situations where we need to change a setting at runtime that is only /* For situations where we need to change a setting at runtime that is only

View File

@ -466,14 +466,15 @@ int sja1105_static_config_upload(struct sja1105_private *priv)
"invalid, retrying...\n"); "invalid, retrying...\n");
continue; continue;
} }
} while (--retries && (status.crcchkl == 1 || status.crcchkg == 1 || /* Success! */
status.configs == 0 || status.ids == 1)); break;
} while (--retries);
if (!retries) { if (!retries) {
rc = -EIO; rc = -EIO;
dev_err(dev, "Failed to upload config to device, giving up\n"); dev_err(dev, "Failed to upload config to device, giving up\n");
goto out; goto out;
} else if (retries != RETRIES - 1) { } else if (retries != RETRIES) {
dev_info(dev, "Succeeded after %d tried\n", RETRIES - retries); dev_info(dev, "Succeeded after %d tried\n", RETRIES - retries);
} }
@ -483,7 +484,7 @@ out:
return rc; return rc;
} }
struct sja1105_regs sja1105et_regs = { static struct sja1105_regs sja1105et_regs = {
.device_id = 0x0, .device_id = 0x0,
.prod_id = 0x100BC3, .prod_id = 0x100BC3,
.status = 0x1, .status = 0x1,
@ -508,7 +509,7 @@ struct sja1105_regs sja1105et_regs = {
.rmii_ext_tx_clk = {0x100018, 0x10001F, 0x100026, 0x10002D, 0x100034}, .rmii_ext_tx_clk = {0x100018, 0x10001F, 0x100026, 0x10002D, 0x100034},
}; };
struct sja1105_regs sja1105pqrs_regs = { static struct sja1105_regs sja1105pqrs_regs = {
.device_id = 0x0, .device_id = 0x0,
.prod_id = 0x100BC3, .prod_id = 0x100BC3,
.status = 0x1, .status = 0x1,

View File

@ -13,6 +13,7 @@
#include "aq_drvinfo.h" #include "aq_drvinfo.h"
#if IS_REACHABLE(CONFIG_HWMON)
static int aq_hwmon_read(struct device *dev, enum hwmon_sensor_types type, static int aq_hwmon_read(struct device *dev, enum hwmon_sensor_types type,
u32 attr, int channel, long *value) u32 attr, int channel, long *value)
{ {
@ -123,3 +124,7 @@ int aq_drvinfo_init(struct net_device *ndev)
return err; return err;
} }
#else
int aq_drvinfo_init(struct net_device *ndev) { return 0; }
#endif

View File

@ -810,7 +810,7 @@ static int hns3_set_l2l3l4(struct sk_buff *skb, u8 ol4_proto,
u8 il4_proto, u32 *type_cs_vlan_tso, u8 il4_proto, u32 *type_cs_vlan_tso,
u32 *ol_type_vlan_len_msec) u32 *ol_type_vlan_len_msec)
{ {
unsigned char *l2_hdr = l2_hdr = skb->data; unsigned char *l2_hdr = skb->data;
u32 l4_proto = ol4_proto; u32 l4_proto = ol4_proto;
union l4_hdr_info l4; union l4_hdr_info l4;
union l3_hdr_info l3; union l3_hdr_info l3;

View File

@ -328,7 +328,18 @@ __emit_shf(struct nfp_prog *nfp_prog, u16 dst, enum alu_dst_ab dst_ab,
return; return;
} }
if (sc == SHF_SC_L_SHF) /* NFP shift instruction has something special. If shift direction is
* left then shift amount of 1 to 31 is specified as 32 minus the amount
* to shift.
*
* But no need to do this for indirect shift which has shift amount be
* 0. Even after we do this subtraction, shift amount 0 will be turned
* into 32 which will eventually be encoded the same as 0 because only
* low 5 bits are encoded, but shift amount be 32 will fail the
* FIELD_PREP check done later on shift mask (0x1f), due to 32 is out of
* mask range.
*/
if (sc == SHF_SC_L_SHF && shift)
shift = 32 - shift; shift = 32 - shift;
insn = OP_SHF_BASE | insn = OP_SHF_BASE |

View File

@ -54,6 +54,8 @@ static inline unsigned int nfp_ccm_get_tag(struct sk_buff *skb)
/** /**
* struct nfp_ccm - common control message handling * struct nfp_ccm - common control message handling
* @app: APP handle
*
* @tag_allocator: bitmap of control message tags in use * @tag_allocator: bitmap of control message tags in use
* @tag_alloc_next: next tag bit to allocate * @tag_alloc_next: next tag bit to allocate
* @tag_alloc_last: next tag bit to be freed * @tag_alloc_last: next tag bit to be freed

View File

@ -273,6 +273,7 @@ const struct net_device_ops nfp_repr_netdev_ops = {
.ndo_fix_features = nfp_repr_fix_features, .ndo_fix_features = nfp_repr_fix_features,
.ndo_set_features = nfp_port_set_features, .ndo_set_features = nfp_port_set_features,
.ndo_set_mac_address = eth_mac_addr, .ndo_set_mac_address = eth_mac_addr,
.ndo_get_port_parent_id = nfp_port_get_port_parent_id,
.ndo_get_devlink_port = nfp_devlink_get_devlink_port, .ndo_get_devlink_port = nfp_devlink_get_devlink_port,
}; };

View File

@ -30,6 +30,22 @@ struct nfp_port *nfp_port_from_netdev(struct net_device *netdev)
return NULL; return NULL;
} }
int nfp_port_get_port_parent_id(struct net_device *netdev,
struct netdev_phys_item_id *ppid)
{
struct nfp_port *port;
const u8 *serial;
port = nfp_port_from_netdev(netdev);
if (!port)
return -EOPNOTSUPP;
ppid->id_len = nfp_cpp_serial(port->app->cpp, &serial);
memcpy(&ppid->id, serial, ppid->id_len);
return 0;
}
int nfp_port_setup_tc(struct net_device *netdev, enum tc_setup_type type, int nfp_port_setup_tc(struct net_device *netdev, enum tc_setup_type type,
void *type_data) void *type_data)
{ {

View File

@ -192,6 +192,8 @@ static void dwmac4_prog_mtl_tx_algorithms(struct mac_device_info *hw,
default: default:
break; break;
} }
writel(value, ioaddr + MTL_OPERATION_MODE);
} }
static void dwmac4_set_mtl_tx_queue_weight(struct mac_device_info *hw, static void dwmac4_set_mtl_tx_queue_weight(struct mac_device_info *hw,

View File

@ -836,6 +836,8 @@ static int macvlan_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
switch (cmd) { switch (cmd) {
case SIOCSHWTSTAMP: case SIOCSHWTSTAMP:
if (!net_eq(dev_net(dev), &init_net))
break;
case SIOCGHWTSTAMP: case SIOCGHWTSTAMP:
if (netif_device_present(real_dev) && ops->ndo_do_ioctl) if (netif_device_present(real_dev) && ops->ndo_do_ioctl)
err = ops->ndo_do_ioctl(real_dev, &ifrr, cmd); err = ops->ndo_do_ioctl(real_dev, &ifrr, cmd);

View File

@ -23,11 +23,15 @@
#define RTL821x_INSR 0x13 #define RTL821x_INSR 0x13
#define RTL821x_EXT_PAGE_SELECT 0x1e
#define RTL821x_PAGE_SELECT 0x1f #define RTL821x_PAGE_SELECT 0x1f
#define RTL8211F_INSR 0x1d #define RTL8211F_INSR 0x1d
#define RTL8211F_TX_DELAY BIT(8) #define RTL8211F_TX_DELAY BIT(8)
#define RTL8211E_TX_DELAY BIT(1)
#define RTL8211E_RX_DELAY BIT(2)
#define RTL8211E_MODE_MII_GMII BIT(3)
#define RTL8201F_ISR 0x1e #define RTL8201F_ISR 0x1e
#define RTL8201F_IER 0x13 #define RTL8201F_IER 0x13
@ -157,16 +161,73 @@ static int rtl8211c_config_init(struct phy_device *phydev)
static int rtl8211f_config_init(struct phy_device *phydev) static int rtl8211f_config_init(struct phy_device *phydev)
{ {
u16 val = 0; u16 val;
/* enable TX-delay for rgmii-id and rgmii-txid, otherwise disable it */ /* enable TX-delay for rgmii-{id,txid}, and disable it for rgmii and
if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID || * rgmii-rxid. The RX-delay can be enabled by the external RXDLY pin.
phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID) */
switch (phydev->interface) {
case PHY_INTERFACE_MODE_RGMII:
case PHY_INTERFACE_MODE_RGMII_RXID:
val = 0;
break;
case PHY_INTERFACE_MODE_RGMII_ID:
case PHY_INTERFACE_MODE_RGMII_TXID:
val = RTL8211F_TX_DELAY; val = RTL8211F_TX_DELAY;
break;
default: /* the rest of the modes imply leaving delay as is. */
return 0;
}
return phy_modify_paged(phydev, 0xd08, 0x11, RTL8211F_TX_DELAY, val); return phy_modify_paged(phydev, 0xd08, 0x11, RTL8211F_TX_DELAY, val);
} }
static int rtl8211e_config_init(struct phy_device *phydev)
{
int ret = 0, oldpage;
u16 val;
/* enable TX/RX delay for rgmii-* modes, and disable them for rgmii. */
switch (phydev->interface) {
case PHY_INTERFACE_MODE_RGMII:
val = 0;
break;
case PHY_INTERFACE_MODE_RGMII_ID:
val = RTL8211E_TX_DELAY | RTL8211E_RX_DELAY;
break;
case PHY_INTERFACE_MODE_RGMII_RXID:
val = RTL8211E_RX_DELAY;
break;
case PHY_INTERFACE_MODE_RGMII_TXID:
val = RTL8211E_TX_DELAY;
break;
default: /* the rest of the modes imply leaving delays as is. */
return 0;
}
/* According to a sample driver there is a 0x1c config register on the
* 0xa4 extension page (0x7) layout. It can be used to disable/enable
* the RX/TX delays otherwise controlled by RXDLY/TXDLY pins. It can
* also be used to customize the whole configuration register:
* 8:6 = PHY Address, 5:4 = Auto-Negotiation, 3 = Interface Mode Select,
* 2 = RX Delay, 1 = TX Delay, 0 = SELRGV (see original PHY datasheet
* for details).
*/
oldpage = phy_select_page(phydev, 0x7);
if (oldpage < 0)
goto err_restore_page;
ret = phy_write(phydev, RTL821x_EXT_PAGE_SELECT, 0xa4);
if (ret)
goto err_restore_page;
ret = phy_modify(phydev, 0x1c, RTL8211E_TX_DELAY | RTL8211E_RX_DELAY,
val);
err_restore_page:
return phy_restore_page(phydev, oldpage, ret);
}
static int rtl8211b_suspend(struct phy_device *phydev) static int rtl8211b_suspend(struct phy_device *phydev)
{ {
phy_write(phydev, MII_MMD_DATA, BIT(9)); phy_write(phydev, MII_MMD_DATA, BIT(9));
@ -239,6 +300,7 @@ static struct phy_driver realtek_drvs[] = {
}, { }, {
PHY_ID_MATCH_EXACT(0x001cc915), PHY_ID_MATCH_EXACT(0x001cc915),
.name = "RTL8211E Gigabit Ethernet", .name = "RTL8211E Gigabit Ethernet",
.config_init = &rtl8211e_config_init,
.ack_interrupt = &rtl821x_ack_interrupt, .ack_interrupt = &rtl821x_ack_interrupt,
.config_intr = &rtl8211e_config_intr, .config_intr = &rtl8211e_config_intr,
.suspend = genphy_suspend, .suspend = genphy_suspend,

View File

@ -596,13 +596,18 @@ static u16 tun_automq_select_queue(struct tun_struct *tun, struct sk_buff *skb)
static u16 tun_ebpf_select_queue(struct tun_struct *tun, struct sk_buff *skb) static u16 tun_ebpf_select_queue(struct tun_struct *tun, struct sk_buff *skb)
{ {
struct tun_prog *prog; struct tun_prog *prog;
u32 numqueues;
u16 ret = 0; u16 ret = 0;
numqueues = READ_ONCE(tun->numqueues);
if (!numqueues)
return 0;
prog = rcu_dereference(tun->steering_prog); prog = rcu_dereference(tun->steering_prog);
if (prog) if (prog)
ret = bpf_prog_run_clear_cb(prog->prog, skb); ret = bpf_prog_run_clear_cb(prog->prog, skb);
return ret % tun->numqueues; return ret % numqueues;
} }
static u16 tun_select_queue(struct net_device *dev, struct sk_buff *skb, static u16 tun_select_queue(struct net_device *dev, struct sk_buff *skb,
@ -699,6 +704,8 @@ static void __tun_detach(struct tun_file *tfile, bool clean)
tun->tfiles[tun->numqueues - 1]); tun->tfiles[tun->numqueues - 1]);
ntfile = rtnl_dereference(tun->tfiles[index]); ntfile = rtnl_dereference(tun->tfiles[index]);
ntfile->queue_index = index; ntfile->queue_index = index;
rcu_assign_pointer(tun->tfiles[tun->numqueues - 1],
NULL);
--tun->numqueues; --tun->numqueues;
if (clean) { if (clean) {
@ -1081,7 +1088,7 @@ static netdev_tx_t tun_net_xmit(struct sk_buff *skb, struct net_device *dev)
tfile = rcu_dereference(tun->tfiles[txq]); tfile = rcu_dereference(tun->tfiles[txq]);
/* Drop packet if interface is not attached */ /* Drop packet if interface is not attached */
if (txq >= tun->numqueues) if (!tfile)
goto drop; goto drop;
if (!rcu_dereference(tun->steering_prog)) if (!rcu_dereference(tun->steering_prog))
@ -1304,6 +1311,7 @@ static int tun_xdp_xmit(struct net_device *dev, int n,
rcu_read_lock(); rcu_read_lock();
resample:
numqueues = READ_ONCE(tun->numqueues); numqueues = READ_ONCE(tun->numqueues);
if (!numqueues) { if (!numqueues) {
rcu_read_unlock(); rcu_read_unlock();
@ -1312,6 +1320,8 @@ static int tun_xdp_xmit(struct net_device *dev, int n,
tfile = rcu_dereference(tun->tfiles[smp_processor_id() % tfile = rcu_dereference(tun->tfiles[smp_processor_id() %
numqueues]); numqueues]);
if (unlikely(!tfile))
goto resample;
spin_lock(&tfile->tx_ring.producer_lock); spin_lock(&tfile->tx_ring.producer_lock);
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {

View File

@ -320,6 +320,7 @@ static int aqc111_get_link_ksettings(struct net_device *net,
static void aqc111_set_phy_speed(struct usbnet *dev, u8 autoneg, u16 speed) static void aqc111_set_phy_speed(struct usbnet *dev, u8 autoneg, u16 speed)
{ {
struct aqc111_data *aqc111_data = dev->driver_priv; struct aqc111_data *aqc111_data = dev->driver_priv;
u32 phy_on_the_wire;
aqc111_data->phy_cfg &= ~AQ_ADV_MASK; aqc111_data->phy_cfg &= ~AQ_ADV_MASK;
aqc111_data->phy_cfg |= AQ_PAUSE; aqc111_data->phy_cfg |= AQ_PAUSE;
@ -361,7 +362,8 @@ static void aqc111_set_phy_speed(struct usbnet *dev, u8 autoneg, u16 speed)
} }
} }
aqc111_write32_cmd(dev, AQ_PHY_OPS, 0, 0, &aqc111_data->phy_cfg); phy_on_the_wire = aqc111_data->phy_cfg;
aqc111_write32_cmd(dev, AQ_PHY_OPS, 0, 0, &phy_on_the_wire);
} }
static int aqc111_set_link_ksettings(struct net_device *net, static int aqc111_set_link_ksettings(struct net_device *net,
@ -453,6 +455,8 @@ static int aqc111_change_mtu(struct net_device *net, int new_mtu)
reg16 = 0x1420; reg16 = 0x1420;
else if (dev->net->mtu <= 16334) else if (dev->net->mtu <= 16334)
reg16 = 0x1A20; reg16 = 0x1A20;
else
return 0;
aqc111_write16_cmd(dev, AQ_ACCESS_MAC, SFR_PAUSE_WATERLVL_LOW, aqc111_write16_cmd(dev, AQ_ACCESS_MAC, SFR_PAUSE_WATERLVL_LOW,
2, &reg16); 2, &reg16);
@ -753,6 +757,7 @@ static void aqc111_unbind(struct usbnet *dev, struct usb_interface *intf)
{ {
struct aqc111_data *aqc111_data = dev->driver_priv; struct aqc111_data *aqc111_data = dev->driver_priv;
u16 reg16; u16 reg16;
u32 phy_on_the_wire;
/* Force bz */ /* Force bz */
reg16 = SFR_PHYPWR_RSTCTL_BZ; reg16 = SFR_PHYPWR_RSTCTL_BZ;
@ -766,8 +771,9 @@ static void aqc111_unbind(struct usbnet *dev, struct usb_interface *intf)
aqc111_data->phy_cfg &= ~AQ_ADV_MASK; aqc111_data->phy_cfg &= ~AQ_ADV_MASK;
aqc111_data->phy_cfg |= AQ_LOW_POWER; aqc111_data->phy_cfg |= AQ_LOW_POWER;
aqc111_data->phy_cfg &= ~AQ_PHY_POWER_EN; aqc111_data->phy_cfg &= ~AQ_PHY_POWER_EN;
phy_on_the_wire = aqc111_data->phy_cfg;
aqc111_write32_cmd_nopm(dev, AQ_PHY_OPS, 0, 0, aqc111_write32_cmd_nopm(dev, AQ_PHY_OPS, 0, 0,
&aqc111_data->phy_cfg); &phy_on_the_wire);
kfree(aqc111_data); kfree(aqc111_data);
} }
@ -990,6 +996,7 @@ static int aqc111_reset(struct usbnet *dev)
{ {
struct aqc111_data *aqc111_data = dev->driver_priv; struct aqc111_data *aqc111_data = dev->driver_priv;
u8 reg8 = 0; u8 reg8 = 0;
u32 phy_on_the_wire;
dev->rx_urb_size = URB_SIZE; dev->rx_urb_size = URB_SIZE;
@ -1002,8 +1009,9 @@ static int aqc111_reset(struct usbnet *dev)
/* Power up ethernet PHY */ /* Power up ethernet PHY */
aqc111_data->phy_cfg = AQ_PHY_POWER_EN; aqc111_data->phy_cfg = AQ_PHY_POWER_EN;
phy_on_the_wire = aqc111_data->phy_cfg;
aqc111_write32_cmd(dev, AQ_PHY_OPS, 0, 0, aqc111_write32_cmd(dev, AQ_PHY_OPS, 0, 0,
&aqc111_data->phy_cfg); &phy_on_the_wire);
/* Set the MAC address */ /* Set the MAC address */
aqc111_write_cmd(dev, AQ_ACCESS_MAC, SFR_NODE_ID, ETH_ALEN, aqc111_write_cmd(dev, AQ_ACCESS_MAC, SFR_NODE_ID, ETH_ALEN,
@ -1034,6 +1042,7 @@ static int aqc111_stop(struct usbnet *dev)
{ {
struct aqc111_data *aqc111_data = dev->driver_priv; struct aqc111_data *aqc111_data = dev->driver_priv;
u16 reg16 = 0; u16 reg16 = 0;
u32 phy_on_the_wire;
aqc111_read16_cmd(dev, AQ_ACCESS_MAC, SFR_MEDIUM_STATUS_MODE, aqc111_read16_cmd(dev, AQ_ACCESS_MAC, SFR_MEDIUM_STATUS_MODE,
2, &reg16); 2, &reg16);
@ -1045,8 +1054,9 @@ static int aqc111_stop(struct usbnet *dev)
/* Put PHY to low power*/ /* Put PHY to low power*/
aqc111_data->phy_cfg |= AQ_LOW_POWER; aqc111_data->phy_cfg |= AQ_LOW_POWER;
phy_on_the_wire = aqc111_data->phy_cfg;
aqc111_write32_cmd(dev, AQ_PHY_OPS, 0, 0, aqc111_write32_cmd(dev, AQ_PHY_OPS, 0, 0,
&aqc111_data->phy_cfg); &phy_on_the_wire);
netif_carrier_off(dev->net); netif_carrier_off(dev->net);
@ -1322,6 +1332,7 @@ static int aqc111_suspend(struct usb_interface *intf, pm_message_t message)
u16 temp_rx_ctrl = 0x00; u16 temp_rx_ctrl = 0x00;
u16 reg16; u16 reg16;
u8 reg8; u8 reg8;
u32 phy_on_the_wire;
usbnet_suspend(intf, message); usbnet_suspend(intf, message);
@ -1393,12 +1404,14 @@ static int aqc111_suspend(struct usb_interface *intf, pm_message_t message)
aqc111_write_cmd(dev, AQ_WOL_CFG, 0, 0, aqc111_write_cmd(dev, AQ_WOL_CFG, 0, 0,
WOL_CFG_SIZE, &wol_cfg); WOL_CFG_SIZE, &wol_cfg);
phy_on_the_wire = aqc111_data->phy_cfg;
aqc111_write32_cmd(dev, AQ_PHY_OPS, 0, 0, aqc111_write32_cmd(dev, AQ_PHY_OPS, 0, 0,
&aqc111_data->phy_cfg); &phy_on_the_wire);
} else { } else {
aqc111_data->phy_cfg |= AQ_LOW_POWER; aqc111_data->phy_cfg |= AQ_LOW_POWER;
phy_on_the_wire = aqc111_data->phy_cfg;
aqc111_write32_cmd(dev, AQ_PHY_OPS, 0, 0, aqc111_write32_cmd(dev, AQ_PHY_OPS, 0, 0,
&aqc111_data->phy_cfg); &phy_on_the_wire);
/* Disable RX path */ /* Disable RX path */
aqc111_read16_cmd_nopm(dev, AQ_ACCESS_MAC, aqc111_read16_cmd_nopm(dev, AQ_ACCESS_MAC,
@ -1415,7 +1428,7 @@ static int aqc111_resume(struct usb_interface *intf)
{ {
struct usbnet *dev = usb_get_intfdata(intf); struct usbnet *dev = usb_get_intfdata(intf);
struct aqc111_data *aqc111_data = dev->driver_priv; struct aqc111_data *aqc111_data = dev->driver_priv;
u16 reg16; u16 reg16, oldreg16;
u8 reg8; u8 reg8;
netif_carrier_off(dev->net); netif_carrier_off(dev->net);
@ -1431,9 +1444,11 @@ static int aqc111_resume(struct usb_interface *intf)
/* Configure RX control register => start operation */ /* Configure RX control register => start operation */
reg16 = aqc111_data->rxctl; reg16 = aqc111_data->rxctl;
reg16 &= ~SFR_RX_CTL_START; reg16 &= ~SFR_RX_CTL_START;
/* needs to be saved in case endianness is swapped */
oldreg16 = reg16;
aqc111_write16_cmd_nopm(dev, AQ_ACCESS_MAC, SFR_RX_CTL, 2, &reg16); aqc111_write16_cmd_nopm(dev, AQ_ACCESS_MAC, SFR_RX_CTL, 2, &reg16);
reg16 |= SFR_RX_CTL_START; reg16 = oldreg16 | SFR_RX_CTL_START;
aqc111_write16_cmd_nopm(dev, AQ_ACCESS_MAC, SFR_RX_CTL, 2, &reg16); aqc111_write16_cmd_nopm(dev, AQ_ACCESS_MAC, SFR_RX_CTL, 2, &reg16);
aqc111_set_phy_speed(dev, aqc111_data->autoneg, aqc111_set_phy_speed(dev, aqc111_data->autoneg,

View File

@ -467,6 +467,9 @@ int ptp_qoriq_init(struct ptp_qoriq *ptp_qoriq, void __iomem *base,
unsigned long flags; unsigned long flags;
u32 tmr_ctrl; u32 tmr_ctrl;
if (!node)
return -ENODEV;
ptp_qoriq->base = base; ptp_qoriq->base = base;
ptp_qoriq->caps = *caps; ptp_qoriq->caps = *caps;

View File

@ -2198,7 +2198,7 @@ extern struct static_key_false tcp_have_smc;
void clean_acked_data_enable(struct inet_connection_sock *icsk, void clean_acked_data_enable(struct inet_connection_sock *icsk,
void (*cad)(struct sock *sk, u32 ack_seq)); void (*cad)(struct sock *sk, u32 ack_seq));
void clean_acked_data_disable(struct inet_connection_sock *icsk); void clean_acked_data_disable(struct inet_connection_sock *icsk);
void clean_acked_data_flush(void);
#endif #endif
#endif /* _TCP_H */ #endif /* _TCP_H */

View File

@ -370,10 +370,12 @@ static int vlan_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
ifrr.ifr_ifru = ifr->ifr_ifru; ifrr.ifr_ifru = ifr->ifr_ifru;
switch (cmd) { switch (cmd) {
case SIOCSHWTSTAMP:
if (!net_eq(dev_net(dev), &init_net))
break;
case SIOCGMIIPHY: case SIOCGMIIPHY:
case SIOCGMIIREG: case SIOCGMIIREG:
case SIOCSMIIREG: case SIOCSMIIREG:
case SIOCSHWTSTAMP:
case SIOCGHWTSTAMP: case SIOCGHWTSTAMP:
if (netif_device_present(real_dev) && ops->ndo_do_ioctl) if (netif_device_present(real_dev) && ops->ndo_do_ioctl)
err = ops->ndo_do_ioctl(real_dev, &ifrr, cmd); err = ops->ndo_do_ioctl(real_dev, &ifrr, cmd);

View File

@ -168,6 +168,7 @@ int batadv_mesh_init(struct net_device *soft_iface)
spin_lock_init(&bat_priv->tt.commit_lock); spin_lock_init(&bat_priv->tt.commit_lock);
spin_lock_init(&bat_priv->gw.list_lock); spin_lock_init(&bat_priv->gw.list_lock);
#ifdef CONFIG_BATMAN_ADV_MCAST #ifdef CONFIG_BATMAN_ADV_MCAST
spin_lock_init(&bat_priv->mcast.mla_lock);
spin_lock_init(&bat_priv->mcast.want_lists_lock); spin_lock_init(&bat_priv->mcast.want_lists_lock);
#endif #endif
spin_lock_init(&bat_priv->tvlv.container_list_lock); spin_lock_init(&bat_priv->tvlv.container_list_lock);

View File

@ -13,7 +13,7 @@
#define BATADV_DRIVER_DEVICE "batman-adv" #define BATADV_DRIVER_DEVICE "batman-adv"
#ifndef BATADV_SOURCE_VERSION #ifndef BATADV_SOURCE_VERSION
#define BATADV_SOURCE_VERSION "2019.1" #define BATADV_SOURCE_VERSION "2019.2"
#endif #endif
/* B.A.T.M.A.N. parameters */ /* B.A.T.M.A.N. parameters */

View File

@ -314,8 +314,6 @@ static void batadv_mcast_mla_list_free(struct hlist_head *mcast_list)
* translation table except the ones listed in the given mcast_list. * translation table except the ones listed in the given mcast_list.
* *
* If mcast_list is NULL then all are retracted. * If mcast_list is NULL then all are retracted.
*
* Do not call outside of the mcast worker! (or cancel mcast worker first)
*/ */
static void batadv_mcast_mla_tt_retract(struct batadv_priv *bat_priv, static void batadv_mcast_mla_tt_retract(struct batadv_priv *bat_priv,
struct hlist_head *mcast_list) struct hlist_head *mcast_list)
@ -323,8 +321,6 @@ static void batadv_mcast_mla_tt_retract(struct batadv_priv *bat_priv,
struct batadv_hw_addr *mcast_entry; struct batadv_hw_addr *mcast_entry;
struct hlist_node *tmp; struct hlist_node *tmp;
WARN_ON(delayed_work_pending(&bat_priv->mcast.work));
hlist_for_each_entry_safe(mcast_entry, tmp, &bat_priv->mcast.mla_list, hlist_for_each_entry_safe(mcast_entry, tmp, &bat_priv->mcast.mla_list,
list) { list) {
if (mcast_list && if (mcast_list &&
@ -348,8 +344,6 @@ static void batadv_mcast_mla_tt_retract(struct batadv_priv *bat_priv,
* *
* Adds multicast listener announcements from the given mcast_list to the * Adds multicast listener announcements from the given mcast_list to the
* translation table if they have not been added yet. * translation table if they have not been added yet.
*
* Do not call outside of the mcast worker! (or cancel mcast worker first)
*/ */
static void batadv_mcast_mla_tt_add(struct batadv_priv *bat_priv, static void batadv_mcast_mla_tt_add(struct batadv_priv *bat_priv,
struct hlist_head *mcast_list) struct hlist_head *mcast_list)
@ -357,8 +351,6 @@ static void batadv_mcast_mla_tt_add(struct batadv_priv *bat_priv,
struct batadv_hw_addr *mcast_entry; struct batadv_hw_addr *mcast_entry;
struct hlist_node *tmp; struct hlist_node *tmp;
WARN_ON(delayed_work_pending(&bat_priv->mcast.work));
if (!mcast_list) if (!mcast_list)
return; return;
@ -647,7 +639,10 @@ static void batadv_mcast_mla_update(struct work_struct *work)
priv_mcast = container_of(delayed_work, struct batadv_priv_mcast, work); priv_mcast = container_of(delayed_work, struct batadv_priv_mcast, work);
bat_priv = container_of(priv_mcast, struct batadv_priv, mcast); bat_priv = container_of(priv_mcast, struct batadv_priv, mcast);
spin_lock(&bat_priv->mcast.mla_lock);
__batadv_mcast_mla_update(bat_priv); __batadv_mcast_mla_update(bat_priv);
spin_unlock(&bat_priv->mcast.mla_lock);
batadv_mcast_start_timer(bat_priv); batadv_mcast_start_timer(bat_priv);
} }

View File

@ -1211,6 +1211,11 @@ struct batadv_priv_mcast {
/** @bridged: whether the soft interface has a bridge on top */ /** @bridged: whether the soft interface has a bridge on top */
unsigned char bridged:1; unsigned char bridged:1;
/**
* @mla_lock: a lock protecting mla_list and mla_flags
*/
spinlock_t mla_lock;
/** /**
* @num_want_all_unsnoopables: number of nodes wanting unsnoopable IP * @num_want_all_unsnoopables: number of nodes wanting unsnoopable IP
* traffic * traffic

View File

@ -757,9 +757,9 @@ int fib_nl_newrule(struct sk_buff *skb, struct nlmsghdr *nlh,
if (err) if (err)
goto errout; goto errout;
if ((nlh->nlmsg_flags & NLM_F_EXCL) && if (rule_exists(ops, frh, tb, rule)) {
rule_exists(ops, frh, tb, rule)) { if (nlh->nlmsg_flags & NLM_F_EXCL)
err = -EEXIST; err = -EEXIST;
goto errout_free; goto errout_free;
} }

View File

@ -173,6 +173,7 @@ static int icmp_filter(const struct sock *sk, const struct sk_buff *skb)
static int raw_v4_input(struct sk_buff *skb, const struct iphdr *iph, int hash) static int raw_v4_input(struct sk_buff *skb, const struct iphdr *iph, int hash)
{ {
int sdif = inet_sdif(skb); int sdif = inet_sdif(skb);
int dif = inet_iif(skb);
struct sock *sk; struct sock *sk;
struct hlist_head *head; struct hlist_head *head;
int delivered = 0; int delivered = 0;
@ -185,8 +186,7 @@ static int raw_v4_input(struct sk_buff *skb, const struct iphdr *iph, int hash)
net = dev_net(skb->dev); net = dev_net(skb->dev);
sk = __raw_v4_lookup(net, __sk_head(head), iph->protocol, sk = __raw_v4_lookup(net, __sk_head(head), iph->protocol,
iph->saddr, iph->daddr, iph->saddr, iph->daddr, dif, sdif);
skb->dev->ifindex, sdif);
while (sk) { while (sk) {
delivered = 1; delivered = 1;

View File

@ -77,7 +77,7 @@
#include <asm/unaligned.h> #include <asm/unaligned.h>
#include <linux/errqueue.h> #include <linux/errqueue.h>
#include <trace/events/tcp.h> #include <trace/events/tcp.h>
#include <linux/static_key.h> #include <linux/jump_label_ratelimit.h>
#include <net/busy_poll.h> #include <net/busy_poll.h>
int sysctl_tcp_max_orphans __read_mostly = NR_FILE; int sysctl_tcp_max_orphans __read_mostly = NR_FILE;
@ -113,22 +113,28 @@ int sysctl_tcp_max_orphans __read_mostly = NR_FILE;
#define REXMIT_NEW 2 /* FRTO-style transmit of unsent/new packets */ #define REXMIT_NEW 2 /* FRTO-style transmit of unsent/new packets */
#if IS_ENABLED(CONFIG_TLS_DEVICE) #if IS_ENABLED(CONFIG_TLS_DEVICE)
static DEFINE_STATIC_KEY_FALSE(clean_acked_data_enabled); static DEFINE_STATIC_KEY_DEFERRED_FALSE(clean_acked_data_enabled, HZ);
void clean_acked_data_enable(struct inet_connection_sock *icsk, void clean_acked_data_enable(struct inet_connection_sock *icsk,
void (*cad)(struct sock *sk, u32 ack_seq)) void (*cad)(struct sock *sk, u32 ack_seq))
{ {
icsk->icsk_clean_acked = cad; icsk->icsk_clean_acked = cad;
static_branch_inc(&clean_acked_data_enabled); static_branch_inc(&clean_acked_data_enabled.key);
} }
EXPORT_SYMBOL_GPL(clean_acked_data_enable); EXPORT_SYMBOL_GPL(clean_acked_data_enable);
void clean_acked_data_disable(struct inet_connection_sock *icsk) void clean_acked_data_disable(struct inet_connection_sock *icsk)
{ {
static_branch_dec(&clean_acked_data_enabled); static_branch_slow_dec_deferred(&clean_acked_data_enabled);
icsk->icsk_clean_acked = NULL; icsk->icsk_clean_acked = NULL;
} }
EXPORT_SYMBOL_GPL(clean_acked_data_disable); EXPORT_SYMBOL_GPL(clean_acked_data_disable);
void clean_acked_data_flush(void)
{
static_key_deferred_flush(&clean_acked_data_enabled);
}
EXPORT_SYMBOL_GPL(clean_acked_data_flush);
#endif #endif
static void tcp_gro_dev_warn(struct sock *sk, const struct sk_buff *skb, static void tcp_gro_dev_warn(struct sock *sk, const struct sk_buff *skb,
@ -3598,7 +3604,7 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag)
icsk->icsk_retransmits = 0; icsk->icsk_retransmits = 0;
#if IS_ENABLED(CONFIG_TLS_DEVICE) #if IS_ENABLED(CONFIG_TLS_DEVICE)
if (static_branch_unlikely(&clean_acked_data_enabled)) if (static_branch_unlikely(&clean_acked_data_enabled.key))
if (icsk->icsk_clean_acked) if (icsk->icsk_clean_acked)
icsk->icsk_clean_acked(sk, ack); icsk->icsk_clean_acked(sk, ack);
#endif #endif

View File

@ -1322,7 +1322,7 @@ static int ovs_ct_add_helper(struct ovs_conntrack_info *info, const char *name,
return -ENOMEM; return -ENOMEM;
} }
#ifdef CONFIG_NF_NAT_NEEDED #if IS_ENABLED(CONFIG_NF_NAT)
if (info->nat) { if (info->nat) {
ret = nf_nat_helper_try_module_get(name, info->family, ret = nf_nat_helper_try_module_get(name, info->family,
key->ip.proto); key->ip.proto);
@ -1811,7 +1811,7 @@ void ovs_ct_free_action(const struct nlattr *a)
static void __ovs_ct_free_action(struct ovs_conntrack_info *ct_info) static void __ovs_ct_free_action(struct ovs_conntrack_info *ct_info)
{ {
if (ct_info->helper) { if (ct_info->helper) {
#ifdef CONFIG_NF_NAT_NEEDED #if IS_ENABLED(CONFIG_NF_NAT)
if (ct_info->nat) if (ct_info->nat)
nf_nat_helper_put(ct_info->helper); nf_nat_helper_put(ct_info->helper);
#endif #endif

View File

@ -4598,14 +4598,29 @@ static void __exit packet_exit(void)
static int __init packet_init(void) static int __init packet_init(void)
{ {
int rc = proto_register(&packet_proto, 0); int rc;
if (rc != 0) rc = proto_register(&packet_proto, 0);
if (rc)
goto out; goto out;
rc = sock_register(&packet_family_ops);
if (rc)
goto out_proto;
rc = register_pernet_subsys(&packet_net_ops);
if (rc)
goto out_sock;
rc = register_netdevice_notifier(&packet_netdev_notifier);
if (rc)
goto out_pernet;
sock_register(&packet_family_ops); return 0;
register_pernet_subsys(&packet_net_ops);
register_netdevice_notifier(&packet_netdev_notifier); out_pernet:
unregister_pernet_subsys(&packet_net_ops);
out_sock:
sock_unregister(PF_PACKET);
out_proto:
proto_unregister(&packet_proto);
out: out:
return rc; return rc;
} }

View File

@ -308,6 +308,7 @@ static int mall_reoffload(struct tcf_proto *tp, bool add, tc_setup_cb_t *cb,
NL_SET_ERR_MSG_MOD(extack, "Failed to setup flow action"); NL_SET_ERR_MSG_MOD(extack, "Failed to setup flow action");
return err; return err;
} }
return 0;
} }
err = cb(TC_SETUP_CLSMATCHALL, &cls_mall, cb_priv); err = cb(TC_SETUP_CLSMATCHALL, &cls_mall, cb_priv);

View File

@ -736,11 +736,11 @@ static __poll_t tipc_poll(struct file *file, struct socket *sock,
switch (sk->sk_state) { switch (sk->sk_state) {
case TIPC_ESTABLISHED: case TIPC_ESTABLISHED:
case TIPC_CONNECTING:
if (!tsk->cong_link_cnt && !tsk_conn_cong(tsk)) if (!tsk->cong_link_cnt && !tsk_conn_cong(tsk))
revents |= EPOLLOUT; revents |= EPOLLOUT;
/* fall through */ /* fall through */
case TIPC_LISTEN: case TIPC_LISTEN:
case TIPC_CONNECTING:
if (!skb_queue_empty(&sk->sk_receive_queue)) if (!skb_queue_empty(&sk->sk_receive_queue))
revents |= EPOLLIN | EPOLLRDNORM; revents |= EPOLLIN | EPOLLRDNORM;
break; break;
@ -2043,7 +2043,7 @@ static bool tipc_sk_filter_connect(struct tipc_sock *tsk, struct sk_buff *skb)
if (msg_data_sz(hdr)) if (msg_data_sz(hdr))
return true; return true;
/* Empty ACK-, - wake up sleeping connect() and drop */ /* Empty ACK-, - wake up sleeping connect() and drop */
sk->sk_data_ready(sk); sk->sk_state_change(sk);
msg_set_dest_droppable(hdr, 1); msg_set_dest_droppable(hdr, 1);
return false; return false;
} }

View File

@ -541,14 +541,11 @@ static int tls_device_push_pending_record(struct sock *sk, int flags)
void tls_device_write_space(struct sock *sk, struct tls_context *ctx) void tls_device_write_space(struct sock *sk, struct tls_context *ctx)
{ {
int rc = 0;
if (!sk->sk_write_pending && tls_is_partially_sent_record(ctx)) { if (!sk->sk_write_pending && tls_is_partially_sent_record(ctx)) {
gfp_t sk_allocation = sk->sk_allocation; gfp_t sk_allocation = sk->sk_allocation;
sk->sk_allocation = GFP_ATOMIC; sk->sk_allocation = GFP_ATOMIC;
rc = tls_push_partial_record(sk, ctx, tls_push_partial_record(sk, ctx, MSG_DONTWAIT | MSG_NOSIGNAL);
MSG_DONTWAIT | MSG_NOSIGNAL);
sk->sk_allocation = sk_allocation; sk->sk_allocation = sk_allocation;
} }
} }
@ -1036,4 +1033,5 @@ void __exit tls_device_cleanup(void)
{ {
unregister_netdevice_notifier(&tls_dev_notifier); unregister_netdevice_notifier(&tls_dev_notifier);
flush_work(&tls_device_gc_work); flush_work(&tls_device_gc_work);
clean_acked_data_flush();
} }

View File

@ -119,23 +119,25 @@ static int skb_nsg(struct sk_buff *skb, int offset, int len)
} }
static int padding_length(struct tls_sw_context_rx *ctx, static int padding_length(struct tls_sw_context_rx *ctx,
struct tls_context *tls_ctx, struct sk_buff *skb) struct tls_prot_info *prot, struct sk_buff *skb)
{ {
struct strp_msg *rxm = strp_msg(skb); struct strp_msg *rxm = strp_msg(skb);
int sub = 0; int sub = 0;
/* Determine zero-padding length */ /* Determine zero-padding length */
if (tls_ctx->prot_info.version == TLS_1_3_VERSION) { if (prot->version == TLS_1_3_VERSION) {
char content_type = 0; char content_type = 0;
int err; int err;
int back = 17; int back = 17;
while (content_type == 0) { while (content_type == 0) {
if (back > rxm->full_len) if (back > rxm->full_len - prot->prepend_size)
return -EBADMSG; return -EBADMSG;
err = skb_copy_bits(skb, err = skb_copy_bits(skb,
rxm->offset + rxm->full_len - back, rxm->offset + rxm->full_len - back,
&content_type, 1); &content_type, 1);
if (err)
return err;
if (content_type) if (content_type)
break; break;
sub++; sub++;
@ -170,9 +172,17 @@ static void tls_decrypt_done(struct crypto_async_request *req, int err)
tls_err_abort(skb->sk, err); tls_err_abort(skb->sk, err);
} else { } else {
struct strp_msg *rxm = strp_msg(skb); struct strp_msg *rxm = strp_msg(skb);
rxm->full_len -= padding_length(ctx, tls_ctx, skb); int pad;
rxm->offset += prot->prepend_size;
rxm->full_len -= prot->overhead_size; pad = padding_length(ctx, prot, skb);
if (pad < 0) {
ctx->async_wait.err = pad;
tls_err_abort(skb->sk, pad);
} else {
rxm->full_len -= pad;
rxm->offset += prot->prepend_size;
rxm->full_len -= prot->overhead_size;
}
} }
/* After using skb->sk to propagate sk through crypto async callback /* After using skb->sk to propagate sk through crypto async callback
@ -1478,7 +1488,7 @@ static int decrypt_skb_update(struct sock *sk, struct sk_buff *skb,
struct tls_prot_info *prot = &tls_ctx->prot_info; struct tls_prot_info *prot = &tls_ctx->prot_info;
int version = prot->version; int version = prot->version;
struct strp_msg *rxm = strp_msg(skb); struct strp_msg *rxm = strp_msg(skb);
int err = 0; int pad, err = 0;
if (!ctx->decrypted) { if (!ctx->decrypted) {
#ifdef CONFIG_TLS_DEVICE #ifdef CONFIG_TLS_DEVICE
@ -1501,7 +1511,11 @@ static int decrypt_skb_update(struct sock *sk, struct sk_buff *skb,
*zc = false; *zc = false;
} }
rxm->full_len -= padding_length(ctx, tls_ctx, skb); pad = padding_length(ctx, prot, skb);
if (pad < 0)
return pad;
rxm->full_len -= pad;
rxm->offset += prot->prepend_size; rxm->offset += prot->prepend_size;
rxm->full_len -= prot->overhead_size; rxm->full_len -= prot->overhead_size;
tls_advance_record_sn(sk, &tls_ctx->rx, version); tls_advance_record_sn(sk, &tls_ctx->rx, version);

View File

@ -4649,7 +4649,7 @@ static int selinux_socket_connect_helper(struct socket *sock,
struct lsm_network_audit net = {0,}; struct lsm_network_audit net = {0,};
struct sockaddr_in *addr4 = NULL; struct sockaddr_in *addr4 = NULL;
struct sockaddr_in6 *addr6 = NULL; struct sockaddr_in6 *addr6 = NULL;
unsigned short snum; unsigned short snum = 0;
u32 sid, perm; u32 sid, perm;
/* sctp_connectx(3) calls via selinux_sctp_bind_connect() /* sctp_connectx(3) calls via selinux_sctp_bind_connect()
@ -4674,12 +4674,12 @@ static int selinux_socket_connect_helper(struct socket *sock,
break; break;
default: default:
/* Note that SCTP services expect -EINVAL, whereas /* Note that SCTP services expect -EINVAL, whereas
* others expect -EAFNOSUPPORT. * others must handle this at the protocol level:
* connect(AF_UNSPEC) on a connected socket is
* a documented way disconnect the socket.
*/ */
if (sksec->sclass == SECCLASS_SCTP_SOCKET) if (sksec->sclass == SECCLASS_SCTP_SOCKET)
return -EINVAL; return -EINVAL;
else
return -EAFNOSUPPORT;
} }
err = sel_netport_sid(sk->sk_protocol, snum, &sid); err = sel_netport_sid(sk->sk_protocol, snum, &sid);

View File

@ -15,7 +15,7 @@ static int libbpf_debug_print(enum libbpf_print_level level,
static int check_load(const char *file) static int check_load(const char *file)
{ {
struct bpf_prog_load_attr attr; struct bpf_prog_load_attr attr;
struct bpf_object *obj; struct bpf_object *obj = NULL;
int err, prog_fd; int err, prog_fd;
memset(&attr, 0, sizeof(struct bpf_prog_load_attr)); memset(&attr, 0, sizeof(struct bpf_prog_load_attr));

View File

@ -9,7 +9,7 @@ static void test_task_fd_query_tp_core(const char *probe_name,
struct perf_event_attr attr = {}; struct perf_event_attr attr = {};
__u64 probe_offset, probe_addr; __u64 probe_offset, probe_addr;
__u32 len, prog_id, fd_type; __u32 len, prog_id, fd_type;
struct bpf_object *obj; struct bpf_object *obj = NULL;
__u32 duration = 0; __u32 duration = 0;
char buf[256]; char buf[256];

View File

@ -13,6 +13,9 @@ void test_tp_attach_query(void)
struct bpf_prog_info prog_info; struct bpf_prog_info prog_info;
char buf[256]; char buf[256];
for (i = 0; i < num_progs; i++)
obj[i] = NULL;
snprintf(buf, sizeof(buf), snprintf(buf, sizeof(buf),
"/sys/kernel/debug/tracing/events/sched/sched_switch/id"); "/sys/kernel/debug/tracing/events/sched/sched_switch/id");
efd = open(buf, O_RDONLY, 0); efd = open(buf, O_RDONLY, 0);