Пример #1
0
void usb_init()
{
    /* Initialize USB Subsystem */
    /* See makefile for mode constraints */
    USB_Init();
    sem_init(&cdc_run, 0);
    bcond_init(&usb_active, usb_con());

    STREAM_INIT( cdc_instr, CDC_BUF_SIZE);
    STREAM_INIT( cdc_outstr, CDC_BUF_SIZE);
    cdc_outstr.kick = NULL;

    THREAD_START(usb_thread, STACK_USB);
}
Пример #2
0
static vsf_err_t vsfusbd_MSCBOT_SendCSW(struct vsfusbd_device_t *device,
							struct vsfusbd_MSCBOT_param_t *param)
{
	struct USBMSC_CSW_t *CSW = &param->CSW;
	uint32_t remain_size;

	CSW->dCSWSignature = SYS_TO_LE_U32(USBMSC_CSW_SIGNATURE);
	CSW->dCSWTag = param->CBW.dCBWTag;
	remain_size = param->CBW.dCBWDataTransferLength;
	if (param->scsi_transact != NULL)
	{
		remain_size -= param->scsi_transact->data_size;
		vsfscsi_release_transact(param->scsi_transact);
	}
	CSW->dCSWDataResidue = SYS_TO_LE_U32(remain_size);

	param->bufstream.mem.buffer.buffer = (uint8_t *)&param->CSW;
	param->bufstream.mem.buffer.size = sizeof(param->CSW);
	param->bufstream.mem.read = true;
	param->bufstream.stream.op = &bufstream_op;
	STREAM_INIT(&param->bufstream);

	param->transact.ep = param->ep_in;
	param->transact.data_size = sizeof(param->CSW);
	param->transact.stream = (struct vsf_stream_t *)&param->bufstream;
	param->transact.cb.on_finish = vsfusbd_MSCBOT_on_idle;
	param->transact.cb.param = param;
	return vsfusbd_ep_send(param->device, &param->transact);
}
Пример #3
0
// mal2scsi
static uint8_t* vsf_mal2scsi_prepare_transact(struct vsfscsi_lun_t *lun,
									uint32_t size, bool write, bool bufstream)
{
	struct vsfscsi_transact_t *transact = &lun->dev->transact;
	struct vsf_scsistream_t *stream = (struct vsf_scsistream_t *)lun->stream;
	uint8_t *buffer = stream->mbuf.buffer_list[0];

	if (NULL == buffer)
	{
		return NULL;
	}

	if (bufstream)
	{
		struct vsf_bufstream_t *bufstream = (struct vsf_bufstream_t *)stream;

		memset(buffer, 0, size);
		// setup bufstream
		bufstream->mem.buffer.buffer = buffer;
		bufstream->mem.buffer.size = size;
		bufstream->mem.read = true;
		stream->stream.op = &bufstream_op;
		stream->stream.callback_tx.param = transact;
		stream->stream.callback_tx.on_inout = NULL;
		stream->stream.callback_tx.on_connect = NULL;
		stream->stream.callback_tx.on_disconnect = NULL;
		STREAM_INIT(stream);
	}
	else
	{
		struct vsf_mbufstream_t *mbufstream = (struct vsf_mbufstream_t *)stream;

		// setup malstream
		mbufstream->mem.multibuf = stream->mbuf;
		stream->stream.op = &mbufstream_op;
		STREAM_INIT(stream);
	}
	transact->data_size = size;
	transact->err = VSFERR_NONE;
	transact->lun = lun;
	return buffer;
}
Пример #4
0
static void vsfusbd_MSCBOT_on_idle(void *p)
{
	struct vsfusbd_MSCBOT_param_t *param = (struct vsfusbd_MSCBOT_param_t *)p;

	param->bufstream.mem.buffer.buffer = (uint8_t *)&param->CBW;
	param->bufstream.mem.buffer.size = sizeof(param->CBW);
	param->bufstream.mem.read = false;
	param->bufstream.stream.op = &bufstream_op;
	STREAM_INIT(&param->bufstream);

	param->transact.ep = param->ep_out;
	param->transact.data_size = sizeof(param->CBW);
	param->transact.stream = (struct vsf_stream_t *)&param->bufstream;
	param->transact.cb.on_finish = vsfusbd_MSCBOT_on_cbw;
	param->transact.cb.param = param;
	vsfusbd_ep_recv(param->device, &param->transact);
}
Пример #5
0
void TEST_SendCmd0ToWiredInterface(void)
{
  uint8 aOutputBuffer[30];  
  BinaryStream stOutputStream;
  STREAM_INIT(&stOutputStream, aOutputBuffer, sizeof(aOutputBuffer));
  
  uint8 aComposedCommand[sizeof(C000_ReadUniqueIdentifier_Resp)]; 
  uint8 ucRespCode;
  
  // Cmd0 response
  ucRespCode = Execute_C000_ReadUniqueIdentifier(NULL,
                                                 (C000_ReadUniqueIdentifier_Resp*)aComposedCommand,
                                                 MASTER_WIRED_PRIMARY_IDX,
                                                 WIRED_CMD,
                                                 30); 
  
  ComposeResponseToCommmand(MASTER_WIRED_PRIMARY_IDX, (void*)aComposedCommand, CMDID_C000_ReadUniqueIdentifier, NULL, ucRespCode, &stOutputStream);
  DLLHART_TRANSMIT_Response(stOutputStream.nextByte - aOutputBuffer, aOutputBuffer);
  g_sDllGlobals.m_Token.m_OwnToken = 1;
} 
void WHartNetworkData::TransmitIndicate(const WHartLocalStatus& localStatus, WHartPriority priority,
		const WHartDllAddress& dllSrc, WHartPayload& npdu)
{
//	LOG_DEBUG("TransmitIndicate: localStatus=" << localStatus.status << ", priority=" << priority << ", dllSrc="
//			<< dllSrc << ", NPDU=" << npdu);

	BinaryStream stream;
	STREAM_INIT(&stream, npdu.data, npdu.dataLen);

	//parse network header
	uint8_t controlByte;
	STREAM_READ_UINT8(&stream, &controlByte);
	uint8_t ttl;
	STREAM_READ_UINT8(&stream, &ttl);
	uint16_t asn;
	STREAM_READ_UINT16(&stream, &asn);

	//HACK:[andrei.petrut] - write ASN to common data so it can be used in the next packet...
	commonData.lastReadASN = asn;

	uint16_t graphID;
	STREAM_READ_UINT16(&stream, &graphID);
	WHartAddress dest;
	StreamReadNetAddress(&stream, dest, (controlByte & CONTROLTYPE_DESTADDRESS_MASK) == 0);
	WHartAddress src;
	StreamReadNetAddress(&stream, src, (controlByte & CONTROLTYPE_SRCADDRESS_MASK) == 0);

	//TODO:[andy] - implement isBroadcast
	bool isForMe = (dest == commonData.myNickname || dest == commonData.myUniqueID);
	bool isBroadcast = false;
	bool isSourceRoute = ((controlByte & CONTROLTYPE_1STSOURCEROUTE_MASK) != 0);

	WHartShortAddress proxy = 0;
	if (controlByte & CONTROLTYPE_PROXYROUTE_MASK)
	{
		STREAM_READ_UINT16(&stream, &proxy);
	}

	Route tempRoute;
	if (isSourceRoute)
	{
		tempRoute.destinationType = Route::dtSourceRoute;
		tempRoute.graphID = graphID;
		for (int i = 0; i < 4; i++)
		{
			WHartShortAddress addr;
			STREAM_READ_UINT16(&stream, &addr);
			if (addr != 0xFFFF)
			{
				tempRoute.sourceRoutePath.push_back(addr);
			}
		}
		if (controlByte & CONTROLTYPE_2NDSOURCEROUTE_MASK)
		{
			for (int i = 0; i < 4; i++)
			{
				WHartShortAddress addr;
				STREAM_READ_UINT16(&stream, &addr);
				if (addr != 0xFFFF)
				{
					tempRoute.sourceRoutePath.push_back(addr);
				}
			}
		}
	}

//	LOG_DEBUG("TransmitIndicate: isForMe=" << (int) isForMe << ", isBroadcast=" << (int) isBroadcast << ", isSourceRoute=" << (int)isSourceRoute << ", destAddress="
//			<< dest << ", TTL=" << ToStringHexa(ttl) << ", ASN=" << ToStringHexa(asn) << ", graphID="
//			<< ToStringHexa(graphID));

	if (isForMe || isBroadcast)
	{
		uint8_t securityControl; //contain session
		STREAM_READ_UINT8(&stream, &securityControl);

		WHartSessionKey::SessionKeyCode sessionKey = (WHartSessionKey::SessionKeyCode) (securityControl & 0x0F);
        uint8_t sessionType = securityControl & SECURITYCONTROL_SECURITYTYPE_MASK;

        //if join flow detected OnJoinCalback is called, in order to create session with the new device/ap if it is
        //provisioned correctly
        if ((sessionType == WHartSessionKey::joinKeyed) && (OnJoinCallback))
        {
            OnJoinCallback(src);
        }

		SessionTable::iterator session = FindSession(src, sessionKey);
		if (session == sessionTable.end())
		{
			LOG_WARN("Session for Dest=" << src << "with type=" << (int) sessionKey
					<< " not found! packet droped.");
			return;//invalid session
		}
		else
		{
//			LOG_DEBUG("Session used for packet is=" << sessionKey << " and dest=" << src << " and sessionID=" << (int)session->sessionID);
		}



		uint32_t counter;
		if (sessionType == WHartSessionKey::sessionKeyed)
		{
			uint8_t lsbNonce;
			STREAM_READ_UINT8(&stream, &lsbNonce);
//			LOG_DEBUG("Read small nonce counter = " << (int)lsbNonce << " . Need to reconstruct nonce counter...");
//			LOG_DEBUG("Session counter = " << session->receiveNonceCounter <<
//					" Session history size = " << sizeof(session->nonceCounterHistory)<<
//					" and compare value=" << ((1 + ((int)session->receiveNonceCounter & 0xFF) - (int)sizeof(session->nonceCounterHistory) * 8)));
			counter = ReconstructNonceCounter(*session, lsbNonce);
//			LOG_DEBUG("Reconstructed nonce counter=" << counter);
		} else
		{
			STREAM_READ_UINT32(&stream, &counter);
//			LOG_DEBUG("Read entire nonce counter=" << counter);
		}


		// reconstruct nonce counter end

		WHartPayload spdu(stream.nextByte, stream.remainingBytes);

		uint8_t dataTPDU[CommonData::MAX_PAYLOAD];
		WHartPayload tpdu(dataTPDU, sizeof(dataTPDU));

//		LOG_DEBUG("Creating PDU with size=" << stream.nextByte - npdu.data << " with stream next byte="
//				<< nlib::detail::BytesToString(stream.nextByte, stream.nextByte - npdu.data));
		CryptoStatus decryptStatus = EncryptDecrypt(*session, counter, WHartPayload(npdu.data, stream.nextByte - npdu.data), spdu,
				tpdu, src, dest, false);

		if (decryptStatus != whartcsSuccess)
		{
			LOG_WARN("transmitIndicate failed to decrypt Error=" << CryptoStatusToString(decryptStatus));
			return;
		}

		//reconstruct nonce counter
		if (sessionType == WHartSessionKey::joinKeyed) // join flow
		{
			LOG_DEBUG("Join flow detected.");
			session->receiveNonceCounter = counter;

		} else
		{
			int noncePosition = session->receiveNonceCounter - counter;
			if (noncePosition > (int) (NONCECOUNTERHISTORY_BIT_LENGTH))
			{
				//discard packet
				LOG_INFO("Received packet with nonce counter outside of the sliding window (nonce=" << counter
						<< ", windowStart=" << session->receiveNonceCounter << ", windowSize="
						<< (int) NONCECOUNTERHISTORY_BIT_LENGTH << "). Discarding packet...");
				return;
			}

			if (noncePosition < 0)
			{
//				LOG_DEBUG("New nonce received (old=" << session->receiveNonceCounter << ", new=" << counter << ". Sliding window to accommodate new nonce (with steps=" << -noncePosition << ")...");
				if (noncePosition <= -32)
				{
					session->nonceCounterHistory = 0;
				}
				else
				{
					session->nonceCounterHistory = session->nonceCounterHistory >> (-noncePosition);
				}

				noncePosition = 0;
				session->receiveNonceCounter = counter;
			}

			uint32_t mask = 0x01 << (NONCECOUNTERHISTORY_BIT_LENGTH - noncePosition - 1);
			if (session->nonceCounterHistory & mask)
			{
				// already received packet with this nonce, discard
				LOG_WARN("Already received packet with nonce=" << counter << " from src=" << src << ". Discarding...");
				return;
			}

			// mark nonce in history
			session->nonceCounterHistory = session->nonceCounterHistory | mask;
		}


		//forward to upper
		++nextRoutedHandler;
		WHartHandle handle = MAKE_WHARTHANDLE(1, nextRoutedHandler);

//		LOG_DEBUG("transmitIndicate forward to TL" << " handle=" << handle << ", src=" << src << ", priority="
//				<< priority << ", TPDU=" << tpdu);
		upper->TransmitIndicate(handle, src, priority, tpdu, (WHartSessionKey::SessionKeyCode) (securityControl & 0x0F));
	} else
Пример #7
0
// vsfos
static vsf_err_t vsfos_thread(struct vsfsm_pt_t *pt, vsfsm_evt_t evt)
{
	struct vsfos_modifs_t *ifs = (struct vsfos_modifs_t *)pt->user_data;
	vsf_err_t err;

	vsfsm_pt_begin(pt);

	vsfhal_core_init(NULL);
	vsfhal_tickclk_init();
	vsfhal_tickclk_start();

	// timer
	VSFPOOL_INIT(&ifs->vsftimer_pool, struct vsftimer_t, VSFOSCFG_VSFSM_PENDSVQ_LEN);
	vsftimer_init(&ifs->vsftimer_memop);
	vsfhal_tickclk_config_cb(vsfos_tickclk_callback_int, NULL);

	// file
	VSFPOOL_INIT(&ifs->vfsfile_pool, struct vsfile_vfsfile_t, VSFOSCFG_VFS_NO);
	vsfile_init(&ifs->fs.memop);

	ifs->caller_pt.state = 0;
	vsfsm_pt_entry(pt);
	err = vsfile_addfile(&ifs->caller_pt, evt, NULL, "msc_root", VSFILE_ATTR_DIRECTORY);
	if (err != 0) return err;

	ifs->caller_pt.state = 0;
	vsfsm_pt_entry(pt);
	err = vsfile_getfile(&ifs->caller_pt, evt, NULL, "/msc_root", &ifs->file);
	if (err != 0) return err;

	ifs->caller_pt.state = 0;
	ifs->caller_pt.user_data = &ifs->mal.fakefat32;
	err = vsfile_mount(&ifs->caller_pt, evt, (struct vsfile_fsop_t *)&fakefat32_fs_op, ifs->file);
	if (err != 0) return err;

	// vsfip
	{
		struct vsfip_buffer_t *buffer;
		int i;

		buffer = &ifs->tcpip.buffer_pool.buffer[0];
		for (i = 0; i < VSFOSCFG_VSFIP_BUFFER_NUM; i++)
		{
			buffer->buffer = ifs->tcpip.buffer_mem[i];
			buffer++;
		}
	}
	VSFPOOL_INIT(&ifs->tcpip.buffer_pool, struct vsfip_buffer_t, VSFOSCFG_VSFIP_BUFFER_NUM);
	VSFPOOL_INIT(&ifs->tcpip.socket_pool, struct vsfip_socket_t, VSFOSCFG_VSFIP_SOCKET_NUM);
	VSFPOOL_INIT(&ifs->tcpip.tcppcb_pool, struct vsfip_tcppcb_t, VSFOSCFG_VSFIP_TCPPCB_NUM);
	vsfip_init((struct vsfip_mem_op_t *)&ifs->tcpip.mem_op);

	STREAM_INIT(&ifs->usbd.cdc.stream_rx);
	STREAM_INIT(&ifs->usbd.cdc.stream_tx);

	vsfscsi_init(&ifs->mal.scsi_dev);
	vsfusbd_device_init(&ifs->usbd.device);
	vsfshell_init(&ifs->shell);
	vsfos_busybox_init(&ifs->shell);

	if ((ifs->hwcfg->usbd.pullup.port != IFS_DUMMY_PORT) && (vsfhal_gpio_if != NULL))
	{
		uint8_t port = ifs->hwcfg->usbd.pullup.port;
		uint8_t pin = ifs->hwcfg->usbd.pullup.pin;
		vsfhal_gpio_init(port);
		vsfhal_gpio_clear(port, 1 << pin);
		vsfhal_gpio_config_pin(port, pin, GPIO_OUTPP);
	}
	ifs->usbd.device.drv->disconnect();

	vsfsm_pt_delay(pt, 200);

	if ((ifs->hwcfg->usbd.pullup.port != IFS_DUMMY_PORT) && (vsfhal_gpio_if != NULL))
	{
		uint8_t port = ifs->hwcfg->usbd.pullup.port;
		uint8_t pin = ifs->hwcfg->usbd.pullup.pin;
		vsfhal_gpio_set(port, 1 << pin);
	}
	ifs->usbd.device.drv->connect();

	while (1)
	{
		vsfsm_pt_delay(pt, 1000);
		asm("nop");
		vsfsm_pt_delay(pt, 1000);
		asm("nop");
		vsfsm_pt_delay(pt, 1000);
		asm("nop");
		vsfsm_pt_delay(pt, 1000);
		asm("nop");
		vsfsm_pt_delay(pt, 1000);
		asm("nop");
		vsfsm_pt_delay(pt, 1000);
		asm("nop");
	}

	vsfsm_pt_end(pt);
	return VSFERR_NONE;
}
Пример #8
0
static struct vsfsm_state_t *
vsfusbd_HID_evt_handler(struct vsfsm_t *sm, vsfsm_evt_t evt)
{
	struct vsfusbd_HID_param_t *param =
						(struct vsfusbd_HID_param_t *)sm->user_data;
	struct vsfusbd_device_t *device = param->device;
	uint8_t i;

	switch (evt)
	{
	case VSFSM_EVT_INIT:
		if (param->ep_out != 0)
		{
			vsfusbd_set_OUT_handler(device, param->ep_out,
										vsfusbd_HID_OUT_hanlder);
			device->drv->ep.enable_OUT(param->ep_out);
		}

		param->bufstream.mem.read = true;
		param->bufstream.stream.op = &bufstream_op;
		param->bufstream.stream.callback_tx.on_connect = NULL;
		param->bufstream.stream.callback_tx.on_disconnect = NULL;
		param->bufstream.stream.callback_tx.on_inout = NULL;

		param->output_state = HID_OUTPUT_STATE_WAIT;
		param->busy = false;
		for(i = 0; i < param->num_of_report; i++)
		{
			struct vsfusbd_HID_report_t *report = &param->reports[i];

			report->pos = 0;
			report->idle_cnt = 0;
			report->changed = true;
		}

		// enable timer
		param->timer4ms.sm = sm;
		param->timer4ms.evt = VSFUSBD_HID_EVT_TIMER4MS;
		param->timer4ms.interval = 4;
		param->timer4ms.trigger_cnt = -1;
		vsftimer_enqueue(&param->timer4ms);
		break;
	case VSFUSBD_HID_EVT_TIMER4MS:
		{
			struct vsfusbd_HID_report_t *report;
			uint8_t i;

			for (i = 0; i < param->num_of_report; i++)
			{
				report = &param->reports[i];
				if ((report->type == USB_HID_REPORT_INPUT) &&
					(report->idle != 0))
				{
					report->idle_cnt++;
				}
			}
			if (param->busy)
			{
				break;
			}
		}
		// fall through
	case VSFUSBD_HID_EVT_INREPORT:
		{
			struct vsfusbd_transact_t *transact = &param->IN_transact;
			struct vsfusbd_HID_report_t *report;
			uint8_t i;

			for (i = 0; i < param->num_of_report; i++)
			{
				report = &param->reports[i];
				if ((report->type == USB_HID_REPORT_INPUT) &&
					(report->changed || ((report->idle != 0) &&
							(report->idle_cnt >= report->idle))))
				{
					param->bufstream.mem.buffer = report->buffer;
					STREAM_INIT(&param->bufstream);
					STREAM_CONNECT_TX(&param->bufstream);

					transact->ep = param->ep_in;
					transact->data_size = report->buffer.size;
					transact->stream = (struct vsf_stream_t *)&param->bufstream;
					transact->zlp = false;
					transact->cb.on_finish = vsfusbd_HID_INREPORT_callback;
					transact->cb.param = param;
					vsfusbd_ep_send(device, transact);

					report->changed = false;
					report->idle_cnt = 0;
					param->busy = true;
					break;
				}
			}
		}
		break;
	}

	return NULL;
}