Exemple #1
0
//*****************************************************************************
//
//!  hci_unsol_event_handler
//!
//!  @param  event_hdr   event header
//!
//!  @return             1 if event supported and handled
//!                      0 if event is not supported
//!
//!  @brief              Handle unsolicited events
//
//*****************************************************************************
long
hci_unsol_event_handler(char *event_hdr)
{
	char * data = NULL;
	long event_type;
	unsigned long NumberOfReleasedPackets;
	unsigned long NumberOfSentPackets;
	
	STREAM_TO_UINT16(event_hdr, HCI_EVENT_OPCODE_OFFSET,event_type);
	
	if (event_type & HCI_EVNT_UNSOL_BASE)
	{
		switch(event_type)
		{
	
		case HCI_EVNT_DATA_UNSOL_FREE_BUFF:
			{
				hci_event_unsol_flowcontrol_handler(event_hdr);
				
				NumberOfReleasedPackets = tSLInformation.NumberOfReleasedPackets;
				NumberOfSentPackets = tSLInformation.NumberOfSentPackets;
								
				if (NumberOfReleasedPackets == NumberOfSentPackets)
				{
					if (tSLInformation.InformHostOnTxComplete)
					{
						tSLInformation.sWlanCB(HCI_EVENT_CC3000_CAN_SHUT_DOWN, NULL, 0);
					}
				}				
				return 1;
				
			}
		}
	}
	
	if(event_type & HCI_EVNT_WLAN_UNSOL_BASE)
	{           
		switch(event_type)
		{
		case HCI_EVNT_WLAN_KEEPALIVE:
		case HCI_EVNT_WLAN_UNSOL_CONNECT:
		case HCI_EVNT_WLAN_UNSOL_DISCONNECT:
		case HCI_EVNT_WLAN_UNSOL_INIT:
		case HCI_EVNT_WLAN_ASYNC_SIMPLE_CONFIG_DONE:
			
			if( tSLInformation.sWlanCB )
			{
				tSLInformation.sWlanCB(event_type, 0, 0);
			}
			break;
			
		case HCI_EVNT_WLAN_UNSOL_DHCP:
			{
				unsigned char	params[NETAPP_IPCONFIG_MAC_OFFSET + 1];	// extra byte is for the status
				unsigned char *recParams = params;
				
				data = (char*)(event_hdr) + HCI_EVENT_HEADER_SIZE;
				
				//Read IP address
				STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);
				data += 4;
				//Read subnet
				STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);
				data += 4;
				//Read default GW
				STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH); 
				data += 4;
				//Read DHCP server  
				STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);     
				data += 4;
				//Read DNS server  
				STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH); 
				// read the status
				STREAM_TO_UINT8(event_hdr, HCI_EVENT_STATUS_OFFSET, *recParams);


				if( tSLInformation.sWlanCB )
				{
					tSLInformation.sWlanCB(event_type, (char *)params, sizeof(params));
				}
			}
			break;
			
		case HCI_EVNT_WLAN_ASYNC_PING_REPORT:
			{
				netapp_pingreport_args_t params;			
				data = (char*)(event_hdr) + HCI_EVENT_HEADER_SIZE;			
				STREAM_TO_UINT32(data, NETAPP_PING_PACKETS_SENT_OFFSET, params.packets_sent);			
				STREAM_TO_UINT32(data, NETAPP_PING_PACKETS_RCVD_OFFSET, params.packets_received);			
				STREAM_TO_UINT32(data, NETAPP_PING_MIN_RTT_OFFSET, params.min_round_time);		
				STREAM_TO_UINT32(data, NETAPP_PING_MAX_RTT_OFFSET, params.max_round_time);	
				STREAM_TO_UINT32(data, NETAPP_PING_AVG_RTT_OFFSET, params.avg_round_time);
				
				if( tSLInformation.sWlanCB )
				{
					tSLInformation.sWlanCB(event_type, (char *)&params, sizeof(params));
				}
			}
			break;
		case HCI_EVNT_BSD_TCP_CLOSE_WAIT:
			{
				data = (char *)(event_hdr) + HCI_EVENT_HEADER_SIZE;
				if( tSLInformation.sWlanCB )
				{
					//data[0] represents the socket id, for which FIN was received by remote.
					//Upon receiving this event, the user can close the socket, or else the 
					//socket will be closded after inacvitity timeout (by default 60 seconds)
					tSLInformation.sWlanCB(event_type, data, 1);
				}
			}
			break;
			
		//'default' case which means "event not supported" 	
		default: 
			return (0);
		}
		return(1);
	}
	
	if ((event_type == HCI_EVNT_SEND) || (event_type == HCI_EVNT_SENDTO)
			|| (event_type == HCI_EVNT_WRITE))
	{
                char *pArg;
                long status;
                
                pArg = M_BSD_RESP_PARAMS_OFFSET(event_hdr);
                STREAM_TO_UINT32(pArg, BSD_RSP_PARAMS_STATUS_OFFSET,status);
                
                if (ERROR_SOCKET_INACTIVE == status)
                {
                    // The only synchronous event that can come from SL device in form of 
                    // command complete is "Command Complete" on data sent, in case SL device 
                    // was unable to transmit
                    STREAM_TO_UINT8(event_hdr, HCI_EVENT_STATUS_OFFSET, tSLInformation.slTransmitDataError);
                    update_socket_active_status(M_BSD_RESP_PARAMS_OFFSET(event_hdr));
                    
                    return (1);
                }
                else
                    return (0);
	}
	
	//handle a case where unsolicited event arrived, but was not handled by any of the cases above
	if ((event_type != tSLInformation.usRxEventOpcode) && (event_type != HCI_EVNT_PATCHES_REQ))
	{
		return(1);
	}
	
	return(0);
}
Exemple #2
0
//*****************************************************************************
//
//!  hci_unsol_event_handler
//!
//!  @param  event_hdr   event header
//!
//!  @return             1 if event supported and handled
//!                      0 if event is not supported
//!
//!  @brief              Handle unsolicited events
//
//*****************************************************************************
INT32 hci_unsol_event_handler(CHAR *event_hdr) {
  CHAR *data = NULL;
  INT32 event_type;
  UINT32 NumberOfReleasedPackets;
  UINT32 NumberOfSentPackets;

  STREAM_TO_UINT16(event_hdr, HCI_EVENT_OPCODE_OFFSET, event_type);

  // Adafruit CC3k Host Driver Difference
  // Extra debug output.
  // Noted 12-12-2014 by tdicola
  DEBUGPRINT_F("\tHCI_UNSOL_EVT: ");
  DEBUGPRINT_HEX16(event_type);

  if (event_type & HCI_EVNT_UNSOL_BASE) {
    switch (event_type) {
      case HCI_EVNT_DATA_UNSOL_FREE_BUFF: {
        hci_event_unsol_flowcontrol_handler(event_hdr);

        NumberOfReleasedPackets = tSLInformation.NumberOfReleasedPackets;
        NumberOfSentPackets = tSLInformation.NumberOfSentPackets;

        if (NumberOfReleasedPackets == NumberOfSentPackets) {
          if (tSLInformation.InformHostOnTxComplete) {
            tSLInformation.sWlanCB(HCI_EVENT_CC3000_CAN_SHUT_DOWN, NULL, 0);
          }
        }
        return 1;
      }
    }
  }

  if (event_type & HCI_EVNT_WLAN_UNSOL_BASE) {
    switch (event_type) {
      case HCI_EVNT_WLAN_KEEPALIVE:
      case HCI_EVNT_WLAN_UNSOL_CONNECT:
      case HCI_EVNT_WLAN_UNSOL_DISCONNECT:
      case HCI_EVNT_WLAN_UNSOL_INIT:
      case HCI_EVNT_WLAN_ASYNC_SIMPLE_CONFIG_DONE:

        if (tSLInformation.sWlanCB) {
          tSLInformation.sWlanCB(event_type, 0, 0);
        }
        break;

      case HCI_EVNT_WLAN_UNSOL_DHCP: {
        UINT8 params[NETAPP_IPCONFIG_MAC_OFFSET +
                     1];  // extra byte is for the status
        UINT8 *recParams = params;

        data = (CHAR *) (event_hdr) + HCI_EVENT_HEADER_SIZE;

        // Read IP address
        STREAM_TO_STREAM(data, recParams, NETAPP_IPCONFIG_IP_LENGTH);
        data += 4;

#ifdef MDNS_ADVERTISE_HOST
        localIP[0] = *(recParams - NETAPP_IPCONFIG_IP_LENGTH);
        localIP[1] = *(recParams - NETAPP_IPCONFIG_IP_LENGTH + 1);
        localIP[2] = *(recParams - NETAPP_IPCONFIG_IP_LENGTH + 2);
        localIP[3] = *(recParams - NETAPP_IPCONFIG_IP_LENGTH + 3);
#endif
        // Read subnet
        STREAM_TO_STREAM(data, recParams, NETAPP_IPCONFIG_IP_LENGTH);
        data += 4;
        // Read default GW
        STREAM_TO_STREAM(data, recParams, NETAPP_IPCONFIG_IP_LENGTH);
        data += 4;
        // Read DHCP server
        STREAM_TO_STREAM(data, recParams, NETAPP_IPCONFIG_IP_LENGTH);
        data += 4;
        // Read DNS server
        STREAM_TO_STREAM(data, recParams, NETAPP_IPCONFIG_IP_LENGTH);
        // read the status
        STREAM_TO_UINT8(event_hdr, HCI_EVENT_STATUS_OFFSET, *recParams);

        if (tSLInformation.sWlanCB) {
          tSLInformation.sWlanCB(event_type, (CHAR *) params, sizeof(params));
        }
      } break;

      case HCI_EVNT_WLAN_ASYNC_PING_REPORT: {
        netapp_pingreport_args_t params;
        data = (CHAR *) (event_hdr) + HCI_EVENT_HEADER_SIZE;
        STREAM_TO_UINT32(data, NETAPP_PING_PACKETS_SENT_OFFSET,
                         params.packets_sent);
        STREAM_TO_UINT32(data, NETAPP_PING_PACKETS_RCVD_OFFSET,
                         params.packets_received);
        STREAM_TO_UINT32(data, NETAPP_PING_MIN_RTT_OFFSET,
                         params.min_round_time);
        STREAM_TO_UINT32(data, NETAPP_PING_MAX_RTT_OFFSET,
                         params.max_round_time);
        STREAM_TO_UINT32(data, NETAPP_PING_AVG_RTT_OFFSET,
                         params.avg_round_time);

        if (tSLInformation.sWlanCB) {
          tSLInformation.sWlanCB(event_type, (CHAR *) &params, sizeof(params));
        }
      } break;
      case HCI_EVNT_BSD_TCP_CLOSE_WAIT: {
        // Adafruit CC3k Host Driver Difference
        // Extra debug output.
        // Noted 12-12-2014 by tdicola
        DEBUGPRINT_F("\tTCP Close Wait\n\r");
        data = (CHAR *) (event_hdr) + HCI_EVENT_HEADER_SIZE;
        if (tSLInformation.sWlanCB) {
          // data[0] represents the socket id, for which FIN was received by
          // remote.
          // Upon receiving this event, the user can close the socket, or else
          // the
          // socket will be closded after inacvitity timeout (by default 60
          // seconds)
          tSLInformation.sWlanCB(event_type, data, 1);
        }
      } break;

      case HCI_EVNT_ASYNC_ARP_DONE:
      case HCI_EVNT_ASYNC_ARP_WAITING:
        if (tSLInformation.sWlanCB) {
          tSLInformation.sWlanCB(event_type, 0, 0);
        }
        break;

      //'default' case which means "event not supported"
      default:
        return (0);
    }
    return (1);
  }

  if ((event_type == HCI_EVNT_SEND) || (event_type == HCI_EVNT_SENDTO) ||
      (event_type == HCI_EVNT_WRITE)) {
    CHAR *pArg;
    INT32 status;

    // Adafruit CC3k Host Driver Difference
    // Extra debug output.
    // Noted 12-12-2014 by tdicola
    DEBUGPRINT_F("\tSEND event response\n\r");

    pArg = M_BSD_RESP_PARAMS_OFFSET(event_hdr);
    STREAM_TO_UINT32(pArg, BSD_RSP_PARAMS_STATUS_OFFSET, status);

    if (ERROR_SOCKET_INACTIVE == status) {
      // The only synchronous event that can come from SL device in form of
      // command complete is "Command Complete" on data sent, in case SL device
      // was unable to transmit
      STREAM_TO_UINT8(event_hdr, HCI_EVENT_STATUS_OFFSET,
                      tSLInformation.slTransmitDataError);
      update_socket_active_status(M_BSD_RESP_PARAMS_OFFSET(event_hdr));

      return (1);
    } else
      return (0);
  }

  // handle a case where unsolicited event arrived, but was not handled by any
  // of the cases above
  if ((event_type != tSLInformation.usRxEventOpcode) &&
      (event_type != HCI_EVNT_PATCHES_REQ)) {
    return (1);
  }

  return (0);
}
long hci_unsol_event_handler(char *event_hdr)
{
  char * data = NULL;
  long event_type;
  unsigned long NumberOfReleasedPackets;
  unsigned long NumberOfSentPackets;

  STREAM_TO_UINT16(event_hdr, HCI_EVENT_OPCODE_OFFSET,event_type);

  if (event_type & HCI_EVNT_UNSOL_BASE)
    {
      switch(event_type)
        {
        case HCI_EVNT_DATA_UNSOL_FREE_BUFF:
          {
            hci_event_unsol_flowcontrol_handler(event_hdr);

            NumberOfReleasedPackets = tSLInformation.NumberOfReleasedPackets;
            NumberOfSentPackets = tSLInformation.NumberOfSentPackets;

            if (NumberOfReleasedPackets == NumberOfSentPackets)
              {
                if (tSLInformation.InformHostOnTxComplete)
                  {
                    tSLInformation.sWlanCB(HCI_EVENT_CC3000_CAN_SHUT_DOWN, NULL, 0);
                  }
              }

            return 1;
          }
      }
  }

  if (event_type & HCI_EVNT_WLAN_UNSOL_BASE)
    {
      switch(event_type)
        {
        case HCI_EVNT_WLAN_KEEPALIVE:
        case HCI_EVNT_WLAN_UNSOL_CONNECT:
        case HCI_EVNT_WLAN_UNSOL_DISCONNECT:
        case HCI_EVNT_WLAN_UNSOL_INIT:
        case HCI_EVNT_WLAN_ASYNC_SIMPLE_CONFIG_DONE:

        if (tSLInformation.sWlanCB)
          {
            tSLInformation.sWlanCB(event_type, 0, 0);
          }
        break;

        case HCI_EVNT_WLAN_UNSOL_DHCP:
          {
            uint8_t  params[NETAPP_IPCONFIG_MAC_OFFSET + 1];  // extra byte is for the status
            uint8_t *recParams = params;

            data = (char*)(event_hdr) + HCI_EVENT_HEADER_SIZE;

            /* Read IP address */

            STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);
            data += 4;

            /* Read subnet */

            STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);
            data += 4;

            /* Read default GW */

            STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);
            data += 4;

            /* Read DHCP server */

            STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);
            data += 4;

            /* Read DNS server */

            STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);

            /* Read the status */

            STREAM_TO_UINT8(event_hdr, HCI_EVENT_STATUS_OFFSET, *recParams);

            if (tSLInformation.sWlanCB)
              {
                tSLInformation.sWlanCB(event_type, (char *)params, sizeof(params));
              }
          }
          break;

        case HCI_EVNT_WLAN_ASYNC_PING_REPORT:
          {
            netapp_pingreport_args_t params;
            data = (char*)(event_hdr) + HCI_EVENT_HEADER_SIZE;
            STREAM_TO_UINT32(data, NETAPP_PING_PACKETS_SENT_OFFSET, params.packets_sent);
            STREAM_TO_UINT32(data, NETAPP_PING_PACKETS_RCVD_OFFSET, params.packets_received);
            STREAM_TO_UINT32(data, NETAPP_PING_MIN_RTT_OFFSET, params.min_round_time);
            STREAM_TO_UINT32(data, NETAPP_PING_MAX_RTT_OFFSET, params.max_round_time);
            STREAM_TO_UINT32(data, NETAPP_PING_AVG_RTT_OFFSET, params.avg_round_time);

            if (tSLInformation.sWlanCB)
              {
                tSLInformation.sWlanCB(event_type, (char *)&params, sizeof(params));
              }
          }
          break;

        case HCI_EVNT_BSD_TCP_CLOSE_WAIT:
          {
            if (tSLInformation.sWlanCB)
              {
                tSLInformation.sWlanCB(event_type, NULL, 0);
              }
          }
          break;

        /* 'default' case which means "event not supported" */

        default:
          return 0;
        }

      return 1;
    }

  if ((event_type == HCI_EVNT_SEND) || (event_type == HCI_EVNT_SENDTO) ||
      (event_type == HCI_EVNT_WRITE))
    {
      char *pArg;
      long status;

      pArg = M_BSD_RESP_PARAMS_OFFSET(event_hdr);
      STREAM_TO_UINT32(pArg, BSD_RSP_PARAMS_STATUS_OFFSET,status);

      if (ERROR_SOCKET_INACTIVE == status)
        {
          /* The only synchronous event that can come from SL device in form of
           * command complete is "Command Complete" on data sent, in case SL device
           * was unable to transmit
           */

          STREAM_TO_UINT8(event_hdr, HCI_EVENT_STATUS_OFFSET,
                          tSLInformation.slTransmitDataError);
                          update_socket_active_status(M_BSD_RESP_PARAMS_OFFSET(event_hdr));

          return 1;
        }
      else
        {
          return 0;
        }
    }

  return 0;
}
int32_t cc3000_event::hci_unsol_event_handler(uint8_t *event_hdr) {
    uint8_t *data = NULL;
    int32_t event_type;
    uint32_t number_of_released_packets;
    uint32_t number_of_sent_packets;

    STREAM_TO_UINT16(event_hdr, HCI_EVENT_OPCODE_OFFSET,event_type);

    if (event_type & HCI_EVNT_UNSOL_BASE) {
        switch(event_type) {
            case HCI_EVNT_DATA_UNSOL_FREE_BUFF:
            {
                hci_event_unsol_flowcontrol_handler(event_hdr);

                number_of_released_packets = _simple_link.get_released_packets();
                number_of_sent_packets = _simple_link.get_sent_packets();

                if (number_of_released_packets == number_of_sent_packets)
                {
                    if (_simple_link.get_tx_complete_signal())
                    {
                        //tWlanCB func_pointer = (tWlanCB)_simple_link.get_func_pointer(WLAN_CB);
                        _cc3000.usync_callback(HCI_EVENT_CC3000_CAN_SHUT_DOWN, NULL, 0);
                    }
                }
                return 1;
            }
        }
    }

    if (event_type & HCI_EVNT_WLAN_UNSOL_BASE) {
        switch(event_type) {
            case HCI_EVNT_WLAN_KEEPALIVE:
            case HCI_EVNT_WLAN_UNSOL_CONNECT:
            case HCI_EVNT_WLAN_UNSOL_DISCONNECT:
            case HCI_EVNT_WLAN_UNSOL_INIT:
            case HCI_EVNT_WLAN_ASYNC_SIMPLE_CONFIG_DONE:
                 _cc3000.usync_callback(event_type, 0, 0);
                break;
            case HCI_EVNT_WLAN_UNSOL_DHCP:
            {
                uint8_t params[NETAPP_IPCONFIG_MAC_OFFSET + 1]; // extra byte is for the status
                uint8_t *recParams = params;
                data = (uint8_t *)(event_hdr) + HCI_EVENT_HEADER_SIZE;

                //Read IP address
                STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);
                data += 4;
                //Read subnet
                STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);
                data += 4;
                //Read default GW
                STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);
                data += 4;
                //Read DHCP server
                STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);
                data += 4;
                //Read DNS server
                STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);
                // read the status
                STREAM_TO_UINT8(event_hdr, HCI_EVENT_STATUS_OFFSET, *recParams);

                _cc3000.usync_callback(event_type, (uint8_t  *)params, sizeof(params));

                break;
            }
            case HCI_EVNT_WLAN_ASYNC_PING_REPORT:
            {
                netapp_pingreport_args_t params;
                data = (uint8_t *)(event_hdr) + HCI_EVENT_HEADER_SIZE;
                STREAM_TO_UINT32(data, NETAPP_PING_PACKETS_SENT_OFFSET, params.packets_sent);
                STREAM_TO_UINT32(data, NETAPP_PING_PACKETS_RCVD_OFFSET, params.packets_received);
                STREAM_TO_UINT32(data, NETAPP_PING_MIN_RTT_OFFSET, params.min_round_time);
                STREAM_TO_UINT32(data, NETAPP_PING_MAX_RTT_OFFSET, params.max_round_time);
                STREAM_TO_UINT32(data, NETAPP_PING_AVG_RTT_OFFSET, params.avg_round_time);

                _cc3000.usync_callback(event_type, (uint8_t  *)&params, sizeof(params));
                break;
            }
            case HCI_EVNT_BSD_TCP_CLOSE_WAIT:
            {
                _cc3000.usync_callback(event_type, NULL, 0);
                break;
            }

            //'default' case which means "event not supported"
            default:
                return (0);
        }
        return(1);
    }

    if ((event_type == HCI_EVNT_SEND) || (event_type == HCI_EVNT_SENDTO) || (event_type == HCI_EVNT_WRITE)) {
        uint8_t *pArg;
        int32_t status;
        pArg = M_BSD_RESP_PARAMS_OFFSET(event_hdr);
        STREAM_TO_UINT32(pArg, BSD_RSP_PARAMS_STATUS_OFFSET,status);
        if (ERROR_SOCKET_INACTIVE == status) {
            // The only synchronous event that can come from SL device in form of
            // command complete is "Command Complete" on data sent, in case SL device
            // was unable to transmit
            int32_t transmit_error  = _simple_link.get_transmit_error();
            STREAM_TO_UINT8(event_hdr, HCI_EVENT_STATUS_OFFSET, transmit_error);
            _simple_link.set_transmit_error(transmit_error);
            update_socket_active_status(M_BSD_RESP_PARAMS_OFFSET(event_hdr));
            return (1);
        }
        else {
            return (0);
        }
    }
    return(0);
}