mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-09 07:23:14 +00:00
Including fixes from bpf and wifi.
Current release - regressions: - neighbour: fix __randomize_layout crash in struct neighbour - r8169: fix deadlock on RTL8125 in jumbo mtu mode Previous releases - regressions: - wifi: - mac80211: fix warning at station removal time - cfg80211: fix CQM for non-range use - tools: ynl-gen: fix unexpected response handling - octeontx2-af: fix possible buffer overflow - dpaa2: recycle the RX buffer only after all processing done - rswitch: fix missing dev_kfree_skb_any() in error path Previous releases - always broken: - ipv4: fix uaf issue when receiving igmp query packet - wifi: mac80211: fix debugfs deadlock at device removal time - bpf: - sockmap: af_unix stream sockets need to hold ref for pair sock - netdevsim: don't accept device bound programs - selftests: fix a char signedness issue - dsa: mv88e6xxx: fix marvell 6350 probe crash - octeontx2-pf: restore TC ingress police rules when interface is up - wangxun: fix memory leak on msix entry - ravb: keep reverse order of operations in ravb_remove() Signed-off-by: Paolo Abeni <pabeni@redhat.com> -----BEGIN PGP SIGNATURE----- iQJGBAABCAAwFiEEg1AjqC77wbdLX2LbKSR5jcyPE6QFAmVobzISHHBhYmVuaUBy ZWRoYXQuY29tAAoJECkkeY3MjxOk4rwP/2qaUstOJVpkO8cG+bRYi3idH9uO/8Yu dYgFI4LM826YgbVNVzuiu9Sh7t78dbep/fWQ2quDuZUinWtPmv6RV3UKbDyNWLRr iV7sZvXElGsUefixxGANYDUPuCrlr3O230Y8zCN0R65BMurppljs9Pp8FwIqaD+v pVs2alb/PeX7g+hPACKPr4Knu8QeZYmzdHoyYeLoMG3PqIgJVU3/8OHHfmnYCdxT VSss2LB5FKFCOgetEPGy83KQP7QVaK22GDphZJ4xh7aSewRVP92ORfauiI8To4vQ 0VnLNcQ+1pXnYzgGdv8oF02e4EP5b0jvrTpqCw1U0QU2s2PARJarzajCXBkwa308 gXELRpVRpY4+7WEBSX4RGUigurwGGEh/IP/puVtPDr9KU3lFgaTI8wM624Y3Ob/e /LVI7a5kUSJysq9/H/QrHjoiuTtV7nCmzBgDqEFSN5hQinSHYKyD0XsUPcLlMJmn p6CyQDGHv2ibbg+8TStig0xfmC83N8KfDfcCekSrYxquDMTRtfa2VXofzQiQKDnr XNyIURmZAAUVPR6enxlg5Iqzc0mQGumYif7wzsO1bzVzmVZgIDCVxU95hkoRrutU qnWXuUGUdieUvXA9HltntTzy2BgJVtg7L/p8YEbd97dxtgK80sbdnjfDswFvEeE4 nTvE+IDKdCmb =QiQp -----END PGP SIGNATURE----- Merge tag 'net-6.7-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net Pull networking fixes from Paolo Abeni: "Including fixes from bpf and wifi. Current release - regressions: - neighbour: fix __randomize_layout crash in struct neighbour - r8169: fix deadlock on RTL8125 in jumbo mtu mode Previous releases - regressions: - wifi: - mac80211: fix warning at station removal time - cfg80211: fix CQM for non-range use - tools: ynl-gen: fix unexpected response handling - octeontx2-af: fix possible buffer overflow - dpaa2: recycle the RX buffer only after all processing done - rswitch: fix missing dev_kfree_skb_any() in error path Previous releases - always broken: - ipv4: fix uaf issue when receiving igmp query packet - wifi: mac80211: fix debugfs deadlock at device removal time - bpf: - sockmap: af_unix stream sockets need to hold ref for pair sock - netdevsim: don't accept device bound programs - selftests: fix a char signedness issue - dsa: mv88e6xxx: fix marvell 6350 probe crash - octeontx2-pf: restore TC ingress police rules when interface is up - wangxun: fix memory leak on msix entry - ravb: keep reverse order of operations in ravb_remove()" * tag 'net-6.7-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (51 commits) net: ravb: Keep reverse order of operations in ravb_remove() net: ravb: Stop DMA in case of failures on ravb_open() net: ravb: Start TX queues after HW initialization succeeded net: ravb: Make write access to CXR35 first before accessing other EMAC registers net: ravb: Use pm_runtime_resume_and_get() net: ravb: Check return value of reset_control_deassert() net: libwx: fix memory leak on msix entry ice: Fix VF Reset paths when interface in a failed over aggregate bpf, sockmap: Add af_unix test with both sockets in map bpf, sockmap: af_unix stream sockets need to hold ref for pair sock tools: ynl-gen: always construct struct ynl_req_state ethtool: don't propagate EOPNOTSUPP from dumps ravb: Fix races between ravb_tx_timeout_work() and net related ops r8169: prevent potential deadlock in rtl8169_close r8169: fix deadlock on RTL8125 in jumbo mtu mode neighbour: Fix __randomize_layout crash in struct neighbour octeontx2-pf: Restore TC ingress police rules when interface is up octeontx2-pf: Fix adding mbox work queue entry when num_vfs > 64 net: stmmac: xgmac: Disable FPE MMC interrupts octeontx2-af: Fix possible buffer overflow ...
This commit is contained in:
commit
6172a5180f
@ -577,6 +577,18 @@ static void mv88e6250_phylink_get_caps(struct mv88e6xxx_chip *chip, int port,
|
||||
config->mac_capabilities = MAC_SYM_PAUSE | MAC_10 | MAC_100;
|
||||
}
|
||||
|
||||
static void mv88e6351_phylink_get_caps(struct mv88e6xxx_chip *chip, int port,
|
||||
struct phylink_config *config)
|
||||
{
|
||||
unsigned long *supported = config->supported_interfaces;
|
||||
|
||||
/* Translate the default cmode */
|
||||
mv88e6xxx_translate_cmode(chip->ports[port].cmode, supported);
|
||||
|
||||
config->mac_capabilities = MAC_SYM_PAUSE | MAC_10 | MAC_100 |
|
||||
MAC_1000FD;
|
||||
}
|
||||
|
||||
static int mv88e6352_get_port4_serdes_cmode(struct mv88e6xxx_chip *chip)
|
||||
{
|
||||
u16 reg, val;
|
||||
@ -3880,7 +3892,8 @@ static int mv88e6xxx_port_setup(struct dsa_switch *ds, int port)
|
||||
struct mv88e6xxx_chip *chip = ds->priv;
|
||||
int err;
|
||||
|
||||
if (chip->info->ops->pcs_ops->pcs_init) {
|
||||
if (chip->info->ops->pcs_ops &&
|
||||
chip->info->ops->pcs_ops->pcs_init) {
|
||||
err = chip->info->ops->pcs_ops->pcs_init(chip, port);
|
||||
if (err)
|
||||
return err;
|
||||
@ -3895,7 +3908,8 @@ static void mv88e6xxx_port_teardown(struct dsa_switch *ds, int port)
|
||||
|
||||
mv88e6xxx_teardown_devlink_regions_port(ds, port);
|
||||
|
||||
if (chip->info->ops->pcs_ops->pcs_teardown)
|
||||
if (chip->info->ops->pcs_ops &&
|
||||
chip->info->ops->pcs_ops->pcs_teardown)
|
||||
chip->info->ops->pcs_ops->pcs_teardown(chip, port);
|
||||
}
|
||||
|
||||
@ -4340,7 +4354,7 @@ static const struct mv88e6xxx_ops mv88e6171_ops = {
|
||||
.vtu_loadpurge = mv88e6352_g1_vtu_loadpurge,
|
||||
.stu_getnext = mv88e6352_g1_stu_getnext,
|
||||
.stu_loadpurge = mv88e6352_g1_stu_loadpurge,
|
||||
.phylink_get_caps = mv88e6185_phylink_get_caps,
|
||||
.phylink_get_caps = mv88e6351_phylink_get_caps,
|
||||
};
|
||||
|
||||
static const struct mv88e6xxx_ops mv88e6172_ops = {
|
||||
@ -4440,7 +4454,7 @@ static const struct mv88e6xxx_ops mv88e6175_ops = {
|
||||
.vtu_loadpurge = mv88e6352_g1_vtu_loadpurge,
|
||||
.stu_getnext = mv88e6352_g1_stu_getnext,
|
||||
.stu_loadpurge = mv88e6352_g1_stu_loadpurge,
|
||||
.phylink_get_caps = mv88e6185_phylink_get_caps,
|
||||
.phylink_get_caps = mv88e6351_phylink_get_caps,
|
||||
};
|
||||
|
||||
static const struct mv88e6xxx_ops mv88e6176_ops = {
|
||||
@ -5069,7 +5083,7 @@ static const struct mv88e6xxx_ops mv88e6350_ops = {
|
||||
.vtu_loadpurge = mv88e6352_g1_vtu_loadpurge,
|
||||
.stu_getnext = mv88e6352_g1_stu_getnext,
|
||||
.stu_loadpurge = mv88e6352_g1_stu_loadpurge,
|
||||
.phylink_get_caps = mv88e6185_phylink_get_caps,
|
||||
.phylink_get_caps = mv88e6351_phylink_get_caps,
|
||||
};
|
||||
|
||||
static const struct mv88e6xxx_ops mv88e6351_ops = {
|
||||
@ -5117,7 +5131,7 @@ static const struct mv88e6xxx_ops mv88e6351_ops = {
|
||||
.stu_loadpurge = mv88e6352_g1_stu_loadpurge,
|
||||
.avb_ops = &mv88e6352_avb_ops,
|
||||
.ptp_ops = &mv88e6352_ptp_ops,
|
||||
.phylink_get_caps = mv88e6185_phylink_get_caps,
|
||||
.phylink_get_caps = mv88e6351_phylink_get_caps,
|
||||
};
|
||||
|
||||
static const struct mv88e6xxx_ops mv88e6352_ops = {
|
||||
|
@ -516,8 +516,6 @@ struct sk_buff *dpaa2_eth_alloc_skb(struct dpaa2_eth_priv *priv,
|
||||
|
||||
memcpy(skb->data, fd_vaddr + fd_offset, fd_length);
|
||||
|
||||
dpaa2_eth_recycle_buf(priv, ch, dpaa2_fd_get_addr(fd));
|
||||
|
||||
return skb;
|
||||
}
|
||||
|
||||
@ -589,6 +587,7 @@ void dpaa2_eth_rx(struct dpaa2_eth_priv *priv,
|
||||
struct rtnl_link_stats64 *percpu_stats;
|
||||
struct dpaa2_eth_drv_stats *percpu_extras;
|
||||
struct device *dev = priv->net_dev->dev.parent;
|
||||
bool recycle_rx_buf = false;
|
||||
void *buf_data;
|
||||
u32 xdp_act;
|
||||
|
||||
@ -618,6 +617,8 @@ void dpaa2_eth_rx(struct dpaa2_eth_priv *priv,
|
||||
dma_unmap_page(dev, addr, priv->rx_buf_size,
|
||||
DMA_BIDIRECTIONAL);
|
||||
skb = dpaa2_eth_build_linear_skb(ch, fd, vaddr);
|
||||
} else {
|
||||
recycle_rx_buf = true;
|
||||
}
|
||||
} else if (fd_format == dpaa2_fd_sg) {
|
||||
WARN_ON(priv->xdp_prog);
|
||||
@ -637,6 +638,9 @@ void dpaa2_eth_rx(struct dpaa2_eth_priv *priv,
|
||||
goto err_build_skb;
|
||||
|
||||
dpaa2_eth_receive_skb(priv, ch, fd, vaddr, fq, percpu_stats, skb);
|
||||
|
||||
if (recycle_rx_buf)
|
||||
dpaa2_eth_recycle_buf(priv, ch, dpaa2_fd_get_addr(fd));
|
||||
return;
|
||||
|
||||
err_build_skb:
|
||||
@ -1073,14 +1077,12 @@ static int dpaa2_eth_build_single_fd(struct dpaa2_eth_priv *priv,
|
||||
dma_addr_t addr;
|
||||
|
||||
buffer_start = skb->data - dpaa2_eth_needed_headroom(skb);
|
||||
|
||||
/* If there's enough room to align the FD address, do it.
|
||||
* It will help hardware optimize accesses.
|
||||
*/
|
||||
aligned_start = PTR_ALIGN(buffer_start - DPAA2_ETH_TX_BUF_ALIGN,
|
||||
DPAA2_ETH_TX_BUF_ALIGN);
|
||||
if (aligned_start >= skb->head)
|
||||
buffer_start = aligned_start;
|
||||
else
|
||||
return -ENOMEM;
|
||||
|
||||
/* Store a backpointer to the skb at the beginning of the buffer
|
||||
* (in the private data area) such that we can release it
|
||||
@ -4967,6 +4969,8 @@ static int dpaa2_eth_probe(struct fsl_mc_device *dpni_dev)
|
||||
if (err)
|
||||
goto err_dl_port_add;
|
||||
|
||||
net_dev->needed_headroom = DPAA2_ETH_SWA_SIZE + DPAA2_ETH_TX_BUF_ALIGN;
|
||||
|
||||
err = register_netdev(net_dev);
|
||||
if (err < 0) {
|
||||
dev_err(dev, "register_netdev() failed\n");
|
||||
|
@ -740,7 +740,7 @@ static inline bool dpaa2_eth_rx_pause_enabled(u64 link_options)
|
||||
|
||||
static inline unsigned int dpaa2_eth_needed_headroom(struct sk_buff *skb)
|
||||
{
|
||||
unsigned int headroom = DPAA2_ETH_SWA_SIZE;
|
||||
unsigned int headroom = DPAA2_ETH_SWA_SIZE + DPAA2_ETH_TX_BUF_ALIGN;
|
||||
|
||||
/* If we don't have an skb (e.g. XDP buffer), we only need space for
|
||||
* the software annotation area
|
||||
|
@ -569,6 +569,50 @@ resume_traffic:
|
||||
dev_dbg(dev, "Problem restarting traffic for LAG node move\n");
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_lag_build_netdev_list - populate the lag struct's netdev list
|
||||
* @lag: local lag struct
|
||||
* @ndlist: pointer to netdev list to populate
|
||||
*/
|
||||
static void ice_lag_build_netdev_list(struct ice_lag *lag,
|
||||
struct ice_lag_netdev_list *ndlist)
|
||||
{
|
||||
struct ice_lag_netdev_list *nl;
|
||||
struct net_device *tmp_nd;
|
||||
|
||||
INIT_LIST_HEAD(&ndlist->node);
|
||||
rcu_read_lock();
|
||||
for_each_netdev_in_bond_rcu(lag->upper_netdev, tmp_nd) {
|
||||
nl = kzalloc(sizeof(*nl), GFP_ATOMIC);
|
||||
if (!nl)
|
||||
break;
|
||||
|
||||
nl->netdev = tmp_nd;
|
||||
list_add(&nl->node, &ndlist->node);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
lag->netdev_head = &ndlist->node;
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_lag_destroy_netdev_list - free lag struct's netdev list
|
||||
* @lag: pointer to local lag struct
|
||||
* @ndlist: pointer to lag struct netdev list
|
||||
*/
|
||||
static void ice_lag_destroy_netdev_list(struct ice_lag *lag,
|
||||
struct ice_lag_netdev_list *ndlist)
|
||||
{
|
||||
struct ice_lag_netdev_list *entry, *n;
|
||||
|
||||
rcu_read_lock();
|
||||
list_for_each_entry_safe(entry, n, &ndlist->node, node) {
|
||||
list_del(&entry->node);
|
||||
kfree(entry);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
lag->netdev_head = NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_lag_move_single_vf_nodes - Move Tx scheduling nodes for single VF
|
||||
* @lag: primary interface LAG struct
|
||||
@ -597,7 +641,6 @@ ice_lag_move_single_vf_nodes(struct ice_lag *lag, u8 oldport, u8 newport,
|
||||
void ice_lag_move_new_vf_nodes(struct ice_vf *vf)
|
||||
{
|
||||
struct ice_lag_netdev_list ndlist;
|
||||
struct list_head *tmp, *n;
|
||||
u8 pri_port, act_port;
|
||||
struct ice_lag *lag;
|
||||
struct ice_vsi *vsi;
|
||||
@ -621,38 +664,15 @@ void ice_lag_move_new_vf_nodes(struct ice_vf *vf)
|
||||
pri_port = pf->hw.port_info->lport;
|
||||
act_port = lag->active_port;
|
||||
|
||||
if (lag->upper_netdev) {
|
||||
struct ice_lag_netdev_list *nl;
|
||||
struct net_device *tmp_nd;
|
||||
|
||||
INIT_LIST_HEAD(&ndlist.node);
|
||||
rcu_read_lock();
|
||||
for_each_netdev_in_bond_rcu(lag->upper_netdev, tmp_nd) {
|
||||
nl = kzalloc(sizeof(*nl), GFP_ATOMIC);
|
||||
if (!nl)
|
||||
break;
|
||||
|
||||
nl->netdev = tmp_nd;
|
||||
list_add(&nl->node, &ndlist.node);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
lag->netdev_head = &ndlist.node;
|
||||
if (lag->upper_netdev)
|
||||
ice_lag_build_netdev_list(lag, &ndlist);
|
||||
|
||||
if (ice_is_feature_supported(pf, ICE_F_SRIOV_LAG) &&
|
||||
lag->bonded && lag->primary && pri_port != act_port &&
|
||||
!list_empty(lag->netdev_head))
|
||||
ice_lag_move_single_vf_nodes(lag, pri_port, act_port, vsi->idx);
|
||||
|
||||
list_for_each_safe(tmp, n, &ndlist.node) {
|
||||
struct ice_lag_netdev_list *entry;
|
||||
|
||||
entry = list_entry(tmp, struct ice_lag_netdev_list, node);
|
||||
list_del(&entry->node);
|
||||
kfree(entry);
|
||||
}
|
||||
lag->netdev_head = NULL;
|
||||
ice_lag_destroy_netdev_list(lag, &ndlist);
|
||||
|
||||
new_vf_unlock:
|
||||
mutex_unlock(&pf->lag_mutex);
|
||||
@ -679,6 +699,29 @@ static void ice_lag_move_vf_nodes(struct ice_lag *lag, u8 oldport, u8 newport)
|
||||
ice_lag_move_single_vf_nodes(lag, oldport, newport, i);
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_lag_move_vf_nodes_cfg - move vf nodes outside LAG netdev event context
|
||||
* @lag: local lag struct
|
||||
* @src_prt: lport value for source port
|
||||
* @dst_prt: lport value for destination port
|
||||
*
|
||||
* This function is used to move nodes during an out-of-netdev-event situation,
|
||||
* primarily when the driver needs to reconfigure or recreate resources.
|
||||
*
|
||||
* Must be called while holding the lag_mutex to avoid lag events from
|
||||
* processing while out-of-sync moves are happening. Also, paired moves,
|
||||
* such as used in a reset flow, should both be called under the same mutex
|
||||
* lock to avoid changes between start of reset and end of reset.
|
||||
*/
|
||||
void ice_lag_move_vf_nodes_cfg(struct ice_lag *lag, u8 src_prt, u8 dst_prt)
|
||||
{
|
||||
struct ice_lag_netdev_list ndlist;
|
||||
|
||||
ice_lag_build_netdev_list(lag, &ndlist);
|
||||
ice_lag_move_vf_nodes(lag, src_prt, dst_prt);
|
||||
ice_lag_destroy_netdev_list(lag, &ndlist);
|
||||
}
|
||||
|
||||
#define ICE_LAG_SRIOV_CP_RECIPE 10
|
||||
#define ICE_LAG_SRIOV_TRAIN_PKT_LEN 16
|
||||
|
||||
@ -2051,7 +2094,6 @@ void ice_lag_rebuild(struct ice_pf *pf)
|
||||
{
|
||||
struct ice_lag_netdev_list ndlist;
|
||||
struct ice_lag *lag, *prim_lag;
|
||||
struct list_head *tmp, *n;
|
||||
u8 act_port, loc_port;
|
||||
|
||||
if (!pf->lag || !pf->lag->bonded)
|
||||
@ -2063,21 +2105,7 @@ void ice_lag_rebuild(struct ice_pf *pf)
|
||||
if (lag->primary) {
|
||||
prim_lag = lag;
|
||||
} else {
|
||||
struct ice_lag_netdev_list *nl;
|
||||
struct net_device *tmp_nd;
|
||||
|
||||
INIT_LIST_HEAD(&ndlist.node);
|
||||
rcu_read_lock();
|
||||
for_each_netdev_in_bond_rcu(lag->upper_netdev, tmp_nd) {
|
||||
nl = kzalloc(sizeof(*nl), GFP_ATOMIC);
|
||||
if (!nl)
|
||||
break;
|
||||
|
||||
nl->netdev = tmp_nd;
|
||||
list_add(&nl->node, &ndlist.node);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
lag->netdev_head = &ndlist.node;
|
||||
ice_lag_build_netdev_list(lag, &ndlist);
|
||||
prim_lag = ice_lag_find_primary(lag);
|
||||
}
|
||||
|
||||
@ -2107,13 +2135,7 @@ void ice_lag_rebuild(struct ice_pf *pf)
|
||||
|
||||
ice_clear_rdma_cap(pf);
|
||||
lag_rebuild_out:
|
||||
list_for_each_safe(tmp, n, &ndlist.node) {
|
||||
struct ice_lag_netdev_list *entry;
|
||||
|
||||
entry = list_entry(tmp, struct ice_lag_netdev_list, node);
|
||||
list_del(&entry->node);
|
||||
kfree(entry);
|
||||
}
|
||||
ice_lag_destroy_netdev_list(lag, &ndlist);
|
||||
mutex_unlock(&pf->lag_mutex);
|
||||
}
|
||||
|
||||
|
@ -65,4 +65,5 @@ int ice_init_lag(struct ice_pf *pf);
|
||||
void ice_deinit_lag(struct ice_pf *pf);
|
||||
void ice_lag_rebuild(struct ice_pf *pf);
|
||||
bool ice_lag_is_switchdev_running(struct ice_pf *pf);
|
||||
void ice_lag_move_vf_nodes_cfg(struct ice_lag *lag, u8 src_prt, u8 dst_prt);
|
||||
#endif /* _ICE_LAG_H_ */
|
||||
|
@ -829,12 +829,16 @@ static void ice_notify_vf_reset(struct ice_vf *vf)
|
||||
int ice_reset_vf(struct ice_vf *vf, u32 flags)
|
||||
{
|
||||
struct ice_pf *pf = vf->pf;
|
||||
struct ice_lag *lag;
|
||||
struct ice_vsi *vsi;
|
||||
u8 act_prt, pri_prt;
|
||||
struct device *dev;
|
||||
int err = 0;
|
||||
bool rsd;
|
||||
|
||||
dev = ice_pf_to_dev(pf);
|
||||
act_prt = ICE_LAG_INVALID_PORT;
|
||||
pri_prt = pf->hw.port_info->lport;
|
||||
|
||||
if (flags & ICE_VF_RESET_NOTIFY)
|
||||
ice_notify_vf_reset(vf);
|
||||
@ -845,6 +849,17 @@ int ice_reset_vf(struct ice_vf *vf, u32 flags)
|
||||
return 0;
|
||||
}
|
||||
|
||||
lag = pf->lag;
|
||||
mutex_lock(&pf->lag_mutex);
|
||||
if (lag && lag->bonded && lag->primary) {
|
||||
act_prt = lag->active_port;
|
||||
if (act_prt != pri_prt && act_prt != ICE_LAG_INVALID_PORT &&
|
||||
lag->upper_netdev)
|
||||
ice_lag_move_vf_nodes_cfg(lag, act_prt, pri_prt);
|
||||
else
|
||||
act_prt = ICE_LAG_INVALID_PORT;
|
||||
}
|
||||
|
||||
if (flags & ICE_VF_RESET_LOCK)
|
||||
mutex_lock(&vf->cfg_lock);
|
||||
else
|
||||
@ -937,6 +952,11 @@ out_unlock:
|
||||
if (flags & ICE_VF_RESET_LOCK)
|
||||
mutex_unlock(&vf->cfg_lock);
|
||||
|
||||
if (lag && lag->bonded && lag->primary &&
|
||||
act_prt != ICE_LAG_INVALID_PORT)
|
||||
ice_lag_move_vf_nodes_cfg(lag, pri_prt, act_prt);
|
||||
mutex_unlock(&pf->lag_mutex);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -1603,9 +1603,24 @@ static int ice_vc_cfg_qs_msg(struct ice_vf *vf, u8 *msg)
|
||||
(struct virtchnl_vsi_queue_config_info *)msg;
|
||||
struct virtchnl_queue_pair_info *qpi;
|
||||
struct ice_pf *pf = vf->pf;
|
||||
struct ice_lag *lag;
|
||||
struct ice_vsi *vsi;
|
||||
u8 act_prt, pri_prt;
|
||||
int i = -1, q_idx;
|
||||
|
||||
lag = pf->lag;
|
||||
mutex_lock(&pf->lag_mutex);
|
||||
act_prt = ICE_LAG_INVALID_PORT;
|
||||
pri_prt = pf->hw.port_info->lport;
|
||||
if (lag && lag->bonded && lag->primary) {
|
||||
act_prt = lag->active_port;
|
||||
if (act_prt != pri_prt && act_prt != ICE_LAG_INVALID_PORT &&
|
||||
lag->upper_netdev)
|
||||
ice_lag_move_vf_nodes_cfg(lag, act_prt, pri_prt);
|
||||
else
|
||||
act_prt = ICE_LAG_INVALID_PORT;
|
||||
}
|
||||
|
||||
if (!test_bit(ICE_VF_STATE_ACTIVE, vf->vf_states))
|
||||
goto error_param;
|
||||
|
||||
@ -1729,6 +1744,11 @@ static int ice_vc_cfg_qs_msg(struct ice_vf *vf, u8 *msg)
|
||||
}
|
||||
}
|
||||
|
||||
if (lag && lag->bonded && lag->primary &&
|
||||
act_prt != ICE_LAG_INVALID_PORT)
|
||||
ice_lag_move_vf_nodes_cfg(lag, pri_prt, act_prt);
|
||||
mutex_unlock(&pf->lag_mutex);
|
||||
|
||||
/* send the response to the VF */
|
||||
return ice_vc_send_msg_to_vf(vf, VIRTCHNL_OP_CONFIG_VSI_QUEUES,
|
||||
VIRTCHNL_STATUS_SUCCESS, NULL, 0);
|
||||
@ -1743,6 +1763,11 @@ error_param:
|
||||
vf->vf_id, i);
|
||||
}
|
||||
|
||||
if (lag && lag->bonded && lag->primary &&
|
||||
act_prt != ICE_LAG_INVALID_PORT)
|
||||
ice_lag_move_vf_nodes_cfg(lag, pri_prt, act_prt);
|
||||
mutex_unlock(&pf->lag_mutex);
|
||||
|
||||
ice_lag_move_new_vf_nodes(vf);
|
||||
|
||||
/* send the response to the VF */
|
||||
|
@ -5505,6 +5505,8 @@ int rvu_mbox_handler_nix_bandprof_free(struct rvu *rvu,
|
||||
|
||||
ipolicer = &nix_hw->ipolicer[layer];
|
||||
for (idx = 0; idx < req->prof_count[layer]; idx++) {
|
||||
if (idx == MAX_BANDPROF_PER_PFFUNC)
|
||||
break;
|
||||
prof_idx = req->prof_idx[layer][idx];
|
||||
if (prof_idx >= ipolicer->band_prof.max ||
|
||||
ipolicer->pfvf_map[prof_idx] != pcifunc)
|
||||
@ -5518,8 +5520,6 @@ int rvu_mbox_handler_nix_bandprof_free(struct rvu *rvu,
|
||||
ipolicer->pfvf_map[prof_idx] = 0x00;
|
||||
ipolicer->match_id[prof_idx] = 0;
|
||||
rvu_free_rsrc(&ipolicer->band_prof, prof_idx);
|
||||
if (idx == MAX_BANDPROF_PER_PFFUNC)
|
||||
break;
|
||||
}
|
||||
}
|
||||
mutex_unlock(&rvu->rsrc_lock);
|
||||
|
@ -450,6 +450,9 @@ int cn10k_set_ipolicer_rate(struct otx2_nic *pfvf, u16 profile,
|
||||
aq->prof.pebs_mantissa = 0;
|
||||
aq->prof_mask.pebs_mantissa = 0xFF;
|
||||
|
||||
aq->prof.hl_en = 0;
|
||||
aq->prof_mask.hl_en = 1;
|
||||
|
||||
/* Fill AQ info */
|
||||
aq->qidx = profile;
|
||||
aq->ctype = NIX_AQ_CTYPE_BANDPROF;
|
||||
|
@ -1070,6 +1070,8 @@ int otx2_init_tc(struct otx2_nic *nic);
|
||||
void otx2_shutdown_tc(struct otx2_nic *nic);
|
||||
int otx2_setup_tc(struct net_device *netdev, enum tc_setup_type type,
|
||||
void *type_data);
|
||||
void otx2_tc_apply_ingress_police_rules(struct otx2_nic *nic);
|
||||
|
||||
/* CGX/RPM DMAC filters support */
|
||||
int otx2_dmacflt_get_max_cnt(struct otx2_nic *pf);
|
||||
int otx2_dmacflt_add(struct otx2_nic *pf, const u8 *mac, u32 bit_pos);
|
||||
|
@ -566,7 +566,9 @@ static irqreturn_t otx2_pfvf_mbox_intr_handler(int irq, void *pf_irq)
|
||||
otx2_write64(pf, RVU_PF_VFPF_MBOX_INTX(1), intr);
|
||||
otx2_queue_work(mbox, pf->mbox_pfvf_wq, 64, vfs, intr,
|
||||
TYPE_PFVF);
|
||||
vfs -= 64;
|
||||
if (intr)
|
||||
trace_otx2_msg_interrupt(mbox->mbox.pdev, "VF(s) to PF", intr);
|
||||
vfs = 64;
|
||||
}
|
||||
|
||||
intr = otx2_read64(pf, RVU_PF_VFPF_MBOX_INTX(0));
|
||||
@ -574,7 +576,8 @@ static irqreturn_t otx2_pfvf_mbox_intr_handler(int irq, void *pf_irq)
|
||||
|
||||
otx2_queue_work(mbox, pf->mbox_pfvf_wq, 0, vfs, intr, TYPE_PFVF);
|
||||
|
||||
trace_otx2_msg_interrupt(mbox->mbox.pdev, "VF(s) to PF", intr);
|
||||
if (intr)
|
||||
trace_otx2_msg_interrupt(mbox->mbox.pdev, "VF(s) to PF", intr);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@ -1870,6 +1873,8 @@ int otx2_open(struct net_device *netdev)
|
||||
if (pf->flags & OTX2_FLAG_DMACFLTR_SUPPORT)
|
||||
otx2_dmacflt_reinstall_flows(pf);
|
||||
|
||||
otx2_tc_apply_ingress_police_rules(pf);
|
||||
|
||||
err = otx2_rxtx_enable(pf, true);
|
||||
/* If a mbox communication error happens at this point then interface
|
||||
* will end up in a state such that it is in down state but hardware
|
||||
|
@ -47,6 +47,9 @@ struct otx2_tc_flow {
|
||||
bool is_act_police;
|
||||
u32 prio;
|
||||
struct npc_install_flow_req req;
|
||||
u64 rate;
|
||||
u32 burst;
|
||||
bool is_pps;
|
||||
};
|
||||
|
||||
static void otx2_get_egress_burst_cfg(struct otx2_nic *nic, u32 burst,
|
||||
@ -284,6 +287,41 @@ static int otx2_tc_egress_matchall_delete(struct otx2_nic *nic,
|
||||
return err;
|
||||
}
|
||||
|
||||
static int otx2_tc_act_set_hw_police(struct otx2_nic *nic,
|
||||
struct otx2_tc_flow *node)
|
||||
{
|
||||
int rc;
|
||||
|
||||
mutex_lock(&nic->mbox.lock);
|
||||
|
||||
rc = cn10k_alloc_leaf_profile(nic, &node->leaf_profile);
|
||||
if (rc) {
|
||||
mutex_unlock(&nic->mbox.lock);
|
||||
return rc;
|
||||
}
|
||||
|
||||
rc = cn10k_set_ipolicer_rate(nic, node->leaf_profile,
|
||||
node->burst, node->rate, node->is_pps);
|
||||
if (rc)
|
||||
goto free_leaf;
|
||||
|
||||
rc = cn10k_map_unmap_rq_policer(nic, node->rq, node->leaf_profile, true);
|
||||
if (rc)
|
||||
goto free_leaf;
|
||||
|
||||
mutex_unlock(&nic->mbox.lock);
|
||||
|
||||
return 0;
|
||||
|
||||
free_leaf:
|
||||
if (cn10k_free_leaf_profile(nic, node->leaf_profile))
|
||||
netdev_err(nic->netdev,
|
||||
"Unable to free leaf bandwidth profile(%d)\n",
|
||||
node->leaf_profile);
|
||||
mutex_unlock(&nic->mbox.lock);
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int otx2_tc_act_set_police(struct otx2_nic *nic,
|
||||
struct otx2_tc_flow *node,
|
||||
struct flow_cls_offload *f,
|
||||
@ -300,39 +338,20 @@ static int otx2_tc_act_set_police(struct otx2_nic *nic,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
mutex_lock(&nic->mbox.lock);
|
||||
|
||||
rc = cn10k_alloc_leaf_profile(nic, &node->leaf_profile);
|
||||
if (rc) {
|
||||
mutex_unlock(&nic->mbox.lock);
|
||||
return rc;
|
||||
}
|
||||
|
||||
rc = cn10k_set_ipolicer_rate(nic, node->leaf_profile, burst, rate, pps);
|
||||
if (rc)
|
||||
goto free_leaf;
|
||||
|
||||
rc = cn10k_map_unmap_rq_policer(nic, rq_idx, node->leaf_profile, true);
|
||||
if (rc)
|
||||
goto free_leaf;
|
||||
|
||||
mutex_unlock(&nic->mbox.lock);
|
||||
|
||||
req->match_id = mark & 0xFFFFULL;
|
||||
req->index = rq_idx;
|
||||
req->op = NIX_RX_ACTIONOP_UCAST;
|
||||
set_bit(rq_idx, &nic->rq_bmap);
|
||||
|
||||
node->is_act_police = true;
|
||||
node->rq = rq_idx;
|
||||
node->burst = burst;
|
||||
node->rate = rate;
|
||||
node->is_pps = pps;
|
||||
|
||||
return 0;
|
||||
rc = otx2_tc_act_set_hw_police(nic, node);
|
||||
if (!rc)
|
||||
set_bit(rq_idx, &nic->rq_bmap);
|
||||
|
||||
free_leaf:
|
||||
if (cn10k_free_leaf_profile(nic, node->leaf_profile))
|
||||
netdev_err(nic->netdev,
|
||||
"Unable to free leaf bandwidth profile(%d)\n",
|
||||
node->leaf_profile);
|
||||
mutex_unlock(&nic->mbox.lock);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@ -1044,6 +1063,11 @@ static int otx2_tc_del_flow(struct otx2_nic *nic,
|
||||
}
|
||||
|
||||
if (flow_node->is_act_police) {
|
||||
__clear_bit(flow_node->rq, &nic->rq_bmap);
|
||||
|
||||
if (nic->flags & OTX2_FLAG_INTF_DOWN)
|
||||
goto free_mcam_flow;
|
||||
|
||||
mutex_lock(&nic->mbox.lock);
|
||||
|
||||
err = cn10k_map_unmap_rq_policer(nic, flow_node->rq,
|
||||
@ -1059,11 +1083,10 @@ static int otx2_tc_del_flow(struct otx2_nic *nic,
|
||||
"Unable to free leaf bandwidth profile(%d)\n",
|
||||
flow_node->leaf_profile);
|
||||
|
||||
__clear_bit(flow_node->rq, &nic->rq_bmap);
|
||||
|
||||
mutex_unlock(&nic->mbox.lock);
|
||||
}
|
||||
|
||||
free_mcam_flow:
|
||||
otx2_del_mcam_flow_entry(nic, flow_node->entry, NULL);
|
||||
otx2_tc_update_mcam_table(nic, flow_cfg, flow_node, false);
|
||||
kfree_rcu(flow_node, rcu);
|
||||
@ -1083,6 +1106,11 @@ static int otx2_tc_add_flow(struct otx2_nic *nic,
|
||||
if (!(nic->flags & OTX2_FLAG_TC_FLOWER_SUPPORT))
|
||||
return -ENOMEM;
|
||||
|
||||
if (nic->flags & OTX2_FLAG_INTF_DOWN) {
|
||||
NL_SET_ERR_MSG_MOD(extack, "Interface not initialized");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (flow_cfg->nr_flows == flow_cfg->max_flows) {
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
"Free MCAM entry not available to add the flow");
|
||||
@ -1442,3 +1470,45 @@ void otx2_shutdown_tc(struct otx2_nic *nic)
|
||||
otx2_destroy_tc_flow_list(nic);
|
||||
}
|
||||
EXPORT_SYMBOL(otx2_shutdown_tc);
|
||||
|
||||
static void otx2_tc_config_ingress_rule(struct otx2_nic *nic,
|
||||
struct otx2_tc_flow *node)
|
||||
{
|
||||
struct npc_install_flow_req *req;
|
||||
|
||||
if (otx2_tc_act_set_hw_police(nic, node))
|
||||
return;
|
||||
|
||||
mutex_lock(&nic->mbox.lock);
|
||||
|
||||
req = otx2_mbox_alloc_msg_npc_install_flow(&nic->mbox);
|
||||
if (!req)
|
||||
goto err;
|
||||
|
||||
memcpy(req, &node->req, sizeof(struct npc_install_flow_req));
|
||||
|
||||
if (otx2_sync_mbox_msg(&nic->mbox))
|
||||
netdev_err(nic->netdev,
|
||||
"Failed to install MCAM flow entry for ingress rule");
|
||||
err:
|
||||
mutex_unlock(&nic->mbox.lock);
|
||||
}
|
||||
|
||||
void otx2_tc_apply_ingress_police_rules(struct otx2_nic *nic)
|
||||
{
|
||||
struct otx2_flow_config *flow_cfg = nic->flow_cfg;
|
||||
struct otx2_tc_flow *node;
|
||||
|
||||
/* If any ingress policer rules exist for the interface then
|
||||
* apply those rules. Ingress policer rules depend on bandwidth
|
||||
* profiles linked to the receive queues. Since no receive queues
|
||||
* exist when interface is down, ingress policer rules are stored
|
||||
* and configured in hardware after all receive queues are allocated
|
||||
* in otx2_open.
|
||||
*/
|
||||
list_for_each_entry(node, &flow_cfg->flow_list_tc, list) {
|
||||
if (node->is_act_police)
|
||||
otx2_tc_config_ingress_rule(nic, node);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(otx2_tc_apply_ingress_police_rules);
|
||||
|
@ -579,6 +579,7 @@ struct rtl8169_tc_offsets {
|
||||
enum rtl_flag {
|
||||
RTL_FLAG_TASK_ENABLED = 0,
|
||||
RTL_FLAG_TASK_RESET_PENDING,
|
||||
RTL_FLAG_TASK_RESET_NO_QUEUE_WAKE,
|
||||
RTL_FLAG_TASK_TX_TIMEOUT,
|
||||
RTL_FLAG_MAX
|
||||
};
|
||||
@ -4582,6 +4583,8 @@ static void rtl_task(struct work_struct *work)
|
||||
reset:
|
||||
rtl_reset_work(tp);
|
||||
netif_wake_queue(tp->dev);
|
||||
} else if (test_and_clear_bit(RTL_FLAG_TASK_RESET_NO_QUEUE_WAKE, tp->wk.flags)) {
|
||||
rtl_reset_work(tp);
|
||||
}
|
||||
out_unlock:
|
||||
rtnl_unlock();
|
||||
@ -4615,7 +4618,7 @@ static void r8169_phylink_handler(struct net_device *ndev)
|
||||
} else {
|
||||
/* In few cases rx is broken after link-down otherwise */
|
||||
if (rtl_is_8125(tp))
|
||||
rtl_reset_work(tp);
|
||||
rtl_schedule_task(tp, RTL_FLAG_TASK_RESET_NO_QUEUE_WAKE);
|
||||
pm_runtime_idle(d);
|
||||
}
|
||||
|
||||
@ -4691,7 +4694,7 @@ static int rtl8169_close(struct net_device *dev)
|
||||
rtl8169_down(tp);
|
||||
rtl8169_rx_clear(tp);
|
||||
|
||||
cancel_work_sync(&tp->wk.work);
|
||||
cancel_work(&tp->wk.work);
|
||||
|
||||
free_irq(tp->irq, tp);
|
||||
|
||||
@ -4925,6 +4928,8 @@ static void rtl_remove_one(struct pci_dev *pdev)
|
||||
if (pci_dev_run_wake(pdev))
|
||||
pm_runtime_get_noresume(&pdev->dev);
|
||||
|
||||
cancel_work_sync(&tp->wk.work);
|
||||
|
||||
unregister_netdev(tp->dev);
|
||||
|
||||
if (tp->dash_type != RTL_DASH_NONE)
|
||||
|
@ -515,6 +515,15 @@ static void ravb_emac_init_gbeth(struct net_device *ndev)
|
||||
{
|
||||
struct ravb_private *priv = netdev_priv(ndev);
|
||||
|
||||
if (priv->phy_interface == PHY_INTERFACE_MODE_MII) {
|
||||
ravb_write(ndev, (1000 << 16) | CXR35_SEL_XMII_MII, CXR35);
|
||||
ravb_modify(ndev, CXR31, CXR31_SEL_LINK0 | CXR31_SEL_LINK1, 0);
|
||||
} else {
|
||||
ravb_write(ndev, (1000 << 16) | CXR35_SEL_XMII_RGMII, CXR35);
|
||||
ravb_modify(ndev, CXR31, CXR31_SEL_LINK0 | CXR31_SEL_LINK1,
|
||||
CXR31_SEL_LINK0);
|
||||
}
|
||||
|
||||
/* Receive frame limit set register */
|
||||
ravb_write(ndev, GBETH_RX_BUFF_MAX + ETH_FCS_LEN, RFLR);
|
||||
|
||||
@ -537,14 +546,6 @@ static void ravb_emac_init_gbeth(struct net_device *ndev)
|
||||
|
||||
/* E-MAC interrupt enable register */
|
||||
ravb_write(ndev, ECSIPR_ICDIP, ECSIPR);
|
||||
|
||||
if (priv->phy_interface == PHY_INTERFACE_MODE_MII) {
|
||||
ravb_modify(ndev, CXR31, CXR31_SEL_LINK0 | CXR31_SEL_LINK1, 0);
|
||||
ravb_write(ndev, (1000 << 16) | CXR35_SEL_XMII_MII, CXR35);
|
||||
} else {
|
||||
ravb_modify(ndev, CXR31, CXR31_SEL_LINK0 | CXR31_SEL_LINK1,
|
||||
CXR31_SEL_LINK0);
|
||||
}
|
||||
}
|
||||
|
||||
static void ravb_emac_init_rcar(struct net_device *ndev)
|
||||
@ -1811,19 +1812,20 @@ static int ravb_open(struct net_device *ndev)
|
||||
if (info->gptp)
|
||||
ravb_ptp_init(ndev, priv->pdev);
|
||||
|
||||
netif_tx_start_all_queues(ndev);
|
||||
|
||||
/* PHY control start */
|
||||
error = ravb_phy_start(ndev);
|
||||
if (error)
|
||||
goto out_ptp_stop;
|
||||
|
||||
netif_tx_start_all_queues(ndev);
|
||||
|
||||
return 0;
|
||||
|
||||
out_ptp_stop:
|
||||
/* Stop PTP Clock driver */
|
||||
if (info->gptp)
|
||||
ravb_ptp_stop(ndev);
|
||||
ravb_stop_dma(ndev);
|
||||
out_free_irq_mgmta:
|
||||
if (!info->multi_irqs)
|
||||
goto out_free_irq;
|
||||
@ -1874,6 +1876,12 @@ static void ravb_tx_timeout_work(struct work_struct *work)
|
||||
struct net_device *ndev = priv->ndev;
|
||||
int error;
|
||||
|
||||
if (!rtnl_trylock()) {
|
||||
usleep_range(1000, 2000);
|
||||
schedule_work(&priv->work);
|
||||
return;
|
||||
}
|
||||
|
||||
netif_tx_stop_all_queues(ndev);
|
||||
|
||||
/* Stop PTP Clock driver */
|
||||
@ -1907,7 +1915,7 @@ static void ravb_tx_timeout_work(struct work_struct *work)
|
||||
*/
|
||||
netdev_err(ndev, "%s: ravb_dmac_init() failed, error %d\n",
|
||||
__func__, error);
|
||||
return;
|
||||
goto out_unlock;
|
||||
}
|
||||
ravb_emac_init(ndev);
|
||||
|
||||
@ -1917,6 +1925,9 @@ out:
|
||||
ravb_ptp_init(ndev, priv->pdev);
|
||||
|
||||
netif_tx_start_all_queues(ndev);
|
||||
|
||||
out_unlock:
|
||||
rtnl_unlock();
|
||||
}
|
||||
|
||||
/* Packet transmit function for Ethernet AVB */
|
||||
@ -2645,9 +2656,14 @@ static int ravb_probe(struct platform_device *pdev)
|
||||
ndev->features = info->net_features;
|
||||
ndev->hw_features = info->net_hw_features;
|
||||
|
||||
reset_control_deassert(rstc);
|
||||
error = reset_control_deassert(rstc);
|
||||
if (error)
|
||||
goto out_free_netdev;
|
||||
|
||||
pm_runtime_enable(&pdev->dev);
|
||||
pm_runtime_get_sync(&pdev->dev);
|
||||
error = pm_runtime_resume_and_get(&pdev->dev);
|
||||
if (error < 0)
|
||||
goto out_rpm_disable;
|
||||
|
||||
if (info->multi_irqs) {
|
||||
if (info->err_mgmt_irqs)
|
||||
@ -2872,11 +2888,12 @@ out_disable_gptp_clk:
|
||||
out_disable_refclk:
|
||||
clk_disable_unprepare(priv->refclk);
|
||||
out_release:
|
||||
free_netdev(ndev);
|
||||
|
||||
pm_runtime_put(&pdev->dev);
|
||||
out_rpm_disable:
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
reset_control_assert(rstc);
|
||||
out_free_netdev:
|
||||
free_netdev(ndev);
|
||||
return error;
|
||||
}
|
||||
|
||||
@ -2886,22 +2903,26 @@ static void ravb_remove(struct platform_device *pdev)
|
||||
struct ravb_private *priv = netdev_priv(ndev);
|
||||
const struct ravb_hw_info *info = priv->info;
|
||||
|
||||
/* Stop PTP Clock driver */
|
||||
if (info->ccc_gac)
|
||||
ravb_ptp_stop(ndev);
|
||||
|
||||
clk_disable_unprepare(priv->gptp_clk);
|
||||
clk_disable_unprepare(priv->refclk);
|
||||
|
||||
/* Set reset mode */
|
||||
ravb_write(ndev, CCC_OPC_RESET, CCC);
|
||||
unregister_netdev(ndev);
|
||||
if (info->nc_queues)
|
||||
netif_napi_del(&priv->napi[RAVB_NC]);
|
||||
netif_napi_del(&priv->napi[RAVB_BE]);
|
||||
|
||||
ravb_mdio_release(priv);
|
||||
|
||||
/* Stop PTP Clock driver */
|
||||
if (info->ccc_gac)
|
||||
ravb_ptp_stop(ndev);
|
||||
|
||||
dma_free_coherent(ndev->dev.parent, priv->desc_bat_size, priv->desc_bat,
|
||||
priv->desc_bat_dma);
|
||||
|
||||
/* Set reset mode */
|
||||
ravb_write(ndev, CCC_OPC_RESET, CCC);
|
||||
|
||||
clk_disable_unprepare(priv->gptp_clk);
|
||||
clk_disable_unprepare(priv->refclk);
|
||||
|
||||
pm_runtime_put_sync(&pdev->dev);
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
reset_control_assert(priv->rstc);
|
||||
|
@ -1504,8 +1504,8 @@ static netdev_tx_t rswitch_start_xmit(struct sk_buff *skb, struct net_device *nd
|
||||
{
|
||||
struct rswitch_device *rdev = netdev_priv(ndev);
|
||||
struct rswitch_gwca_queue *gq = rdev->tx_queue;
|
||||
netdev_tx_t ret = NETDEV_TX_OK;
|
||||
struct rswitch_ext_desc *desc;
|
||||
int ret = NETDEV_TX_OK;
|
||||
dma_addr_t dma_addr;
|
||||
|
||||
if (rswitch_get_num_cur_queues(gq) >= gq->ring_size - 1) {
|
||||
@ -1517,10 +1517,8 @@ static netdev_tx_t rswitch_start_xmit(struct sk_buff *skb, struct net_device *nd
|
||||
return ret;
|
||||
|
||||
dma_addr = dma_map_single(ndev->dev.parent, skb->data, skb->len, DMA_TO_DEVICE);
|
||||
if (dma_mapping_error(ndev->dev.parent, dma_addr)) {
|
||||
dev_kfree_skb_any(skb);
|
||||
return ret;
|
||||
}
|
||||
if (dma_mapping_error(ndev->dev.parent, dma_addr))
|
||||
goto err_kfree;
|
||||
|
||||
gq->skbs[gq->cur] = skb;
|
||||
desc = &gq->tx_ring[gq->cur];
|
||||
@ -1533,10 +1531,8 @@ static netdev_tx_t rswitch_start_xmit(struct sk_buff *skb, struct net_device *nd
|
||||
struct rswitch_gwca_ts_info *ts_info;
|
||||
|
||||
ts_info = kzalloc(sizeof(*ts_info), GFP_ATOMIC);
|
||||
if (!ts_info) {
|
||||
dma_unmap_single(ndev->dev.parent, dma_addr, skb->len, DMA_TO_DEVICE);
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (!ts_info)
|
||||
goto err_unmap;
|
||||
|
||||
skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
|
||||
rdev->ts_tag++;
|
||||
@ -1558,6 +1554,14 @@ static netdev_tx_t rswitch_start_xmit(struct sk_buff *skb, struct net_device *nd
|
||||
gq->cur = rswitch_next_queue_index(gq, true, 1);
|
||||
rswitch_modify(rdev->addr, GWTRC(gq->index), 0, BIT(gq->index % 32));
|
||||
|
||||
return ret;
|
||||
|
||||
err_unmap:
|
||||
dma_unmap_single(ndev->dev.parent, dma_addr, skb->len, DMA_TO_DEVICE);
|
||||
|
||||
err_kfree:
|
||||
dev_kfree_skb_any(skb);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -177,8 +177,10 @@
|
||||
#define MMC_XGMAC_RX_DISCARD_OCT_GB 0x1b4
|
||||
#define MMC_XGMAC_RX_ALIGN_ERR_PKT 0x1bc
|
||||
|
||||
#define MMC_XGMAC_TX_FPE_INTR_MASK 0x204
|
||||
#define MMC_XGMAC_TX_FPE_FRAG 0x208
|
||||
#define MMC_XGMAC_TX_HOLD_REQ 0x20c
|
||||
#define MMC_XGMAC_RX_FPE_INTR_MASK 0x224
|
||||
#define MMC_XGMAC_RX_PKT_ASSEMBLY_ERR 0x228
|
||||
#define MMC_XGMAC_RX_PKT_SMD_ERR 0x22c
|
||||
#define MMC_XGMAC_RX_PKT_ASSEMBLY_OK 0x230
|
||||
@ -352,6 +354,8 @@ static void dwxgmac_mmc_intr_all_mask(void __iomem *mmcaddr)
|
||||
{
|
||||
writel(0x0, mmcaddr + MMC_RX_INTR_MASK);
|
||||
writel(0x0, mmcaddr + MMC_TX_INTR_MASK);
|
||||
writel(MMC_DEFAULT_MASK, mmcaddr + MMC_XGMAC_TX_FPE_INTR_MASK);
|
||||
writel(MMC_DEFAULT_MASK, mmcaddr + MMC_XGMAC_RX_FPE_INTR_MASK);
|
||||
writel(MMC_DEFAULT_MASK, mmcaddr + MMC_XGMAC_RX_IPC_INTR_MASK);
|
||||
}
|
||||
|
||||
|
@ -1972,11 +1972,11 @@ void wx_reset_interrupt_capability(struct wx *wx)
|
||||
if (!pdev->msi_enabled && !pdev->msix_enabled)
|
||||
return;
|
||||
|
||||
pci_free_irq_vectors(wx->pdev);
|
||||
if (pdev->msix_enabled) {
|
||||
kfree(wx->msix_entries);
|
||||
wx->msix_entries = NULL;
|
||||
}
|
||||
pci_free_irq_vectors(wx->pdev);
|
||||
}
|
||||
EXPORT_SYMBOL(wx_reset_interrupt_capability);
|
||||
|
||||
|
@ -93,7 +93,7 @@ static void nsim_prog_set_loaded(struct bpf_prog *prog, bool loaded)
|
||||
{
|
||||
struct nsim_bpf_bound_prog *state;
|
||||
|
||||
if (!prog || !prog->aux->offload)
|
||||
if (!prog || !bpf_prog_is_offloaded(prog->aux))
|
||||
return;
|
||||
|
||||
state = prog->aux->offload->dev_priv;
|
||||
@ -311,7 +311,7 @@ nsim_setup_prog_hw_checks(struct netdevsim *ns, struct netdev_bpf *bpf)
|
||||
if (!bpf->prog)
|
||||
return 0;
|
||||
|
||||
if (!bpf->prog->aux->offload) {
|
||||
if (!bpf_prog_is_offloaded(bpf->prog->aux)) {
|
||||
NSIM_EA(bpf->extack, "xdpoffload of non-bound program");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -851,6 +851,12 @@ static int netkit_change_link(struct net_device *dev, struct nlattr *tb[],
|
||||
return -EACCES;
|
||||
}
|
||||
|
||||
if (data[IFLA_NETKIT_PEER_INFO]) {
|
||||
NL_SET_ERR_MSG_ATTR(extack, data[IFLA_NETKIT_PEER_INFO],
|
||||
"netkit peer info cannot be changed after device creation");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (data[IFLA_NETKIT_POLICY]) {
|
||||
attr = data[IFLA_NETKIT_POLICY];
|
||||
policy = nla_get_u32(attr);
|
||||
|
@ -57,8 +57,7 @@ config ATH9K_AHB
|
||||
|
||||
config ATH9K_DEBUGFS
|
||||
bool "Atheros ath9k debugging"
|
||||
depends on ATH9K && DEBUG_FS
|
||||
select MAC80211_DEBUGFS
|
||||
depends on ATH9K && DEBUG_FS && MAC80211_DEBUGFS
|
||||
select ATH9K_COMMON_DEBUG
|
||||
help
|
||||
Say Y, if you need access to ath9k's statistics for
|
||||
@ -70,7 +69,6 @@ config ATH9K_DEBUGFS
|
||||
config ATH9K_STATION_STATISTICS
|
||||
bool "Detailed station statistics"
|
||||
depends on ATH9K && ATH9K_DEBUGFS && DEBUG_FS
|
||||
select MAC80211_DEBUGFS
|
||||
default n
|
||||
help
|
||||
This option enables detailed statistics for association stations.
|
||||
|
@ -707,8 +707,10 @@ int iwl_mvm_mld_add_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
||||
rcu_dereference_protected(mvm_sta->link[link_id],
|
||||
lockdep_is_held(&mvm->mutex));
|
||||
|
||||
if (WARN_ON(!link_conf || !mvm_link_sta))
|
||||
if (WARN_ON(!link_conf || !mvm_link_sta)) {
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = iwl_mvm_mld_cfg_sta(mvm, sta, vif, link_sta, link_conf,
|
||||
mvm_link_sta);
|
||||
|
@ -375,6 +375,7 @@ static int mt7921_load_clc(struct mt792x_dev *dev, const char *fw_name)
|
||||
int ret, i, len, offset = 0;
|
||||
u8 *clc_base = NULL, hw_encap = 0;
|
||||
|
||||
dev->phy.clc_chan_conf = 0xff;
|
||||
if (mt7921_disable_clc ||
|
||||
mt76_is_usb(&dev->mt76))
|
||||
return 0;
|
||||
|
@ -14,7 +14,7 @@
|
||||
static void
|
||||
mt7925_init_he_caps(struct mt792x_phy *phy, enum nl80211_band band,
|
||||
struct ieee80211_sband_iftype_data *data,
|
||||
enum nl80211_iftype iftype)
|
||||
enum nl80211_iftype iftype)
|
||||
{
|
||||
struct ieee80211_sta_he_cap *he_cap = &data->he_cap;
|
||||
struct ieee80211_he_cap_elem *he_cap_elem = &he_cap->he_cap_elem;
|
||||
@ -53,7 +53,7 @@ mt7925_init_he_caps(struct mt792x_phy *phy, enum nl80211_band band,
|
||||
IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO |
|
||||
IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO;
|
||||
|
||||
switch (i) {
|
||||
switch (iftype) {
|
||||
case NL80211_IFTYPE_AP:
|
||||
he_cap_elem->mac_cap_info[2] |=
|
||||
IEEE80211_HE_MAC_CAP2_BSR;
|
||||
|
@ -84,6 +84,14 @@ int debugfs_file_get(struct dentry *dentry)
|
||||
struct debugfs_fsdata *fsd;
|
||||
void *d_fsd;
|
||||
|
||||
/*
|
||||
* This could only happen if some debugfs user erroneously calls
|
||||
* debugfs_file_get() on a dentry that isn't even a file, let
|
||||
* them know about it.
|
||||
*/
|
||||
if (WARN_ON(!d_is_reg(dentry)))
|
||||
return -EINVAL;
|
||||
|
||||
d_fsd = READ_ONCE(dentry->d_fsdata);
|
||||
if (!((unsigned long)d_fsd & DEBUGFS_FSDATA_IS_REAL_FOPS_BIT)) {
|
||||
fsd = d_fsd;
|
||||
@ -100,6 +108,14 @@ int debugfs_file_get(struct dentry *dentry)
|
||||
kfree(fsd);
|
||||
fsd = READ_ONCE(dentry->d_fsdata);
|
||||
}
|
||||
#ifdef CONFIG_LOCKDEP
|
||||
fsd->lock_name = kasprintf(GFP_KERNEL, "debugfs:%pd", dentry);
|
||||
lockdep_register_key(&fsd->key);
|
||||
lockdep_init_map(&fsd->lockdep_map, fsd->lock_name ?: "debugfs",
|
||||
&fsd->key, 0);
|
||||
#endif
|
||||
INIT_LIST_HEAD(&fsd->cancellations);
|
||||
mutex_init(&fsd->cancellations_mtx);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -116,6 +132,8 @@ int debugfs_file_get(struct dentry *dentry)
|
||||
if (!refcount_inc_not_zero(&fsd->active_users))
|
||||
return -EIO;
|
||||
|
||||
lock_map_acquire_read(&fsd->lockdep_map);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(debugfs_file_get);
|
||||
@ -133,11 +151,93 @@ void debugfs_file_put(struct dentry *dentry)
|
||||
{
|
||||
struct debugfs_fsdata *fsd = READ_ONCE(dentry->d_fsdata);
|
||||
|
||||
lock_map_release(&fsd->lockdep_map);
|
||||
|
||||
if (refcount_dec_and_test(&fsd->active_users))
|
||||
complete(&fsd->active_users_drained);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(debugfs_file_put);
|
||||
|
||||
/**
|
||||
* debugfs_enter_cancellation - enter a debugfs cancellation
|
||||
* @file: the file being accessed
|
||||
* @cancellation: the cancellation object, the cancel callback
|
||||
* inside of it must be initialized
|
||||
*
|
||||
* When a debugfs file is removed it needs to wait for all active
|
||||
* operations to complete. However, the operation itself may need
|
||||
* to wait for hardware or completion of some asynchronous process
|
||||
* or similar. As such, it may need to be cancelled to avoid long
|
||||
* waits or even deadlocks.
|
||||
*
|
||||
* This function can be used inside a debugfs handler that may
|
||||
* need to be cancelled. As soon as this function is called, the
|
||||
* cancellation's 'cancel' callback may be called, at which point
|
||||
* the caller should proceed to call debugfs_leave_cancellation()
|
||||
* and leave the debugfs handler function as soon as possible.
|
||||
* Note that the 'cancel' callback is only ever called in the
|
||||
* context of some kind of debugfs_remove().
|
||||
*
|
||||
* This function must be paired with debugfs_leave_cancellation().
|
||||
*/
|
||||
void debugfs_enter_cancellation(struct file *file,
|
||||
struct debugfs_cancellation *cancellation)
|
||||
{
|
||||
struct debugfs_fsdata *fsd;
|
||||
struct dentry *dentry = F_DENTRY(file);
|
||||
|
||||
INIT_LIST_HEAD(&cancellation->list);
|
||||
|
||||
if (WARN_ON(!d_is_reg(dentry)))
|
||||
return;
|
||||
|
||||
if (WARN_ON(!cancellation->cancel))
|
||||
return;
|
||||
|
||||
fsd = READ_ONCE(dentry->d_fsdata);
|
||||
if (WARN_ON(!fsd ||
|
||||
((unsigned long)fsd & DEBUGFS_FSDATA_IS_REAL_FOPS_BIT)))
|
||||
return;
|
||||
|
||||
mutex_lock(&fsd->cancellations_mtx);
|
||||
list_add(&cancellation->list, &fsd->cancellations);
|
||||
mutex_unlock(&fsd->cancellations_mtx);
|
||||
|
||||
/* if we're already removing wake it up to cancel */
|
||||
if (d_unlinked(dentry))
|
||||
complete(&fsd->active_users_drained);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(debugfs_enter_cancellation);
|
||||
|
||||
/**
|
||||
* debugfs_leave_cancellation - leave cancellation section
|
||||
* @file: the file being accessed
|
||||
* @cancellation: the cancellation previously registered with
|
||||
* debugfs_enter_cancellation()
|
||||
*
|
||||
* See the documentation of debugfs_enter_cancellation().
|
||||
*/
|
||||
void debugfs_leave_cancellation(struct file *file,
|
||||
struct debugfs_cancellation *cancellation)
|
||||
{
|
||||
struct debugfs_fsdata *fsd;
|
||||
struct dentry *dentry = F_DENTRY(file);
|
||||
|
||||
if (WARN_ON(!d_is_reg(dentry)))
|
||||
return;
|
||||
|
||||
fsd = READ_ONCE(dentry->d_fsdata);
|
||||
if (WARN_ON(!fsd ||
|
||||
((unsigned long)fsd & DEBUGFS_FSDATA_IS_REAL_FOPS_BIT)))
|
||||
return;
|
||||
|
||||
mutex_lock(&fsd->cancellations_mtx);
|
||||
if (!list_empty(&cancellation->list))
|
||||
list_del(&cancellation->list);
|
||||
mutex_unlock(&fsd->cancellations_mtx);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(debugfs_leave_cancellation);
|
||||
|
||||
/*
|
||||
* Only permit access to world-readable files when the kernel is locked down.
|
||||
* We also need to exclude any file that has ways to write or alter it as root
|
||||
|
@ -236,17 +236,29 @@ static const struct super_operations debugfs_super_operations = {
|
||||
|
||||
static void debugfs_release_dentry(struct dentry *dentry)
|
||||
{
|
||||
void *fsd = dentry->d_fsdata;
|
||||
struct debugfs_fsdata *fsd = dentry->d_fsdata;
|
||||
|
||||
if (!((unsigned long)fsd & DEBUGFS_FSDATA_IS_REAL_FOPS_BIT))
|
||||
kfree(dentry->d_fsdata);
|
||||
if ((unsigned long)fsd & DEBUGFS_FSDATA_IS_REAL_FOPS_BIT)
|
||||
return;
|
||||
|
||||
/* check it wasn't a dir (no fsdata) or automount (no real_fops) */
|
||||
if (fsd && fsd->real_fops) {
|
||||
#ifdef CONFIG_LOCKDEP
|
||||
lockdep_unregister_key(&fsd->key);
|
||||
kfree(fsd->lock_name);
|
||||
#endif
|
||||
WARN_ON(!list_empty(&fsd->cancellations));
|
||||
mutex_destroy(&fsd->cancellations_mtx);
|
||||
}
|
||||
|
||||
kfree(fsd);
|
||||
}
|
||||
|
||||
static struct vfsmount *debugfs_automount(struct path *path)
|
||||
{
|
||||
debugfs_automount_t f;
|
||||
f = (debugfs_automount_t)path->dentry->d_fsdata;
|
||||
return f(path->dentry, d_inode(path->dentry)->i_private);
|
||||
struct debugfs_fsdata *fsd = path->dentry->d_fsdata;
|
||||
|
||||
return fsd->automount(path->dentry, d_inode(path->dentry)->i_private);
|
||||
}
|
||||
|
||||
static const struct dentry_operations debugfs_dops = {
|
||||
@ -634,13 +646,23 @@ struct dentry *debugfs_create_automount(const char *name,
|
||||
void *data)
|
||||
{
|
||||
struct dentry *dentry = start_creating(name, parent);
|
||||
struct debugfs_fsdata *fsd;
|
||||
struct inode *inode;
|
||||
|
||||
if (IS_ERR(dentry))
|
||||
return dentry;
|
||||
|
||||
fsd = kzalloc(sizeof(*fsd), GFP_KERNEL);
|
||||
if (!fsd) {
|
||||
failed_creating(dentry);
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
fsd->automount = f;
|
||||
|
||||
if (!(debugfs_allow & DEBUGFS_ALLOW_API)) {
|
||||
failed_creating(dentry);
|
||||
kfree(fsd);
|
||||
return ERR_PTR(-EPERM);
|
||||
}
|
||||
|
||||
@ -648,13 +670,14 @@ struct dentry *debugfs_create_automount(const char *name,
|
||||
if (unlikely(!inode)) {
|
||||
pr_err("out of free dentries, can not create automount '%s'\n",
|
||||
name);
|
||||
kfree(fsd);
|
||||
return failed_creating(dentry);
|
||||
}
|
||||
|
||||
make_empty_dir_inode(inode);
|
||||
inode->i_flags |= S_AUTOMOUNT;
|
||||
inode->i_private = data;
|
||||
dentry->d_fsdata = (void *)f;
|
||||
dentry->d_fsdata = fsd;
|
||||
/* directory inodes start off with i_nlink == 2 (for "." entry) */
|
||||
inc_nlink(inode);
|
||||
d_instantiate(dentry, inode);
|
||||
@ -731,8 +754,40 @@ static void __debugfs_file_removed(struct dentry *dentry)
|
||||
fsd = READ_ONCE(dentry->d_fsdata);
|
||||
if ((unsigned long)fsd & DEBUGFS_FSDATA_IS_REAL_FOPS_BIT)
|
||||
return;
|
||||
if (!refcount_dec_and_test(&fsd->active_users))
|
||||
|
||||
lock_map_acquire(&fsd->lockdep_map);
|
||||
lock_map_release(&fsd->lockdep_map);
|
||||
|
||||
/* if we hit zero, just wait for all to finish */
|
||||
if (!refcount_dec_and_test(&fsd->active_users)) {
|
||||
wait_for_completion(&fsd->active_users_drained);
|
||||
return;
|
||||
}
|
||||
|
||||
/* if we didn't hit zero, try to cancel any we can */
|
||||
while (refcount_read(&fsd->active_users)) {
|
||||
struct debugfs_cancellation *c;
|
||||
|
||||
/*
|
||||
* Lock the cancellations. Note that the cancellations
|
||||
* structs are meant to be on the stack, so we need to
|
||||
* ensure we either use them here or don't touch them,
|
||||
* and debugfs_leave_cancellation() will wait for this
|
||||
* to be finished processing before exiting one. It may
|
||||
* of course win and remove the cancellation, but then
|
||||
* chances are we never even got into this bit, we only
|
||||
* do if the refcount isn't zero already.
|
||||
*/
|
||||
mutex_lock(&fsd->cancellations_mtx);
|
||||
while ((c = list_first_entry_or_null(&fsd->cancellations,
|
||||
typeof(*c), list))) {
|
||||
list_del_init(&c->list);
|
||||
c->cancel(dentry, c->cancel_data);
|
||||
}
|
||||
mutex_unlock(&fsd->cancellations_mtx);
|
||||
|
||||
wait_for_completion(&fsd->active_users_drained);
|
||||
}
|
||||
}
|
||||
|
||||
static void remove_one(struct dentry *victim)
|
||||
|
@ -7,6 +7,8 @@
|
||||
|
||||
#ifndef _DEBUGFS_INTERNAL_H_
|
||||
#define _DEBUGFS_INTERNAL_H_
|
||||
#include <linux/lockdep.h>
|
||||
#include <linux/list.h>
|
||||
|
||||
struct file_operations;
|
||||
|
||||
@ -17,8 +19,23 @@ extern const struct file_operations debugfs_full_proxy_file_operations;
|
||||
|
||||
struct debugfs_fsdata {
|
||||
const struct file_operations *real_fops;
|
||||
refcount_t active_users;
|
||||
struct completion active_users_drained;
|
||||
union {
|
||||
/* automount_fn is used when real_fops is NULL */
|
||||
debugfs_automount_t automount;
|
||||
struct {
|
||||
refcount_t active_users;
|
||||
struct completion active_users_drained;
|
||||
#ifdef CONFIG_LOCKDEP
|
||||
struct lockdep_map lockdep_map;
|
||||
struct lock_class_key key;
|
||||
char *lock_name;
|
||||
#endif
|
||||
|
||||
/* protect cancellations */
|
||||
struct mutex cancellations_mtx;
|
||||
struct list_head cancellations;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -171,6 +171,25 @@ ssize_t debugfs_write_file_bool(struct file *file, const char __user *user_buf,
|
||||
ssize_t debugfs_read_file_str(struct file *file, char __user *user_buf,
|
||||
size_t count, loff_t *ppos);
|
||||
|
||||
/**
|
||||
* struct debugfs_cancellation - cancellation data
|
||||
* @list: internal, for keeping track
|
||||
* @cancel: callback to call
|
||||
* @cancel_data: extra data for the callback to call
|
||||
*/
|
||||
struct debugfs_cancellation {
|
||||
struct list_head list;
|
||||
void (*cancel)(struct dentry *, void *);
|
||||
void *cancel_data;
|
||||
};
|
||||
|
||||
void __acquires(cancellation)
|
||||
debugfs_enter_cancellation(struct file *file,
|
||||
struct debugfs_cancellation *cancellation);
|
||||
void __releases(cancellation)
|
||||
debugfs_leave_cancellation(struct file *file,
|
||||
struct debugfs_cancellation *cancellation);
|
||||
|
||||
#else
|
||||
|
||||
#include <linux/err.h>
|
||||
|
@ -2830,12 +2830,14 @@ ieee80211_he_oper_size(const u8 *he_oper_ie)
|
||||
static inline const struct ieee80211_he_6ghz_oper *
|
||||
ieee80211_he_6ghz_oper(const struct ieee80211_he_operation *he_oper)
|
||||
{
|
||||
const u8 *ret = (const void *)&he_oper->optional;
|
||||
const u8 *ret;
|
||||
u32 he_oper_params;
|
||||
|
||||
if (!he_oper)
|
||||
return NULL;
|
||||
|
||||
ret = (const void *)&he_oper->optional;
|
||||
|
||||
he_oper_params = le32_to_cpu(he_oper->he_oper_params);
|
||||
|
||||
if (!(he_oper_params & IEEE80211_HE_OPERATION_6GHZ_OP_INFO))
|
||||
|
@ -106,6 +106,7 @@ struct sk_psock {
|
||||
struct mutex work_mutex;
|
||||
struct sk_psock_work_state work_state;
|
||||
struct delayed_work work;
|
||||
struct sock *sk_pair;
|
||||
struct rcu_work rwork;
|
||||
};
|
||||
|
||||
|
@ -75,6 +75,7 @@ struct unix_sock {
|
||||
};
|
||||
|
||||
#define unix_sk(ptr) container_of_const(ptr, struct unix_sock, sk)
|
||||
#define unix_peer(sk) (unix_sk(sk)->peer)
|
||||
|
||||
#define peer_wait peer_wq.wait
|
||||
|
||||
|
@ -9299,4 +9299,50 @@ bool cfg80211_valid_disable_subchannel_bitmap(u16 *bitmap,
|
||||
*/
|
||||
void cfg80211_links_removed(struct net_device *dev, u16 link_mask);
|
||||
|
||||
#ifdef CONFIG_CFG80211_DEBUGFS
|
||||
/**
|
||||
* wiphy_locked_debugfs_read - do a locked read in debugfs
|
||||
* @wiphy: the wiphy to use
|
||||
* @file: the file being read
|
||||
* @buf: the buffer to fill and then read from
|
||||
* @bufsize: size of the buffer
|
||||
* @userbuf: the user buffer to copy to
|
||||
* @count: read count
|
||||
* @ppos: read position
|
||||
* @handler: the read handler to call (under wiphy lock)
|
||||
* @data: additional data to pass to the read handler
|
||||
*/
|
||||
ssize_t wiphy_locked_debugfs_read(struct wiphy *wiphy, struct file *file,
|
||||
char *buf, size_t bufsize,
|
||||
char __user *userbuf, size_t count,
|
||||
loff_t *ppos,
|
||||
ssize_t (*handler)(struct wiphy *wiphy,
|
||||
struct file *file,
|
||||
char *buf,
|
||||
size_t bufsize,
|
||||
void *data),
|
||||
void *data);
|
||||
|
||||
/**
|
||||
* wiphy_locked_debugfs_write - do a locked write in debugfs
|
||||
* @wiphy: the wiphy to use
|
||||
* @file: the file being written to
|
||||
* @buf: the buffer to copy the user data to
|
||||
* @bufsize: size of the buffer
|
||||
* @userbuf: the user buffer to copy from
|
||||
* @count: read count
|
||||
* @handler: the write handler to call (under wiphy lock)
|
||||
* @data: additional data to pass to the write handler
|
||||
*/
|
||||
ssize_t wiphy_locked_debugfs_write(struct wiphy *wiphy, struct file *file,
|
||||
char *buf, size_t bufsize,
|
||||
const char __user *userbuf, size_t count,
|
||||
ssize_t (*handler)(struct wiphy *wiphy,
|
||||
struct file *file,
|
||||
char *buf,
|
||||
size_t count,
|
||||
void *data),
|
||||
void *data);
|
||||
#endif
|
||||
|
||||
#endif /* __NET_CFG80211_H */
|
||||
|
@ -162,7 +162,7 @@ struct neighbour {
|
||||
struct rcu_head rcu;
|
||||
struct net_device *dev;
|
||||
netdevice_tracker dev_tracker;
|
||||
u8 primary_key[0];
|
||||
u8 primary_key[];
|
||||
} __randomize_layout;
|
||||
|
||||
struct neigh_ops {
|
||||
|
@ -978,6 +978,8 @@ void notrace *bpf_mem_cache_alloc_flags(struct bpf_mem_alloc *ma, gfp_t flags)
|
||||
memcg = get_memcg(c);
|
||||
old_memcg = set_active_memcg(memcg);
|
||||
ret = __alloc(c, NUMA_NO_NODE, GFP_KERNEL | __GFP_NOWARN | __GFP_ACCOUNT);
|
||||
if (ret)
|
||||
*(struct bpf_mem_cache **)ret = c;
|
||||
set_active_memcg(old_memcg);
|
||||
mem_cgroup_put(memcg);
|
||||
}
|
||||
|
@ -826,6 +826,8 @@ static void sk_psock_destroy(struct work_struct *work)
|
||||
|
||||
if (psock->sk_redir)
|
||||
sock_put(psock->sk_redir);
|
||||
if (psock->sk_pair)
|
||||
sock_put(psock->sk_pair);
|
||||
sock_put(psock->sk);
|
||||
kfree(psock);
|
||||
}
|
||||
|
@ -505,6 +505,7 @@ static int ethnl_default_dumpit(struct sk_buff *skb,
|
||||
ret = skb->len;
|
||||
break;
|
||||
}
|
||||
ret = 0;
|
||||
}
|
||||
rtnl_unlock();
|
||||
|
||||
|
@ -216,8 +216,10 @@ static void igmp_start_timer(struct ip_mc_list *im, int max_delay)
|
||||
int tv = get_random_u32_below(max_delay);
|
||||
|
||||
im->tm_running = 1;
|
||||
if (!mod_timer(&im->timer, jiffies+tv+2))
|
||||
refcount_inc(&im->refcnt);
|
||||
if (refcount_inc_not_zero(&im->refcnt)) {
|
||||
if (mod_timer(&im->timer, jiffies + tv + 2))
|
||||
ip_ma_put(im);
|
||||
}
|
||||
}
|
||||
|
||||
static void igmp_gq_start_timer(struct in_device *in_dev)
|
||||
|
@ -88,7 +88,7 @@ config MAC80211_LEDS
|
||||
|
||||
config MAC80211_DEBUGFS
|
||||
bool "Export mac80211 internals in DebugFS"
|
||||
depends on MAC80211 && DEBUG_FS
|
||||
depends on MAC80211 && CFG80211_DEBUGFS
|
||||
help
|
||||
Select this to see extensive information about
|
||||
the internal state of mac80211 in debugfs.
|
||||
|
@ -22,88 +22,148 @@
|
||||
#include "debugfs_netdev.h"
|
||||
#include "driver-ops.h"
|
||||
|
||||
struct ieee80211_if_read_sdata_data {
|
||||
ssize_t (*format)(const struct ieee80211_sub_if_data *, char *, int);
|
||||
struct ieee80211_sub_if_data *sdata;
|
||||
};
|
||||
|
||||
static ssize_t ieee80211_if_read_sdata_handler(struct wiphy *wiphy,
|
||||
struct file *file,
|
||||
char *buf,
|
||||
size_t bufsize,
|
||||
void *data)
|
||||
{
|
||||
struct ieee80211_if_read_sdata_data *d = data;
|
||||
|
||||
return d->format(d->sdata, buf, bufsize);
|
||||
}
|
||||
|
||||
static ssize_t ieee80211_if_read_sdata(
|
||||
struct ieee80211_sub_if_data *sdata,
|
||||
struct file *file,
|
||||
char __user *userbuf,
|
||||
size_t count, loff_t *ppos,
|
||||
ssize_t (*format)(const struct ieee80211_sub_if_data *sdata, char *, int))
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = file->private_data;
|
||||
struct ieee80211_if_read_sdata_data data = {
|
||||
.format = format,
|
||||
.sdata = sdata,
|
||||
};
|
||||
char buf[200];
|
||||
ssize_t ret = -EINVAL;
|
||||
|
||||
wiphy_lock(sdata->local->hw.wiphy);
|
||||
ret = (*format)(sdata, buf, sizeof(buf));
|
||||
wiphy_unlock(sdata->local->hw.wiphy);
|
||||
return wiphy_locked_debugfs_read(sdata->local->hw.wiphy,
|
||||
file, buf, sizeof(buf),
|
||||
userbuf, count, ppos,
|
||||
ieee80211_if_read_sdata_handler,
|
||||
&data);
|
||||
}
|
||||
|
||||
if (ret >= 0)
|
||||
ret = simple_read_from_buffer(userbuf, count, ppos, buf, ret);
|
||||
struct ieee80211_if_write_sdata_data {
|
||||
ssize_t (*write)(struct ieee80211_sub_if_data *, const char *, int);
|
||||
struct ieee80211_sub_if_data *sdata;
|
||||
};
|
||||
|
||||
return ret;
|
||||
static ssize_t ieee80211_if_write_sdata_handler(struct wiphy *wiphy,
|
||||
struct file *file,
|
||||
char *buf,
|
||||
size_t count,
|
||||
void *data)
|
||||
{
|
||||
struct ieee80211_if_write_sdata_data *d = data;
|
||||
|
||||
return d->write(d->sdata, buf, count);
|
||||
}
|
||||
|
||||
static ssize_t ieee80211_if_write_sdata(
|
||||
struct ieee80211_sub_if_data *sdata,
|
||||
struct file *file,
|
||||
const char __user *userbuf,
|
||||
size_t count, loff_t *ppos,
|
||||
ssize_t (*write)(struct ieee80211_sub_if_data *sdata, const char *, int))
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = file->private_data;
|
||||
struct ieee80211_if_write_sdata_data data = {
|
||||
.write = write,
|
||||
.sdata = sdata,
|
||||
};
|
||||
char buf[64];
|
||||
ssize_t ret;
|
||||
|
||||
if (count >= sizeof(buf))
|
||||
return -E2BIG;
|
||||
return wiphy_locked_debugfs_write(sdata->local->hw.wiphy,
|
||||
file, buf, sizeof(buf),
|
||||
userbuf, count,
|
||||
ieee80211_if_write_sdata_handler,
|
||||
&data);
|
||||
}
|
||||
|
||||
if (copy_from_user(buf, userbuf, count))
|
||||
return -EFAULT;
|
||||
buf[count] = '\0';
|
||||
struct ieee80211_if_read_link_data {
|
||||
ssize_t (*format)(const struct ieee80211_link_data *, char *, int);
|
||||
struct ieee80211_link_data *link;
|
||||
};
|
||||
|
||||
wiphy_lock(sdata->local->hw.wiphy);
|
||||
ret = (*write)(sdata, buf, count);
|
||||
wiphy_unlock(sdata->local->hw.wiphy);
|
||||
static ssize_t ieee80211_if_read_link_handler(struct wiphy *wiphy,
|
||||
struct file *file,
|
||||
char *buf,
|
||||
size_t bufsize,
|
||||
void *data)
|
||||
{
|
||||
struct ieee80211_if_read_link_data *d = data;
|
||||
|
||||
return ret;
|
||||
return d->format(d->link, buf, bufsize);
|
||||
}
|
||||
|
||||
static ssize_t ieee80211_if_read_link(
|
||||
struct ieee80211_link_data *link,
|
||||
struct file *file,
|
||||
char __user *userbuf,
|
||||
size_t count, loff_t *ppos,
|
||||
ssize_t (*format)(const struct ieee80211_link_data *link, char *, int))
|
||||
{
|
||||
struct ieee80211_link_data *link = file->private_data;
|
||||
struct ieee80211_if_read_link_data data = {
|
||||
.format = format,
|
||||
.link = link,
|
||||
};
|
||||
char buf[200];
|
||||
ssize_t ret = -EINVAL;
|
||||
|
||||
wiphy_lock(link->sdata->local->hw.wiphy);
|
||||
ret = (*format)(link, buf, sizeof(buf));
|
||||
wiphy_unlock(link->sdata->local->hw.wiphy);
|
||||
return wiphy_locked_debugfs_read(link->sdata->local->hw.wiphy,
|
||||
file, buf, sizeof(buf),
|
||||
userbuf, count, ppos,
|
||||
ieee80211_if_read_link_handler,
|
||||
&data);
|
||||
}
|
||||
|
||||
if (ret >= 0)
|
||||
ret = simple_read_from_buffer(userbuf, count, ppos, buf, ret);
|
||||
struct ieee80211_if_write_link_data {
|
||||
ssize_t (*write)(struct ieee80211_link_data *, const char *, int);
|
||||
struct ieee80211_link_data *link;
|
||||
};
|
||||
|
||||
return ret;
|
||||
static ssize_t ieee80211_if_write_link_handler(struct wiphy *wiphy,
|
||||
struct file *file,
|
||||
char *buf,
|
||||
size_t count,
|
||||
void *data)
|
||||
{
|
||||
struct ieee80211_if_write_sdata_data *d = data;
|
||||
|
||||
return d->write(d->sdata, buf, count);
|
||||
}
|
||||
|
||||
static ssize_t ieee80211_if_write_link(
|
||||
struct ieee80211_link_data *link,
|
||||
struct file *file,
|
||||
const char __user *userbuf,
|
||||
size_t count, loff_t *ppos,
|
||||
ssize_t (*write)(struct ieee80211_link_data *link, const char *, int))
|
||||
{
|
||||
struct ieee80211_link_data *link = file->private_data;
|
||||
struct ieee80211_if_write_link_data data = {
|
||||
.write = write,
|
||||
.link = link,
|
||||
};
|
||||
char buf[64];
|
||||
ssize_t ret;
|
||||
|
||||
if (count >= sizeof(buf))
|
||||
return -E2BIG;
|
||||
|
||||
if (copy_from_user(buf, userbuf, count))
|
||||
return -EFAULT;
|
||||
buf[count] = '\0';
|
||||
|
||||
wiphy_lock(link->sdata->local->hw.wiphy);
|
||||
ret = (*write)(link, buf, count);
|
||||
wiphy_unlock(link->sdata->local->hw.wiphy);
|
||||
|
||||
return ret;
|
||||
return wiphy_locked_debugfs_write(link->sdata->local->hw.wiphy,
|
||||
file, buf, sizeof(buf),
|
||||
userbuf, count,
|
||||
ieee80211_if_write_link_handler,
|
||||
&data);
|
||||
}
|
||||
|
||||
#define IEEE80211_IF_FMT(name, type, field, format_string) \
|
||||
@ -173,7 +233,7 @@ static ssize_t ieee80211_if_read_##name(struct file *file, \
|
||||
char __user *userbuf, \
|
||||
size_t count, loff_t *ppos) \
|
||||
{ \
|
||||
return ieee80211_if_read_sdata(file->private_data, \
|
||||
return ieee80211_if_read_sdata(file, \
|
||||
userbuf, count, ppos, \
|
||||
ieee80211_if_fmt_##name); \
|
||||
}
|
||||
@ -183,7 +243,7 @@ static ssize_t ieee80211_if_write_##name(struct file *file, \
|
||||
const char __user *userbuf, \
|
||||
size_t count, loff_t *ppos) \
|
||||
{ \
|
||||
return ieee80211_if_write_sdata(file->private_data, userbuf, \
|
||||
return ieee80211_if_write_sdata(file, userbuf, \
|
||||
count, ppos, \
|
||||
ieee80211_if_parse_##name); \
|
||||
}
|
||||
@ -211,7 +271,7 @@ static ssize_t ieee80211_if_read_##name(struct file *file, \
|
||||
char __user *userbuf, \
|
||||
size_t count, loff_t *ppos) \
|
||||
{ \
|
||||
return ieee80211_if_read_link(file->private_data, \
|
||||
return ieee80211_if_read_link(file, \
|
||||
userbuf, count, ppos, \
|
||||
ieee80211_if_fmt_##name); \
|
||||
}
|
||||
@ -221,7 +281,7 @@ static ssize_t ieee80211_if_write_##name(struct file *file, \
|
||||
const char __user *userbuf, \
|
||||
size_t count, loff_t *ppos) \
|
||||
{ \
|
||||
return ieee80211_if_write_link(file->private_data, userbuf, \
|
||||
return ieee80211_if_write_link(file, userbuf, \
|
||||
count, ppos, \
|
||||
ieee80211_if_parse_##name); \
|
||||
}
|
||||
|
@ -312,23 +312,14 @@ static ssize_t sta_aql_write(struct file *file, const char __user *userbuf,
|
||||
STA_OPS_RW(aql);
|
||||
|
||||
|
||||
static ssize_t sta_agg_status_read(struct file *file, char __user *userbuf,
|
||||
size_t count, loff_t *ppos)
|
||||
static ssize_t sta_agg_status_do_read(struct wiphy *wiphy, struct file *file,
|
||||
char *buf, size_t bufsz, void *data)
|
||||
{
|
||||
char *buf, *p;
|
||||
ssize_t bufsz = 71 + IEEE80211_NUM_TIDS * 40;
|
||||
struct sta_info *sta = data;
|
||||
char *p = buf;
|
||||
int i;
|
||||
struct sta_info *sta = file->private_data;
|
||||
struct tid_ampdu_rx *tid_rx;
|
||||
struct tid_ampdu_tx *tid_tx;
|
||||
ssize_t ret;
|
||||
|
||||
buf = kzalloc(bufsz, GFP_KERNEL);
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
p = buf;
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
p += scnprintf(p, bufsz + buf - p, "next dialog_token: %#02x\n",
|
||||
sta->ampdu_mlme.dialog_token_allocator + 1);
|
||||
@ -338,8 +329,8 @@ static ssize_t sta_agg_status_read(struct file *file, char __user *userbuf,
|
||||
for (i = 0; i < IEEE80211_NUM_TIDS; i++) {
|
||||
bool tid_rx_valid;
|
||||
|
||||
tid_rx = rcu_dereference(sta->ampdu_mlme.tid_rx[i]);
|
||||
tid_tx = rcu_dereference(sta->ampdu_mlme.tid_tx[i]);
|
||||
tid_rx = wiphy_dereference(wiphy, sta->ampdu_mlme.tid_rx[i]);
|
||||
tid_tx = wiphy_dereference(wiphy, sta->ampdu_mlme.tid_tx[i]);
|
||||
tid_rx_valid = test_bit(i, sta->ampdu_mlme.agg_session_valid);
|
||||
|
||||
p += scnprintf(p, bufsz + buf - p, "%02d", i);
|
||||
@ -358,31 +349,39 @@ static ssize_t sta_agg_status_read(struct file *file, char __user *userbuf,
|
||||
tid_tx ? skb_queue_len(&tid_tx->pending) : 0);
|
||||
p += scnprintf(p, bufsz + buf - p, "\n");
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
ret = simple_read_from_buffer(userbuf, count, ppos, buf, p - buf);
|
||||
return p - buf;
|
||||
}
|
||||
|
||||
static ssize_t sta_agg_status_read(struct file *file, char __user *userbuf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct sta_info *sta = file->private_data;
|
||||
struct wiphy *wiphy = sta->local->hw.wiphy;
|
||||
size_t bufsz = 71 + IEEE80211_NUM_TIDS * 40;
|
||||
char *buf = kmalloc(bufsz, GFP_KERNEL);
|
||||
ssize_t ret;
|
||||
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = wiphy_locked_debugfs_read(wiphy, file, buf, bufsz,
|
||||
userbuf, count, ppos,
|
||||
sta_agg_status_do_read, sta);
|
||||
kfree(buf);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ssize_t sta_agg_status_write(struct file *file, const char __user *userbuf,
|
||||
size_t count, loff_t *ppos)
|
||||
static ssize_t sta_agg_status_do_write(struct wiphy *wiphy, struct file *file,
|
||||
char *buf, size_t count, void *data)
|
||||
{
|
||||
char _buf[25] = {}, *buf = _buf;
|
||||
struct sta_info *sta = file->private_data;
|
||||
struct sta_info *sta = data;
|
||||
bool start, tx;
|
||||
unsigned long tid;
|
||||
char *pos;
|
||||
char *pos = buf;
|
||||
int ret, timeout = 5000;
|
||||
|
||||
if (count > sizeof(_buf))
|
||||
return -EINVAL;
|
||||
|
||||
if (copy_from_user(buf, userbuf, count))
|
||||
return -EFAULT;
|
||||
|
||||
buf[sizeof(_buf) - 1] = '\0';
|
||||
pos = buf;
|
||||
buf = strsep(&pos, " ");
|
||||
if (!buf)
|
||||
return -EINVAL;
|
||||
@ -420,7 +419,6 @@ static ssize_t sta_agg_status_write(struct file *file, const char __user *userbu
|
||||
if (ret || tid >= IEEE80211_NUM_TIDS)
|
||||
return -EINVAL;
|
||||
|
||||
wiphy_lock(sta->local->hw.wiphy);
|
||||
if (tx) {
|
||||
if (start)
|
||||
ret = ieee80211_start_tx_ba_session(&sta->sta, tid,
|
||||
@ -432,10 +430,22 @@ static ssize_t sta_agg_status_write(struct file *file, const char __user *userbu
|
||||
3, true);
|
||||
ret = 0;
|
||||
}
|
||||
wiphy_unlock(sta->local->hw.wiphy);
|
||||
|
||||
return ret ?: count;
|
||||
}
|
||||
|
||||
static ssize_t sta_agg_status_write(struct file *file,
|
||||
const char __user *userbuf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct sta_info *sta = file->private_data;
|
||||
struct wiphy *wiphy = sta->local->hw.wiphy;
|
||||
char _buf[26];
|
||||
|
||||
return wiphy_locked_debugfs_write(wiphy, file, _buf, sizeof(_buf),
|
||||
userbuf, count,
|
||||
sta_agg_status_do_write, sta);
|
||||
}
|
||||
STA_OPS_RW(agg_status);
|
||||
|
||||
/* link sta attributes */
|
||||
|
@ -23,7 +23,7 @@
|
||||
static inline struct ieee80211_sub_if_data *
|
||||
get_bss_sdata(struct ieee80211_sub_if_data *sdata)
|
||||
{
|
||||
if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
|
||||
if (sdata && sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
|
||||
sdata = container_of(sdata->bss, struct ieee80211_sub_if_data,
|
||||
u.ap);
|
||||
|
||||
@ -695,11 +695,14 @@ static inline void drv_flush(struct ieee80211_local *local,
|
||||
struct ieee80211_sub_if_data *sdata,
|
||||
u32 queues, bool drop)
|
||||
{
|
||||
struct ieee80211_vif *vif = sdata ? &sdata->vif : NULL;
|
||||
struct ieee80211_vif *vif;
|
||||
|
||||
might_sleep();
|
||||
lockdep_assert_wiphy(local->hw.wiphy);
|
||||
|
||||
sdata = get_bss_sdata(sdata);
|
||||
vif = sdata ? &sdata->vif : NULL;
|
||||
|
||||
if (sdata && !check_sdata_in_driver(sdata))
|
||||
return;
|
||||
|
||||
@ -716,6 +719,8 @@ static inline void drv_flush_sta(struct ieee80211_local *local,
|
||||
might_sleep();
|
||||
lockdep_assert_wiphy(local->hw.wiphy);
|
||||
|
||||
sdata = get_bss_sdata(sdata);
|
||||
|
||||
if (sdata && !check_sdata_in_driver(sdata))
|
||||
return;
|
||||
|
||||
|
@ -271,6 +271,7 @@ bool ieee80211_ht_cap_ie_to_sta_ht_cap(struct ieee80211_sub_if_data *sdata,
|
||||
case NL80211_CHAN_WIDTH_80:
|
||||
case NL80211_CHAN_WIDTH_80P80:
|
||||
case NL80211_CHAN_WIDTH_160:
|
||||
case NL80211_CHAN_WIDTH_320:
|
||||
bw = ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40 ?
|
||||
IEEE80211_STA_RX_BW_40 : IEEE80211_STA_RX_BW_20;
|
||||
break;
|
||||
|
@ -108,6 +108,7 @@ static void mptcp_parse_option(const struct sk_buff *skb,
|
||||
mp_opt->suboptions |= OPTION_MPTCP_DSS;
|
||||
mp_opt->use_map = 1;
|
||||
mp_opt->mpc_map = 1;
|
||||
mp_opt->use_ack = 0;
|
||||
mp_opt->data_len = get_unaligned_be16(ptr);
|
||||
ptr += 2;
|
||||
}
|
||||
|
@ -213,8 +213,6 @@ static inline bool unix_secdata_eq(struct scm_cookie *scm, struct sk_buff *skb)
|
||||
}
|
||||
#endif /* CONFIG_SECURITY_NETWORK */
|
||||
|
||||
#define unix_peer(sk) (unix_sk(sk)->peer)
|
||||
|
||||
static inline int unix_our_peer(struct sock *sk, struct sock *osk)
|
||||
{
|
||||
return unix_peer(osk) == sk;
|
||||
|
@ -159,12 +159,17 @@ int unix_dgram_bpf_update_proto(struct sock *sk, struct sk_psock *psock, bool re
|
||||
|
||||
int unix_stream_bpf_update_proto(struct sock *sk, struct sk_psock *psock, bool restore)
|
||||
{
|
||||
struct sock *sk_pair;
|
||||
|
||||
if (restore) {
|
||||
sk->sk_write_space = psock->saved_write_space;
|
||||
sock_replace_proto(sk, psock->sk_proto);
|
||||
return 0;
|
||||
}
|
||||
|
||||
sk_pair = unix_peer(sk);
|
||||
sock_hold(sk_pair);
|
||||
psock->sk_pair = sk_pair;
|
||||
unix_stream_bpf_check_needs_rebuild(psock->sk_proto);
|
||||
sock_replace_proto(sk, &unix_stream_bpf_prot);
|
||||
return 0;
|
||||
|
@ -191,13 +191,13 @@ int cfg80211_switch_netns(struct cfg80211_registered_device *rdev,
|
||||
return err;
|
||||
}
|
||||
|
||||
wiphy_lock(&rdev->wiphy);
|
||||
list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
|
||||
if (!wdev->netdev)
|
||||
continue;
|
||||
nl80211_notify_iface(rdev, wdev, NL80211_CMD_DEL_INTERFACE);
|
||||
}
|
||||
|
||||
wiphy_lock(&rdev->wiphy);
|
||||
nl80211_notify_wiphy(rdev, NL80211_CMD_DEL_WIPHY);
|
||||
|
||||
wiphy_net_set(&rdev->wiphy, net);
|
||||
@ -206,13 +206,13 @@ int cfg80211_switch_netns(struct cfg80211_registered_device *rdev,
|
||||
WARN_ON(err);
|
||||
|
||||
nl80211_notify_wiphy(rdev, NL80211_CMD_NEW_WIPHY);
|
||||
wiphy_unlock(&rdev->wiphy);
|
||||
|
||||
list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
|
||||
if (!wdev->netdev)
|
||||
continue;
|
||||
nl80211_notify_iface(rdev, wdev, NL80211_CMD_NEW_INTERFACE);
|
||||
}
|
||||
wiphy_unlock(&rdev->wiphy);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -221,7 +221,9 @@ static void cfg80211_rfkill_poll(struct rfkill *rfkill, void *data)
|
||||
{
|
||||
struct cfg80211_registered_device *rdev = data;
|
||||
|
||||
wiphy_lock(&rdev->wiphy);
|
||||
rdev_rfkill_poll(rdev);
|
||||
wiphy_unlock(&rdev->wiphy);
|
||||
}
|
||||
|
||||
void cfg80211_stop_p2p_device(struct cfg80211_registered_device *rdev,
|
||||
|
@ -293,6 +293,7 @@ struct cfg80211_cqm_config {
|
||||
u32 rssi_hyst;
|
||||
s32 last_rssi_event_value;
|
||||
enum nl80211_cqm_rssi_threshold_event last_rssi_event_type;
|
||||
bool use_range_api;
|
||||
int n_rssi_thresholds;
|
||||
s32 rssi_thresholds[] __counted_by(n_rssi_thresholds);
|
||||
};
|
||||
|
@ -4,6 +4,7 @@
|
||||
*
|
||||
* Copyright 2009 Luis R. Rodriguez <lrodriguez@atheros.com>
|
||||
* Copyright 2007 Johannes Berg <johannes@sipsolutions.net>
|
||||
* Copyright (C) 2023 Intel Corporation
|
||||
*/
|
||||
|
||||
#include <linux/slab.h>
|
||||
@ -109,3 +110,162 @@ void cfg80211_debugfs_rdev_add(struct cfg80211_registered_device *rdev)
|
||||
DEBUGFS_ADD(long_retry_limit);
|
||||
DEBUGFS_ADD(ht40allow_map);
|
||||
}
|
||||
|
||||
struct debugfs_read_work {
|
||||
struct wiphy_work work;
|
||||
ssize_t (*handler)(struct wiphy *wiphy,
|
||||
struct file *file,
|
||||
char *buf,
|
||||
size_t count,
|
||||
void *data);
|
||||
struct wiphy *wiphy;
|
||||
struct file *file;
|
||||
char *buf;
|
||||
size_t bufsize;
|
||||
void *data;
|
||||
ssize_t ret;
|
||||
struct completion completion;
|
||||
};
|
||||
|
||||
static void wiphy_locked_debugfs_read_work(struct wiphy *wiphy,
|
||||
struct wiphy_work *work)
|
||||
{
|
||||
struct debugfs_read_work *w = container_of(work, typeof(*w), work);
|
||||
|
||||
w->ret = w->handler(w->wiphy, w->file, w->buf, w->bufsize, w->data);
|
||||
complete(&w->completion);
|
||||
}
|
||||
|
||||
static void wiphy_locked_debugfs_read_cancel(struct dentry *dentry,
|
||||
void *data)
|
||||
{
|
||||
struct debugfs_read_work *w = data;
|
||||
|
||||
wiphy_work_cancel(w->wiphy, &w->work);
|
||||
complete(&w->completion);
|
||||
}
|
||||
|
||||
ssize_t wiphy_locked_debugfs_read(struct wiphy *wiphy, struct file *file,
|
||||
char *buf, size_t bufsize,
|
||||
char __user *userbuf, size_t count,
|
||||
loff_t *ppos,
|
||||
ssize_t (*handler)(struct wiphy *wiphy,
|
||||
struct file *file,
|
||||
char *buf,
|
||||
size_t bufsize,
|
||||
void *data),
|
||||
void *data)
|
||||
{
|
||||
struct debugfs_read_work work = {
|
||||
.handler = handler,
|
||||
.wiphy = wiphy,
|
||||
.file = file,
|
||||
.buf = buf,
|
||||
.bufsize = bufsize,
|
||||
.data = data,
|
||||
.ret = -ENODEV,
|
||||
.completion = COMPLETION_INITIALIZER_ONSTACK(work.completion),
|
||||
};
|
||||
struct debugfs_cancellation cancellation = {
|
||||
.cancel = wiphy_locked_debugfs_read_cancel,
|
||||
.cancel_data = &work,
|
||||
};
|
||||
|
||||
/* don't leak stack data or whatever */
|
||||
memset(buf, 0, bufsize);
|
||||
|
||||
wiphy_work_init(&work.work, wiphy_locked_debugfs_read_work);
|
||||
wiphy_work_queue(wiphy, &work.work);
|
||||
|
||||
debugfs_enter_cancellation(file, &cancellation);
|
||||
wait_for_completion(&work.completion);
|
||||
debugfs_leave_cancellation(file, &cancellation);
|
||||
|
||||
if (work.ret < 0)
|
||||
return work.ret;
|
||||
|
||||
if (WARN_ON(work.ret > bufsize))
|
||||
return -EINVAL;
|
||||
|
||||
return simple_read_from_buffer(userbuf, count, ppos, buf, work.ret);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(wiphy_locked_debugfs_read);
|
||||
|
||||
struct debugfs_write_work {
|
||||
struct wiphy_work work;
|
||||
ssize_t (*handler)(struct wiphy *wiphy,
|
||||
struct file *file,
|
||||
char *buf,
|
||||
size_t count,
|
||||
void *data);
|
||||
struct wiphy *wiphy;
|
||||
struct file *file;
|
||||
char *buf;
|
||||
size_t count;
|
||||
void *data;
|
||||
ssize_t ret;
|
||||
struct completion completion;
|
||||
};
|
||||
|
||||
static void wiphy_locked_debugfs_write_work(struct wiphy *wiphy,
|
||||
struct wiphy_work *work)
|
||||
{
|
||||
struct debugfs_write_work *w = container_of(work, typeof(*w), work);
|
||||
|
||||
w->ret = w->handler(w->wiphy, w->file, w->buf, w->count, w->data);
|
||||
complete(&w->completion);
|
||||
}
|
||||
|
||||
static void wiphy_locked_debugfs_write_cancel(struct dentry *dentry,
|
||||
void *data)
|
||||
{
|
||||
struct debugfs_write_work *w = data;
|
||||
|
||||
wiphy_work_cancel(w->wiphy, &w->work);
|
||||
complete(&w->completion);
|
||||
}
|
||||
|
||||
ssize_t wiphy_locked_debugfs_write(struct wiphy *wiphy,
|
||||
struct file *file, char *buf, size_t bufsize,
|
||||
const char __user *userbuf, size_t count,
|
||||
ssize_t (*handler)(struct wiphy *wiphy,
|
||||
struct file *file,
|
||||
char *buf,
|
||||
size_t count,
|
||||
void *data),
|
||||
void *data)
|
||||
{
|
||||
struct debugfs_write_work work = {
|
||||
.handler = handler,
|
||||
.wiphy = wiphy,
|
||||
.file = file,
|
||||
.buf = buf,
|
||||
.count = count,
|
||||
.data = data,
|
||||
.ret = -ENODEV,
|
||||
.completion = COMPLETION_INITIALIZER_ONSTACK(work.completion),
|
||||
};
|
||||
struct debugfs_cancellation cancellation = {
|
||||
.cancel = wiphy_locked_debugfs_write_cancel,
|
||||
.cancel_data = &work,
|
||||
};
|
||||
|
||||
/* mostly used for strings so enforce NUL-termination for safety */
|
||||
if (count >= bufsize)
|
||||
return -EINVAL;
|
||||
|
||||
memset(buf, 0, bufsize);
|
||||
|
||||
if (copy_from_user(buf, userbuf, count))
|
||||
return -EFAULT;
|
||||
|
||||
wiphy_work_init(&work.work, wiphy_locked_debugfs_write_work);
|
||||
wiphy_work_queue(wiphy, &work.work);
|
||||
|
||||
debugfs_enter_cancellation(file, &cancellation);
|
||||
wait_for_completion(&work.completion);
|
||||
debugfs_leave_cancellation(file, &cancellation);
|
||||
|
||||
return work.ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(wiphy_locked_debugfs_write);
|
||||
|
@ -3822,6 +3822,8 @@ static int nl80211_send_iface(struct sk_buff *msg, u32 portid, u32 seq, int flag
|
||||
struct net_device *dev = wdev->netdev;
|
||||
void *hdr;
|
||||
|
||||
lockdep_assert_wiphy(&rdev->wiphy);
|
||||
|
||||
WARN_ON(cmd != NL80211_CMD_NEW_INTERFACE &&
|
||||
cmd != NL80211_CMD_DEL_INTERFACE &&
|
||||
cmd != NL80211_CMD_SET_INTERFACE);
|
||||
@ -3989,6 +3991,7 @@ static int nl80211_dump_interface(struct sk_buff *skb, struct netlink_callback *
|
||||
|
||||
if_idx = 0;
|
||||
|
||||
wiphy_lock(&rdev->wiphy);
|
||||
list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
|
||||
if (if_idx < if_start) {
|
||||
if_idx++;
|
||||
@ -3998,10 +4001,12 @@ static int nl80211_dump_interface(struct sk_buff *skb, struct netlink_callback *
|
||||
cb->nlh->nlmsg_seq, NLM_F_MULTI,
|
||||
rdev, wdev,
|
||||
NL80211_CMD_NEW_INTERFACE) < 0) {
|
||||
wiphy_unlock(&rdev->wiphy);
|
||||
goto out;
|
||||
}
|
||||
if_idx++;
|
||||
}
|
||||
wiphy_unlock(&rdev->wiphy);
|
||||
|
||||
wp_idx++;
|
||||
}
|
||||
@ -12787,10 +12792,6 @@ static int cfg80211_cqm_rssi_update(struct cfg80211_registered_device *rdev,
|
||||
int i, n, low_index;
|
||||
int err;
|
||||
|
||||
/* RSSI reporting disabled? */
|
||||
if (!cqm_config)
|
||||
return rdev_set_cqm_rssi_range_config(rdev, dev, 0, 0);
|
||||
|
||||
/*
|
||||
* Obtain current RSSI value if possible, if not and no RSSI threshold
|
||||
* event has been received yet, we should receive an event after a
|
||||
@ -12865,23 +12866,25 @@ static int nl80211_set_cqm_rssi(struct genl_info *info,
|
||||
wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (n_thresholds <= 1 && rdev->ops->set_cqm_rssi_config) {
|
||||
if (n_thresholds == 0 || thresholds[0] == 0) /* Disabling */
|
||||
return rdev_set_cqm_rssi_config(rdev, dev, 0, 0);
|
||||
|
||||
return rdev_set_cqm_rssi_config(rdev, dev,
|
||||
thresholds[0], hysteresis);
|
||||
}
|
||||
|
||||
if (!wiphy_ext_feature_isset(&rdev->wiphy,
|
||||
NL80211_EXT_FEATURE_CQM_RSSI_LIST))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (n_thresholds == 1 && thresholds[0] == 0) /* Disabling */
|
||||
n_thresholds = 0;
|
||||
|
||||
old = wiphy_dereference(wdev->wiphy, wdev->cqm_config);
|
||||
|
||||
/* if already disabled just succeed */
|
||||
if (!n_thresholds && !old)
|
||||
return 0;
|
||||
|
||||
if (n_thresholds > 1) {
|
||||
if (!wiphy_ext_feature_isset(&rdev->wiphy,
|
||||
NL80211_EXT_FEATURE_CQM_RSSI_LIST) ||
|
||||
!rdev->ops->set_cqm_rssi_range_config)
|
||||
return -EOPNOTSUPP;
|
||||
} else {
|
||||
if (!rdev->ops->set_cqm_rssi_config)
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
if (n_thresholds) {
|
||||
cqm_config = kzalloc(struct_size(cqm_config, rssi_thresholds,
|
||||
n_thresholds),
|
||||
@ -12894,13 +12897,26 @@ static int nl80211_set_cqm_rssi(struct genl_info *info,
|
||||
memcpy(cqm_config->rssi_thresholds, thresholds,
|
||||
flex_array_size(cqm_config, rssi_thresholds,
|
||||
n_thresholds));
|
||||
cqm_config->use_range_api = n_thresholds > 1 ||
|
||||
!rdev->ops->set_cqm_rssi_config;
|
||||
|
||||
rcu_assign_pointer(wdev->cqm_config, cqm_config);
|
||||
|
||||
if (cqm_config->use_range_api)
|
||||
err = cfg80211_cqm_rssi_update(rdev, dev, cqm_config);
|
||||
else
|
||||
err = rdev_set_cqm_rssi_config(rdev, dev,
|
||||
thresholds[0],
|
||||
hysteresis);
|
||||
} else {
|
||||
RCU_INIT_POINTER(wdev->cqm_config, NULL);
|
||||
/* if enabled as range also disable via range */
|
||||
if (old->use_range_api)
|
||||
err = rdev_set_cqm_rssi_range_config(rdev, dev, 0, 0);
|
||||
else
|
||||
err = rdev_set_cqm_rssi_config(rdev, dev, 0, 0);
|
||||
}
|
||||
|
||||
err = cfg80211_cqm_rssi_update(rdev, dev, cqm_config);
|
||||
if (err) {
|
||||
rcu_assign_pointer(wdev->cqm_config, old);
|
||||
kfree_rcu(cqm_config, rcu_head);
|
||||
@ -19009,10 +19025,11 @@ void cfg80211_cqm_rssi_notify_work(struct wiphy *wiphy, struct wiphy_work *work)
|
||||
s32 rssi_level;
|
||||
|
||||
cqm_config = wiphy_dereference(wdev->wiphy, wdev->cqm_config);
|
||||
if (!wdev->cqm_config)
|
||||
if (!cqm_config)
|
||||
return;
|
||||
|
||||
cfg80211_cqm_rssi_update(rdev, wdev->netdev, cqm_config);
|
||||
if (cqm_config->use_range_api)
|
||||
cfg80211_cqm_rssi_update(rdev, wdev->netdev, cqm_config);
|
||||
|
||||
rssi_level = cqm_config->last_rssi_event_value;
|
||||
rssi_event = cqm_config->last_rssi_event_type;
|
||||
|
@ -2399,6 +2399,7 @@ void devlink_port_set_req_free(struct devlink_port_set_req *req)
|
||||
|
||||
int devlink_port_set(struct ynl_sock *ys, struct devlink_port_set_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -2416,7 +2417,7 @@ int devlink_port_set(struct ynl_sock *ys, struct devlink_port_set_req *req)
|
||||
if (req->_present.port_function)
|
||||
devlink_dl_port_function_put(nlh, DEVLINK_ATTR_PORT_FUNCTION, &req->port_function);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -2537,6 +2538,7 @@ void devlink_port_del_req_free(struct devlink_port_del_req *req)
|
||||
|
||||
int devlink_port_del(struct ynl_sock *ys, struct devlink_port_del_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -2550,7 +2552,7 @@ int devlink_port_del(struct ynl_sock *ys, struct devlink_port_del_req *req)
|
||||
if (req->_present.port_index)
|
||||
mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -2568,6 +2570,7 @@ void devlink_port_split_req_free(struct devlink_port_split_req *req)
|
||||
|
||||
int devlink_port_split(struct ynl_sock *ys, struct devlink_port_split_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -2583,7 +2586,7 @@ int devlink_port_split(struct ynl_sock *ys, struct devlink_port_split_req *req)
|
||||
if (req->_present.port_split_count)
|
||||
mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_SPLIT_COUNT, req->port_split_count);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -2602,6 +2605,7 @@ void devlink_port_unsplit_req_free(struct devlink_port_unsplit_req *req)
|
||||
int devlink_port_unsplit(struct ynl_sock *ys,
|
||||
struct devlink_port_unsplit_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -2615,7 +2619,7 @@ int devlink_port_unsplit(struct ynl_sock *ys,
|
||||
if (req->_present.port_index)
|
||||
mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -2926,6 +2930,7 @@ void devlink_sb_pool_set_req_free(struct devlink_sb_pool_set_req *req)
|
||||
int devlink_sb_pool_set(struct ynl_sock *ys,
|
||||
struct devlink_sb_pool_set_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -2945,7 +2950,7 @@ int devlink_sb_pool_set(struct ynl_sock *ys,
|
||||
if (req->_present.sb_pool_size)
|
||||
mnl_attr_put_u32(nlh, DEVLINK_ATTR_SB_POOL_SIZE, req->sb_pool_size);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -3126,6 +3131,7 @@ devlink_sb_port_pool_set_req_free(struct devlink_sb_port_pool_set_req *req)
|
||||
int devlink_sb_port_pool_set(struct ynl_sock *ys,
|
||||
struct devlink_sb_port_pool_set_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -3145,7 +3151,7 @@ int devlink_sb_port_pool_set(struct ynl_sock *ys,
|
||||
if (req->_present.sb_threshold)
|
||||
mnl_attr_put_u32(nlh, DEVLINK_ATTR_SB_THRESHOLD, req->sb_threshold);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -3334,6 +3340,7 @@ devlink_sb_tc_pool_bind_set_req_free(struct devlink_sb_tc_pool_bind_set_req *req
|
||||
int devlink_sb_tc_pool_bind_set(struct ynl_sock *ys,
|
||||
struct devlink_sb_tc_pool_bind_set_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -3357,7 +3364,7 @@ int devlink_sb_tc_pool_bind_set(struct ynl_sock *ys,
|
||||
if (req->_present.sb_threshold)
|
||||
mnl_attr_put_u32(nlh, DEVLINK_ATTR_SB_THRESHOLD, req->sb_threshold);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -3376,6 +3383,7 @@ void devlink_sb_occ_snapshot_req_free(struct devlink_sb_occ_snapshot_req *req)
|
||||
int devlink_sb_occ_snapshot(struct ynl_sock *ys,
|
||||
struct devlink_sb_occ_snapshot_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -3389,7 +3397,7 @@ int devlink_sb_occ_snapshot(struct ynl_sock *ys,
|
||||
if (req->_present.sb_index)
|
||||
mnl_attr_put_u32(nlh, DEVLINK_ATTR_SB_INDEX, req->sb_index);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -3409,6 +3417,7 @@ devlink_sb_occ_max_clear_req_free(struct devlink_sb_occ_max_clear_req *req)
|
||||
int devlink_sb_occ_max_clear(struct ynl_sock *ys,
|
||||
struct devlink_sb_occ_max_clear_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -3422,7 +3431,7 @@ int devlink_sb_occ_max_clear(struct ynl_sock *ys,
|
||||
if (req->_present.sb_index)
|
||||
mnl_attr_put_u32(nlh, DEVLINK_ATTR_SB_INDEX, req->sb_index);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -3544,6 +3553,7 @@ void devlink_eswitch_set_req_free(struct devlink_eswitch_set_req *req)
|
||||
int devlink_eswitch_set(struct ynl_sock *ys,
|
||||
struct devlink_eswitch_set_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -3561,7 +3571,7 @@ int devlink_eswitch_set(struct ynl_sock *ys,
|
||||
if (req->_present.eswitch_encap_mode)
|
||||
mnl_attr_put_u8(nlh, DEVLINK_ATTR_ESWITCH_ENCAP_MODE, req->eswitch_encap_mode);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -3895,6 +3905,7 @@ devlink_dpipe_table_counters_set_req_free(struct devlink_dpipe_table_counters_se
|
||||
int devlink_dpipe_table_counters_set(struct ynl_sock *ys,
|
||||
struct devlink_dpipe_table_counters_set_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -3910,7 +3921,7 @@ int devlink_dpipe_table_counters_set(struct ynl_sock *ys,
|
||||
if (req->_present.dpipe_table_counters_enabled)
|
||||
mnl_attr_put_u8(nlh, DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED, req->dpipe_table_counters_enabled);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -3929,6 +3940,7 @@ void devlink_resource_set_req_free(struct devlink_resource_set_req *req)
|
||||
int devlink_resource_set(struct ynl_sock *ys,
|
||||
struct devlink_resource_set_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -3944,7 +3956,7 @@ int devlink_resource_set(struct ynl_sock *ys,
|
||||
if (req->_present.resource_size)
|
||||
mnl_attr_put_u64(nlh, DEVLINK_ATTR_RESOURCE_SIZE, req->resource_size);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -4319,6 +4331,7 @@ void devlink_param_set_req_free(struct devlink_param_set_req *req)
|
||||
|
||||
int devlink_param_set(struct ynl_sock *ys, struct devlink_param_set_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -4336,7 +4349,7 @@ int devlink_param_set(struct ynl_sock *ys, struct devlink_param_set_req *req)
|
||||
if (req->_present.param_value_cmode)
|
||||
mnl_attr_put_u8(nlh, DEVLINK_ATTR_PARAM_VALUE_CMODE, req->param_value_cmode);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -4631,6 +4644,7 @@ void devlink_region_del_req_free(struct devlink_region_del_req *req)
|
||||
|
||||
int devlink_region_del(struct ynl_sock *ys, struct devlink_region_del_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -4648,7 +4662,7 @@ int devlink_region_del(struct ynl_sock *ys, struct devlink_region_del_req *req)
|
||||
if (req->_present.region_snapshot_id)
|
||||
mnl_attr_put_u32(nlh, DEVLINK_ATTR_REGION_SNAPSHOT_ID, req->region_snapshot_id);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -4922,6 +4936,7 @@ void devlink_port_param_set_req_free(struct devlink_port_param_set_req *req)
|
||||
int devlink_port_param_set(struct ynl_sock *ys,
|
||||
struct devlink_port_param_set_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -4935,7 +4950,7 @@ int devlink_port_param_set(struct ynl_sock *ys,
|
||||
if (req->_present.port_index)
|
||||
mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -5360,6 +5375,7 @@ devlink_health_reporter_set_req_free(struct devlink_health_reporter_set_req *req
|
||||
int devlink_health_reporter_set(struct ynl_sock *ys,
|
||||
struct devlink_health_reporter_set_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -5381,7 +5397,7 @@ int devlink_health_reporter_set(struct ynl_sock *ys,
|
||||
if (req->_present.health_reporter_auto_dump)
|
||||
mnl_attr_put_u8(nlh, DEVLINK_ATTR_HEALTH_REPORTER_AUTO_DUMP, req->health_reporter_auto_dump);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -5402,6 +5418,7 @@ devlink_health_reporter_recover_req_free(struct devlink_health_reporter_recover_
|
||||
int devlink_health_reporter_recover(struct ynl_sock *ys,
|
||||
struct devlink_health_reporter_recover_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -5417,7 +5434,7 @@ int devlink_health_reporter_recover(struct ynl_sock *ys,
|
||||
if (req->_present.health_reporter_name_len)
|
||||
mnl_attr_put_strz(nlh, DEVLINK_ATTR_HEALTH_REPORTER_NAME, req->health_reporter_name);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -5438,6 +5455,7 @@ devlink_health_reporter_diagnose_req_free(struct devlink_health_reporter_diagnos
|
||||
int devlink_health_reporter_diagnose(struct ynl_sock *ys,
|
||||
struct devlink_health_reporter_diagnose_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -5453,7 +5471,7 @@ int devlink_health_reporter_diagnose(struct ynl_sock *ys,
|
||||
if (req->_present.health_reporter_name_len)
|
||||
mnl_attr_put_strz(nlh, DEVLINK_ATTR_HEALTH_REPORTER_NAME, req->health_reporter_name);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -5556,6 +5574,7 @@ devlink_health_reporter_dump_clear_req_free(struct devlink_health_reporter_dump_
|
||||
int devlink_health_reporter_dump_clear(struct ynl_sock *ys,
|
||||
struct devlink_health_reporter_dump_clear_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -5571,7 +5590,7 @@ int devlink_health_reporter_dump_clear(struct ynl_sock *ys,
|
||||
if (req->_present.health_reporter_name_len)
|
||||
mnl_attr_put_strz(nlh, DEVLINK_ATTR_HEALTH_REPORTER_NAME, req->health_reporter_name);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -5592,6 +5611,7 @@ void devlink_flash_update_req_free(struct devlink_flash_update_req *req)
|
||||
int devlink_flash_update(struct ynl_sock *ys,
|
||||
struct devlink_flash_update_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -5609,7 +5629,7 @@ int devlink_flash_update(struct ynl_sock *ys,
|
||||
if (req->_present.flash_update_overwrite_mask)
|
||||
mnl_attr_put(nlh, DEVLINK_ATTR_FLASH_UPDATE_OVERWRITE_MASK, sizeof(struct nla_bitfield32), &req->flash_update_overwrite_mask);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -5780,6 +5800,7 @@ void devlink_trap_set_req_free(struct devlink_trap_set_req *req)
|
||||
|
||||
int devlink_trap_set(struct ynl_sock *ys, struct devlink_trap_set_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -5795,7 +5816,7 @@ int devlink_trap_set(struct ynl_sock *ys, struct devlink_trap_set_req *req)
|
||||
if (req->_present.trap_action)
|
||||
mnl_attr_put_u8(nlh, DEVLINK_ATTR_TRAP_ACTION, req->trap_action);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -5968,6 +5989,7 @@ void devlink_trap_group_set_req_free(struct devlink_trap_group_set_req *req)
|
||||
int devlink_trap_group_set(struct ynl_sock *ys,
|
||||
struct devlink_trap_group_set_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -5985,7 +6007,7 @@ int devlink_trap_group_set(struct ynl_sock *ys,
|
||||
if (req->_present.trap_policer_id)
|
||||
mnl_attr_put_u32(nlh, DEVLINK_ATTR_TRAP_POLICER_ID, req->trap_policer_id);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -6152,6 +6174,7 @@ devlink_trap_policer_set_req_free(struct devlink_trap_policer_set_req *req)
|
||||
int devlink_trap_policer_set(struct ynl_sock *ys,
|
||||
struct devlink_trap_policer_set_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -6169,7 +6192,7 @@ int devlink_trap_policer_set(struct ynl_sock *ys,
|
||||
if (req->_present.trap_policer_burst)
|
||||
mnl_attr_put_u64(nlh, DEVLINK_ATTR_TRAP_POLICER_BURST, req->trap_policer_burst);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -6190,6 +6213,7 @@ devlink_health_reporter_test_req_free(struct devlink_health_reporter_test_req *r
|
||||
int devlink_health_reporter_test(struct ynl_sock *ys,
|
||||
struct devlink_health_reporter_test_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -6205,7 +6229,7 @@ int devlink_health_reporter_test(struct ynl_sock *ys,
|
||||
if (req->_present.health_reporter_name_len)
|
||||
mnl_attr_put_strz(nlh, DEVLINK_ATTR_HEALTH_REPORTER_NAME, req->health_reporter_name);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -6384,6 +6408,7 @@ void devlink_rate_set_req_free(struct devlink_rate_set_req *req)
|
||||
|
||||
int devlink_rate_set(struct ynl_sock *ys, struct devlink_rate_set_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -6407,7 +6432,7 @@ int devlink_rate_set(struct ynl_sock *ys, struct devlink_rate_set_req *req)
|
||||
if (req->_present.rate_parent_node_name_len)
|
||||
mnl_attr_put_strz(nlh, DEVLINK_ATTR_RATE_PARENT_NODE_NAME, req->rate_parent_node_name);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -6427,6 +6452,7 @@ void devlink_rate_new_req_free(struct devlink_rate_new_req *req)
|
||||
|
||||
int devlink_rate_new(struct ynl_sock *ys, struct devlink_rate_new_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -6450,7 +6476,7 @@ int devlink_rate_new(struct ynl_sock *ys, struct devlink_rate_new_req *req)
|
||||
if (req->_present.rate_parent_node_name_len)
|
||||
mnl_attr_put_strz(nlh, DEVLINK_ATTR_RATE_PARENT_NODE_NAME, req->rate_parent_node_name);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -6469,6 +6495,7 @@ void devlink_rate_del_req_free(struct devlink_rate_del_req *req)
|
||||
|
||||
int devlink_rate_del(struct ynl_sock *ys, struct devlink_rate_del_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -6482,7 +6509,7 @@ int devlink_rate_del(struct ynl_sock *ys, struct devlink_rate_del_req *req)
|
||||
if (req->_present.rate_node_name_len)
|
||||
mnl_attr_put_strz(nlh, DEVLINK_ATTR_RATE_NODE_NAME, req->rate_node_name);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -6645,6 +6672,7 @@ void devlink_linecard_set_req_free(struct devlink_linecard_set_req *req)
|
||||
int devlink_linecard_set(struct ynl_sock *ys,
|
||||
struct devlink_linecard_set_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -6660,7 +6688,7 @@ int devlink_linecard_set(struct ynl_sock *ys,
|
||||
if (req->_present.linecard_type_len)
|
||||
mnl_attr_put_strz(nlh, DEVLINK_ATTR_LINECARD_TYPE, req->linecard_type);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -6810,6 +6838,7 @@ void devlink_selftests_run_req_free(struct devlink_selftests_run_req *req)
|
||||
int devlink_selftests_run(struct ynl_sock *ys,
|
||||
struct devlink_selftests_run_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -6823,7 +6852,7 @@ int devlink_selftests_run(struct ynl_sock *ys,
|
||||
if (req->_present.selftests)
|
||||
devlink_dl_selftest_id_put(nlh, DEVLINK_ATTR_SELFTESTS, &req->selftests);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
|
@ -1843,6 +1843,7 @@ void ethtool_linkinfo_set_req_free(struct ethtool_linkinfo_set_req *req)
|
||||
int ethtool_linkinfo_set(struct ynl_sock *ys,
|
||||
struct ethtool_linkinfo_set_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -1862,7 +1863,7 @@ int ethtool_linkinfo_set(struct ynl_sock *ys,
|
||||
if (req->_present.transceiver)
|
||||
mnl_attr_put_u8(nlh, ETHTOOL_A_LINKINFO_TRANSCEIVER, req->transceiver);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -2067,6 +2068,7 @@ void ethtool_linkmodes_set_req_free(struct ethtool_linkmodes_set_req *req)
|
||||
int ethtool_linkmodes_set(struct ynl_sock *ys,
|
||||
struct ethtool_linkmodes_set_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -2094,7 +2096,7 @@ int ethtool_linkmodes_set(struct ynl_sock *ys,
|
||||
if (req->_present.rate_matching)
|
||||
mnl_attr_put_u8(nlh, ETHTOOL_A_LINKMODES_RATE_MATCHING, req->rate_matching);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -2398,6 +2400,7 @@ void ethtool_debug_set_req_free(struct ethtool_debug_set_req *req)
|
||||
|
||||
int ethtool_debug_set(struct ynl_sock *ys, struct ethtool_debug_set_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -2409,7 +2412,7 @@ int ethtool_debug_set(struct ynl_sock *ys, struct ethtool_debug_set_req *req)
|
||||
if (req->_present.msgmask)
|
||||
ethtool_bitset_put(nlh, ETHTOOL_A_DEBUG_MSGMASK, &req->msgmask);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -2577,6 +2580,7 @@ void ethtool_wol_set_req_free(struct ethtool_wol_set_req *req)
|
||||
|
||||
int ethtool_wol_set(struct ynl_sock *ys, struct ethtool_wol_set_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -2590,7 +2594,7 @@ int ethtool_wol_set(struct ynl_sock *ys, struct ethtool_wol_set_req *req)
|
||||
if (req->_present.sopass_len)
|
||||
mnl_attr_put(nlh, ETHTOOL_A_WOL_SOPASS, req->_present.sopass_len, req->sopass);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -3045,6 +3049,7 @@ void ethtool_privflags_set_req_free(struct ethtool_privflags_set_req *req)
|
||||
int ethtool_privflags_set(struct ynl_sock *ys,
|
||||
struct ethtool_privflags_set_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -3056,7 +3061,7 @@ int ethtool_privflags_set(struct ynl_sock *ys,
|
||||
if (req->_present.flags)
|
||||
ethtool_bitset_put(nlh, ETHTOOL_A_PRIVFLAGS_FLAGS, &req->flags);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -3273,6 +3278,7 @@ void ethtool_rings_set_req_free(struct ethtool_rings_set_req *req)
|
||||
|
||||
int ethtool_rings_set(struct ynl_sock *ys, struct ethtool_rings_set_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -3312,7 +3318,7 @@ int ethtool_rings_set(struct ynl_sock *ys, struct ethtool_rings_set_req *req)
|
||||
if (req->_present.tx_push_buf_len_max)
|
||||
mnl_attr_put_u32(nlh, ETHTOOL_A_RINGS_TX_PUSH_BUF_LEN_MAX, req->tx_push_buf_len_max);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -3495,6 +3501,7 @@ void ethtool_channels_set_req_free(struct ethtool_channels_set_req *req)
|
||||
int ethtool_channels_set(struct ynl_sock *ys,
|
||||
struct ethtool_channels_set_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -3520,7 +3527,7 @@ int ethtool_channels_set(struct ynl_sock *ys,
|
||||
if (req->_present.combined_count)
|
||||
mnl_attr_put_u32(nlh, ETHTOOL_A_CHANNELS_COMBINED_COUNT, req->combined_count);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -3798,6 +3805,7 @@ void ethtool_coalesce_set_req_free(struct ethtool_coalesce_set_req *req)
|
||||
int ethtool_coalesce_set(struct ynl_sock *ys,
|
||||
struct ethtool_coalesce_set_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -3861,7 +3869,7 @@ int ethtool_coalesce_set(struct ynl_sock *ys,
|
||||
if (req->_present.tx_aggr_time_usecs)
|
||||
mnl_attr_put_u32(nlh, ETHTOOL_A_COALESCE_TX_AGGR_TIME_USECS, req->tx_aggr_time_usecs);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -4036,6 +4044,7 @@ void ethtool_pause_set_req_free(struct ethtool_pause_set_req *req)
|
||||
|
||||
int ethtool_pause_set(struct ynl_sock *ys, struct ethtool_pause_set_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -4055,7 +4064,7 @@ int ethtool_pause_set(struct ynl_sock *ys, struct ethtool_pause_set_req *req)
|
||||
if (req->_present.stats_src)
|
||||
mnl_attr_put_u32(nlh, ETHTOOL_A_PAUSE_STATS_SRC, req->stats_src);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -4242,6 +4251,7 @@ void ethtool_eee_set_req_free(struct ethtool_eee_set_req *req)
|
||||
|
||||
int ethtool_eee_set(struct ynl_sock *ys, struct ethtool_eee_set_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -4263,7 +4273,7 @@ int ethtool_eee_set(struct ynl_sock *ys, struct ethtool_eee_set_req *req)
|
||||
if (req->_present.tx_lpi_timer)
|
||||
mnl_attr_put_u32(nlh, ETHTOOL_A_EEE_TX_LPI_TIMER, req->tx_lpi_timer);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -4437,6 +4447,7 @@ void ethtool_cable_test_act_req_free(struct ethtool_cable_test_act_req *req)
|
||||
int ethtool_cable_test_act(struct ynl_sock *ys,
|
||||
struct ethtool_cable_test_act_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -4446,7 +4457,7 @@ int ethtool_cable_test_act(struct ynl_sock *ys,
|
||||
if (req->_present.header)
|
||||
ethtool_header_put(nlh, ETHTOOL_A_CABLE_TEST_HEADER, &req->header);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -4465,6 +4476,7 @@ ethtool_cable_test_tdr_act_req_free(struct ethtool_cable_test_tdr_act_req *req)
|
||||
int ethtool_cable_test_tdr_act(struct ynl_sock *ys,
|
||||
struct ethtool_cable_test_tdr_act_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -4474,7 +4486,7 @@ int ethtool_cable_test_tdr_act(struct ynl_sock *ys,
|
||||
if (req->_present.header)
|
||||
ethtool_header_put(nlh, ETHTOOL_A_CABLE_TEST_TDR_HEADER, &req->header);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -4782,6 +4794,7 @@ void ethtool_fec_set_req_free(struct ethtool_fec_set_req *req)
|
||||
|
||||
int ethtool_fec_set(struct ynl_sock *ys, struct ethtool_fec_set_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -4799,7 +4812,7 @@ int ethtool_fec_set(struct ynl_sock *ys, struct ethtool_fec_set_req *req)
|
||||
if (req->_present.stats)
|
||||
ethtool_fec_stat_put(nlh, ETHTOOL_A_FEC_STATS, &req->stats);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -5235,6 +5248,7 @@ void ethtool_module_set_req_free(struct ethtool_module_set_req *req)
|
||||
|
||||
int ethtool_module_set(struct ynl_sock *ys, struct ethtool_module_set_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -5248,7 +5262,7 @@ int ethtool_module_set(struct ynl_sock *ys, struct ethtool_module_set_req *req)
|
||||
if (req->_present.power_mode)
|
||||
mnl_attr_put_u8(nlh, ETHTOOL_A_MODULE_POWER_MODE, req->power_mode);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -5397,6 +5411,7 @@ void ethtool_pse_set_req_free(struct ethtool_pse_set_req *req)
|
||||
|
||||
int ethtool_pse_set(struct ynl_sock *ys, struct ethtool_pse_set_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -5412,7 +5427,7 @@ int ethtool_pse_set(struct ynl_sock *ys, struct ethtool_pse_set_req *req)
|
||||
if (req->_present.pw_d_status)
|
||||
mnl_attr_put_u32(nlh, ETHTOOL_A_PODL_PSE_PW_D_STATUS, req->pw_d_status);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -5746,6 +5761,7 @@ void ethtool_plca_set_cfg_req_free(struct ethtool_plca_set_cfg_req *req)
|
||||
int ethtool_plca_set_cfg(struct ynl_sock *ys,
|
||||
struct ethtool_plca_set_cfg_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -5771,7 +5787,7 @@ int ethtool_plca_set_cfg(struct ynl_sock *ys,
|
||||
if (req->_present.burst_tmr)
|
||||
mnl_attr_put_u32(nlh, ETHTOOL_A_PLCA_BURST_TMR, req->burst_tmr);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -6124,6 +6140,7 @@ void ethtool_mm_set_req_free(struct ethtool_mm_set_req *req)
|
||||
|
||||
int ethtool_mm_set(struct ynl_sock *ys, struct ethtool_mm_set_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -6143,7 +6160,7 @@ int ethtool_mm_set(struct ynl_sock *ys, struct ethtool_mm_set_req *req)
|
||||
if (req->_present.tx_min_frag_size)
|
||||
mnl_attr_put_u32(nlh, ETHTOOL_A_MM_TX_MIN_FRAG_SIZE, req->tx_min_frag_size);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
|
@ -72,6 +72,7 @@ void fou_add_req_free(struct fou_add_req *req)
|
||||
|
||||
int fou_add(struct ynl_sock *ys, struct fou_add_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -99,7 +100,7 @@ int fou_add(struct ynl_sock *ys, struct fou_add_req *req)
|
||||
if (req->_present.ifindex)
|
||||
mnl_attr_put_u32(nlh, FOU_ATTR_IFINDEX, req->ifindex);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
@ -117,6 +118,7 @@ void fou_del_req_free(struct fou_del_req *req)
|
||||
|
||||
int fou_del(struct ynl_sock *ys, struct fou_del_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -140,7 +142,7 @@ int fou_del(struct ynl_sock *ys, struct fou_del_req *req)
|
||||
if (req->_present.peer_v6_len)
|
||||
mnl_attr_put(nlh, FOU_ATTR_PEER_V6, req->_present.peer_v6_len, req->peer_v6);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
|
@ -295,6 +295,7 @@ void handshake_done_req_free(struct handshake_done_req *req)
|
||||
|
||||
int handshake_done(struct ynl_sock *ys, struct handshake_done_req *req)
|
||||
{
|
||||
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
|
||||
struct nlmsghdr *nlh;
|
||||
int err;
|
||||
|
||||
@ -308,7 +309,7 @@ int handshake_done(struct ynl_sock *ys, struct handshake_done_req *req)
|
||||
for (unsigned int i = 0; i < req->n_remote_auth; i++)
|
||||
mnl_attr_put_u32(nlh, HANDSHAKE_A_DONE_REMOTE_AUTH, req->remote_auth[i]);
|
||||
|
||||
err = ynl_exec(ys, nlh, NULL);
|
||||
err = ynl_exec(ys, nlh, &yrs);
|
||||
if (err < 0)
|
||||
return -1;
|
||||
|
||||
|
@ -1709,14 +1709,14 @@ def print_req(ri):
|
||||
ret_ok = '0'
|
||||
ret_err = '-1'
|
||||
direction = "request"
|
||||
local_vars = ['struct nlmsghdr *nlh;',
|
||||
local_vars = ['struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };',
|
||||
'struct nlmsghdr *nlh;',
|
||||
'int err;']
|
||||
|
||||
if 'reply' in ri.op[ri.op_mode]:
|
||||
ret_ok = 'rsp'
|
||||
ret_err = 'NULL'
|
||||
local_vars += [f'{type_name(ri, rdir(direction))} *rsp;',
|
||||
'struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };']
|
||||
local_vars += [f'{type_name(ri, rdir(direction))} *rsp;']
|
||||
|
||||
print_prototype(ri, direction, terminate=False)
|
||||
ri.cw.block_start()
|
||||
@ -1732,7 +1732,6 @@ def print_req(ri):
|
||||
attr.attr_put(ri, "req")
|
||||
ri.cw.nl()
|
||||
|
||||
parse_arg = "NULL"
|
||||
if 'reply' in ri.op[ri.op_mode]:
|
||||
ri.cw.p('rsp = calloc(1, sizeof(*rsp));')
|
||||
ri.cw.p('yrs.yarg.data = rsp;')
|
||||
@ -1742,8 +1741,7 @@ def print_req(ri):
|
||||
else:
|
||||
ri.cw.p(f'yrs.rsp_cmd = {ri.op.rsp_value};')
|
||||
ri.cw.nl()
|
||||
parse_arg = '&yrs'
|
||||
ri.cw.p(f"err = ynl_exec(ys, nlh, {parse_arg});")
|
||||
ri.cw.p("err = ynl_exec(ys, nlh, &yrs);")
|
||||
ri.cw.p('if (err < 0)')
|
||||
if 'reply' in ri.op[ri.op_mode]:
|
||||
ri.cw.p('goto err_free;')
|
||||
|
@ -1337,7 +1337,8 @@ static void test_redir(struct test_sockmap_listen *skel, struct bpf_map *map,
|
||||
}
|
||||
|
||||
static void pairs_redir_to_connected(int cli0, int peer0, int cli1, int peer1,
|
||||
int sock_mapfd, int verd_mapfd, enum redir_mode mode)
|
||||
int sock_mapfd, int nop_mapfd,
|
||||
int verd_mapfd, enum redir_mode mode)
|
||||
{
|
||||
const char *log_prefix = redir_mode_str(mode);
|
||||
unsigned int pass;
|
||||
@ -1351,6 +1352,12 @@ static void pairs_redir_to_connected(int cli0, int peer0, int cli1, int peer1,
|
||||
if (err)
|
||||
return;
|
||||
|
||||
if (nop_mapfd >= 0) {
|
||||
err = add_to_sockmap(nop_mapfd, cli0, cli1);
|
||||
if (err)
|
||||
return;
|
||||
}
|
||||
|
||||
n = write(cli1, "a", 1);
|
||||
if (n < 0)
|
||||
FAIL_ERRNO("%s: write", log_prefix);
|
||||
@ -1387,7 +1394,7 @@ static void unix_redir_to_connected(int sotype, int sock_mapfd,
|
||||
goto close0;
|
||||
c1 = sfd[0], p1 = sfd[1];
|
||||
|
||||
pairs_redir_to_connected(c0, p0, c1, p1, sock_mapfd, verd_mapfd, mode);
|
||||
pairs_redir_to_connected(c0, p0, c1, p1, sock_mapfd, -1, verd_mapfd, mode);
|
||||
|
||||
xclose(c1);
|
||||
xclose(p1);
|
||||
@ -1677,7 +1684,7 @@ static void udp_redir_to_connected(int family, int sock_mapfd, int verd_mapfd,
|
||||
if (err)
|
||||
goto close_cli0;
|
||||
|
||||
pairs_redir_to_connected(c0, p0, c1, p1, sock_mapfd, verd_mapfd, mode);
|
||||
pairs_redir_to_connected(c0, p0, c1, p1, sock_mapfd, -1, verd_mapfd, mode);
|
||||
|
||||
xclose(c1);
|
||||
xclose(p1);
|
||||
@ -1735,7 +1742,7 @@ static void inet_unix_redir_to_connected(int family, int type, int sock_mapfd,
|
||||
if (err)
|
||||
goto close;
|
||||
|
||||
pairs_redir_to_connected(c0, p0, c1, p1, sock_mapfd, verd_mapfd, mode);
|
||||
pairs_redir_to_connected(c0, p0, c1, p1, sock_mapfd, -1, verd_mapfd, mode);
|
||||
|
||||
xclose(c1);
|
||||
xclose(p1);
|
||||
@ -1770,8 +1777,10 @@ static void inet_unix_skb_redir_to_connected(struct test_sockmap_listen *skel,
|
||||
xbpf_prog_detach2(verdict, sock_map, BPF_SK_SKB_VERDICT);
|
||||
}
|
||||
|
||||
static void unix_inet_redir_to_connected(int family, int type, int sock_mapfd,
|
||||
int verd_mapfd, enum redir_mode mode)
|
||||
static void unix_inet_redir_to_connected(int family, int type,
|
||||
int sock_mapfd, int nop_mapfd,
|
||||
int verd_mapfd,
|
||||
enum redir_mode mode)
|
||||
{
|
||||
int c0, c1, p0, p1;
|
||||
int sfd[2];
|
||||
@ -1785,7 +1794,8 @@ static void unix_inet_redir_to_connected(int family, int type, int sock_mapfd,
|
||||
goto close_cli0;
|
||||
c1 = sfd[0], p1 = sfd[1];
|
||||
|
||||
pairs_redir_to_connected(c0, p0, c1, p1, sock_mapfd, verd_mapfd, mode);
|
||||
pairs_redir_to_connected(c0, p0, c1, p1,
|
||||
sock_mapfd, nop_mapfd, verd_mapfd, mode);
|
||||
|
||||
xclose(c1);
|
||||
xclose(p1);
|
||||
@ -1799,6 +1809,7 @@ static void unix_inet_skb_redir_to_connected(struct test_sockmap_listen *skel,
|
||||
struct bpf_map *inner_map, int family)
|
||||
{
|
||||
int verdict = bpf_program__fd(skel->progs.prog_skb_verdict);
|
||||
int nop_map = bpf_map__fd(skel->maps.nop_map);
|
||||
int verdict_map = bpf_map__fd(skel->maps.verdict_map);
|
||||
int sock_map = bpf_map__fd(inner_map);
|
||||
int err;
|
||||
@ -1808,14 +1819,32 @@ static void unix_inet_skb_redir_to_connected(struct test_sockmap_listen *skel,
|
||||
return;
|
||||
|
||||
skel->bss->test_ingress = false;
|
||||
unix_inet_redir_to_connected(family, SOCK_DGRAM, sock_map, verdict_map,
|
||||
unix_inet_redir_to_connected(family, SOCK_DGRAM,
|
||||
sock_map, -1, verdict_map,
|
||||
REDIR_EGRESS);
|
||||
unix_inet_redir_to_connected(family, SOCK_STREAM, sock_map, verdict_map,
|
||||
unix_inet_redir_to_connected(family, SOCK_DGRAM,
|
||||
sock_map, -1, verdict_map,
|
||||
REDIR_EGRESS);
|
||||
|
||||
unix_inet_redir_to_connected(family, SOCK_DGRAM,
|
||||
sock_map, nop_map, verdict_map,
|
||||
REDIR_EGRESS);
|
||||
unix_inet_redir_to_connected(family, SOCK_STREAM,
|
||||
sock_map, nop_map, verdict_map,
|
||||
REDIR_EGRESS);
|
||||
skel->bss->test_ingress = true;
|
||||
unix_inet_redir_to_connected(family, SOCK_DGRAM, sock_map, verdict_map,
|
||||
unix_inet_redir_to_connected(family, SOCK_DGRAM,
|
||||
sock_map, -1, verdict_map,
|
||||
REDIR_INGRESS);
|
||||
unix_inet_redir_to_connected(family, SOCK_STREAM, sock_map, verdict_map,
|
||||
unix_inet_redir_to_connected(family, SOCK_STREAM,
|
||||
sock_map, -1, verdict_map,
|
||||
REDIR_INGRESS);
|
||||
|
||||
unix_inet_redir_to_connected(family, SOCK_DGRAM,
|
||||
sock_map, nop_map, verdict_map,
|
||||
REDIR_INGRESS);
|
||||
unix_inet_redir_to_connected(family, SOCK_STREAM,
|
||||
sock_map, nop_map, verdict_map,
|
||||
REDIR_INGRESS);
|
||||
|
||||
xbpf_prog_detach2(verdict, sock_map, BPF_SK_SKB_VERDICT);
|
||||
|
@ -14,6 +14,13 @@ struct {
|
||||
__type(value, __u64);
|
||||
} sock_map SEC(".maps");
|
||||
|
||||
struct {
|
||||
__uint(type, BPF_MAP_TYPE_SOCKMAP);
|
||||
__uint(max_entries, 2);
|
||||
__type(key, __u32);
|
||||
__type(value, __u64);
|
||||
} nop_map SEC(".maps");
|
||||
|
||||
struct {
|
||||
__uint(type, BPF_MAP_TYPE_SOCKHASH);
|
||||
__uint(max_entries, 2);
|
||||
|
@ -148,7 +148,6 @@ void receive_response(struct __test_metadata *_metadata,
|
||||
.msg_iov = &iov,
|
||||
.msg_iovlen = 1
|
||||
};
|
||||
struct unix_diag_req *udr;
|
||||
struct nlmsghdr *nlh;
|
||||
int ret;
|
||||
|
||||
|
@ -416,9 +416,9 @@ int main(int argc, char *argv[])
|
||||
{
|
||||
struct addrinfo hints, *ai;
|
||||
struct iovec iov[1];
|
||||
unsigned char *buf;
|
||||
struct msghdr msg;
|
||||
char cbuf[1024];
|
||||
char *buf;
|
||||
int err;
|
||||
int fd;
|
||||
|
||||
|
@ -2263,7 +2263,7 @@ static int check_results(void)
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
unsigned int nr_process = 1;
|
||||
long nr_process = 1;
|
||||
int route_sock = -1, ret = KSFT_SKIP;
|
||||
int test_desc_fd[2];
|
||||
uint32_t route_seq;
|
||||
@ -2284,7 +2284,7 @@ int main(int argc, char **argv)
|
||||
exit_usage(argv);
|
||||
}
|
||||
|
||||
if (nr_process > MAX_PROCESSES || !nr_process) {
|
||||
if (nr_process > MAX_PROCESSES || nr_process < 1) {
|
||||
printk("nr_process should be between [1; %u]",
|
||||
MAX_PROCESSES);
|
||||
exit_usage(argv);
|
||||
|
@ -18,6 +18,7 @@
|
||||
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/poll.h>
|
||||
#include <sys/random.h>
|
||||
#include <sys/sendfile.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/socket.h>
|
||||
@ -1125,15 +1126,11 @@ again:
|
||||
|
||||
static void init_rng(void)
|
||||
{
|
||||
int fd = open("/dev/urandom", O_RDONLY);
|
||||
unsigned int foo;
|
||||
|
||||
if (fd > 0) {
|
||||
int ret = read(fd, &foo, sizeof(foo));
|
||||
|
||||
if (ret < 0)
|
||||
srand(fd + foo);
|
||||
close(fd);
|
||||
if (getrandom(&foo, sizeof(foo), 0) == -1) {
|
||||
perror("getrandom");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
srand(foo);
|
||||
|
@ -18,6 +18,7 @@
|
||||
#include <time.h>
|
||||
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/random.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
@ -519,15 +520,11 @@ static int client(int unixfd)
|
||||
|
||||
static void init_rng(void)
|
||||
{
|
||||
int fd = open("/dev/urandom", O_RDONLY);
|
||||
unsigned int foo;
|
||||
|
||||
if (fd > 0) {
|
||||
int ret = read(fd, &foo, sizeof(foo));
|
||||
|
||||
if (ret < 0)
|
||||
srand(fd + foo);
|
||||
close(fd);
|
||||
if (getrandom(&foo, sizeof(foo), 0) == -1) {
|
||||
perror("getrandom");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
srand(foo);
|
||||
|
Loading…
x
Reference in New Issue
Block a user