net/netdev: Check quota when registering lower-half devices
Some drivers may set too big quota by accident and consume all of our buffers, so we add a check when registering devices. Signed-off-by: Zhe Weng <wengzhe@xiaomi.com>
This commit is contained in:
parent
6c1b900e82
commit
c234fac910
@ -115,6 +115,40 @@ static int quota_fetch_dec(FAR struct netdev_lowerhalf_s *lower,
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: quota_is_valid
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Check if the quota of the lower half is not too big.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static bool quota_is_valid(FAR struct netdev_lowerhalf_s *lower)
|
||||||
|
{
|
||||||
|
int total = 0;
|
||||||
|
int type;
|
||||||
|
|
||||||
|
for (type = 0; type < NETPKT_TYPENUM; type++)
|
||||||
|
{
|
||||||
|
total += netdev_lower_quota_load(lower, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (total > NETPKT_BUFNUM)
|
||||||
|
{
|
||||||
|
nerr("ERROR: Too big quota when registering device: %d\n", total);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (total > NETPKT_BUFNUM / 2)
|
||||||
|
{
|
||||||
|
nwarn("WARNING: The quota of the registering device may consume more "
|
||||||
|
"than half of the network buffers, which may hurt performance. "
|
||||||
|
"Please consider decreasing driver quota or increasing nIOB.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: netpkt_get
|
* Name: netpkt_get
|
||||||
*
|
*
|
||||||
@ -1029,7 +1063,7 @@ int netdev_lower_register(FAR struct netdev_lowerhalf_s *dev,
|
|||||||
FAR struct netdev_upperhalf_s *upper;
|
FAR struct netdev_upperhalf_s *upper;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (dev == NULL || dev->ops == NULL ||
|
if (dev == NULL || quota_is_valid(dev) == false || dev->ops == NULL ||
|
||||||
dev->ops->transmit == NULL || dev->ops->receive == NULL)
|
dev->ops->transmit == NULL || dev->ops->receive == NULL)
|
||||||
{
|
{
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -69,6 +69,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#define NETPKT_BUFLEN CONFIG_IOB_BUFSIZE
|
#define NETPKT_BUFLEN CONFIG_IOB_BUFSIZE
|
||||||
|
#define NETPKT_BUFNUM CONFIG_IOB_NBUFFERS
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Public Types
|
* Public Types
|
||||||
|
Loading…
x
Reference in New Issue
Block a user