8a63d29c6e
Allocate the device buffer only if the protocol really need to send data. not all protocols require the driver to prepare additional iob before sending, especially UDP, each iob reserves l2/l3 header in advance after prepare write buffer, net device could reuse this entry to send directly Signed-off-by: chao an <anchao@xiaomi.com>
139 lines
3.8 KiB
C
139 lines
3.8 KiB
C
/****************************************************************************
|
|
* net/mld/mld_poll.c
|
|
*
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
* contributor license agreements. See the NOTICE file distributed with
|
|
* this work for additional information regarding copyright ownership. The
|
|
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
|
* "License"); you may not use this file except in compliance with the
|
|
* License. You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
* License for the specific language governing permissions and limitations
|
|
* under the License.
|
|
*
|
|
****************************************************************************/
|
|
|
|
/****************************************************************************
|
|
* Included Files
|
|
****************************************************************************/
|
|
|
|
#include <nuttx/config.h>
|
|
|
|
#include <assert.h>
|
|
#include <debug.h>
|
|
|
|
#include <nuttx/net/netconfig.h>
|
|
#include <nuttx/net/netdev.h>
|
|
#include <nuttx/net/netstats.h>
|
|
#include <nuttx/net/ip.h>
|
|
|
|
#include "devif/devif.h"
|
|
#include "mld/mld.h"
|
|
|
|
/****************************************************************************
|
|
* Public Functions
|
|
****************************************************************************/
|
|
|
|
/****************************************************************************
|
|
* Name: mld_poll
|
|
*
|
|
* Description:
|
|
* Poll the groups associated with the device to see if any MLD messages
|
|
* are pending transfer.
|
|
*
|
|
* Returned Value:
|
|
* Returns a non-zero value if a IGP message is sent.
|
|
*
|
|
* Assumptions:
|
|
* This function must be called with the network locked.
|
|
*
|
|
****************************************************************************/
|
|
|
|
void mld_poll(FAR struct net_driver_s *dev)
|
|
{
|
|
FAR struct mld_group_s *group;
|
|
|
|
/* Setup the poll operation */
|
|
|
|
dev->d_len = 0;
|
|
dev->d_sndlen = 0;
|
|
|
|
/* Check if a general query is pending */
|
|
|
|
if (IS_MLD_GENPEND(dev->d_mld.flags))
|
|
{
|
|
/* Clear the pending flag */
|
|
|
|
CLR_MLD_GENPEND(dev->d_mld.flags);
|
|
|
|
/* Are we still the querier? */
|
|
|
|
if (IS_MLD_QUERIER(dev->d_mld.flags))
|
|
{
|
|
/* Yes, send the general query and return */
|
|
|
|
mld_send(dev, NULL, MLD_SEND_GENQUERY);
|
|
return;
|
|
}
|
|
}
|
|
|
|
/* Check each member of the group */
|
|
|
|
for (group = (FAR struct mld_group_s *)dev->d_mld.grplist.head;
|
|
group;
|
|
group = group->next)
|
|
{
|
|
/* Does this member have a pending outgoing message? */
|
|
|
|
if (IS_MLD_SCHEDMSG(group->flags))
|
|
{
|
|
/* Yes.. create the MLD message in the driver buffer */
|
|
|
|
mld_send(dev, group, group->msgtype);
|
|
|
|
/* Indicate that the message has been sent */
|
|
|
|
CLR_MLD_SCHEDMSG(group->flags);
|
|
group->msgtype = MLD_SEND_NONE;
|
|
|
|
/* If there is a thread waiting fore the message to be sent, wake
|
|
* it up.
|
|
*/
|
|
|
|
if (IS_MLD_WAITMSG(group->flags))
|
|
{
|
|
mldinfo("Awakening waiter\n");
|
|
|
|
CLR_MLD_WAITMSG(group->flags);
|
|
nxsem_post(&group->sem);
|
|
}
|
|
|
|
/* And break out of the loop */
|
|
|
|
break;
|
|
}
|
|
|
|
/* No.. does this message have a pending report still to be sent? */
|
|
|
|
else if (IS_MLD_RPTPEND(group->flags))
|
|
{
|
|
/* Yes.. create the MLD message in the driver buffer */
|
|
|
|
mld_send(dev, group, mld_report_msgtype(dev));
|
|
|
|
/* Indicate that the report is no longer pending */
|
|
|
|
CLR_MLD_RPTPEND(group->flags);
|
|
|
|
/* And break out of the loop */
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|