Message ID | 20240903184956.1572344-1-joshua.a.hay@intel.com (mailing list archive) |
---|---|
State | Awaiting Upstream |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [Intel-wired-lan,iwl-net] idpf: use actual mbx receive payload length | expand |
> -----Original Message----- > From: Joshua Hay <joshua.a.hay@intel.com> > Sent: Tuesday, September 3, 2024 11:50 AM > To: intel-wired-lan@lists.osuosl.org > Cc: Olech, Milena <milena.olech@intel.com>; Lobakin, Aleksander > <aleksander.lobakin@intel.com>; netdev@vger.kernel.org; Hay, Joshua A > <joshua.a.hay@intel.com>; stable@vger.kernel.org; Kitszel, Przemyslaw > <przemyslaw.kitszel@intel.com> > Subject: [Intel-wired-lan][PATCH iwl-net] idpf: use actual mbx receive payload > length > > When a mailbox message is received, the driver is checking for a non 0 > datalen in the controlq descriptor. If it is valid, the payload is > attached to the ctlq message to give to the upper layer. However, the > payload response size given to the upper layer was taken from the buffer > metadata which is _always_ the max buffer size. This meant the API was > returning 4K as the payload size for all messages. This went unnoticed > since the virtchnl exchange response logic was checking for a response > size less than 0 (error), not less than exact size, or not greater than > or equal to the max mailbox buffer size (4K). All of these checks will > pass in the success case since the size provided is always 4K. However, > this breaks anyone that wants to validate the exact response size. > > Fetch the actual payload length from the value provided in the > descriptor data_len field (instead of the buffer metadata). > > Unfortunately, this means we lose some extra error parsing for variable > sized virtchnl responses such as create vport and get ptypes. However, > the original checks weren't really helping anyways since the size was > _always_ 4K. > > Fixes: 34c21fa894a1 ("idpf: implement virtchnl transaction manager") > Cc: stable@vger.kernel.org # 6.9+ > Signed-off-by: Joshua Hay <joshua.a.hay@intel.com> > Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com> > --- > drivers/net/ethernet/intel/idpf/idpf_virtchnl.c | 9 +-------- > 1 file changed, 1 insertion(+), 8 deletions(-) > > diff --git a/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c > b/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c > index 70986e12da28..3c0f97650d72 100644 > --- a/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c > +++ b/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c Tested-by: Krishneil Singh <krishneil.k.singh@intel.com>
diff --git a/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c b/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c index 70986e12da28..3c0f97650d72 100644 --- a/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c +++ b/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c @@ -666,7 +666,7 @@ idpf_vc_xn_forward_reply(struct idpf_adapter *adapter, if (ctlq_msg->data_len) { payload = ctlq_msg->ctx.indirect.payload->va; - payload_size = ctlq_msg->ctx.indirect.payload->size; + payload_size = ctlq_msg->data_len; } xn->reply_sz = payload_size; @@ -1295,10 +1295,6 @@ int idpf_send_create_vport_msg(struct idpf_adapter *adapter, err = reply_sz; goto free_vport_params; } - if (reply_sz < IDPF_CTLQ_MAX_BUF_LEN) { - err = -EIO; - goto free_vport_params; - } return 0; @@ -2602,9 +2598,6 @@ int idpf_send_get_rx_ptype_msg(struct idpf_vport *vport) if (reply_sz < 0) return reply_sz; - if (reply_sz < IDPF_CTLQ_MAX_BUF_LEN) - return -EIO; - ptypes_recvd += le16_to_cpu(ptype_info->num_ptypes); if (ptypes_recvd > max_ptype) return -EINVAL;