我正在开发一个项目,我有一台LPC1768 MBED设备。我可以通过USB将此设备与计算机连接。设备本身有一个工作的输出以太网连接,我可以使用MBED库读取它。
在嵌入式设备上,互联网流量通过USB-CDC ECM协议进入。我想把数据包交给工作的以太网接口。我有以下代码:
#include "mbed.h"
#include "USBCDC_ECM.h"
#include "rtos.h"
extern "C"{
#include <stdint.h>
}
Ethernet eth;
// create a buffer
#define ETH_MTU 1514
static uint8_t buf[ETH_MTU];
static char ethbuf[ETH_MTU];
int main(void) {
USBCDC_ECM usb = USBCDC_ECM(0x0525, 0xa4a1, 1);
wait(1);
int rx_i = 0;
while(1)
{
int size = eth.receive();
if(size > 0)
{
eth.read(ethbuf, size);
printf("Read from Ethernet: %d\r\n", size);
// send data to usb
uint8_t *usb_data = (uint8_t *)malloc(sizeof(uint8_t) * size);
memcpy(ethbuf, usb_data, size);
int sent = 0;
while(sent < size)
{
int to_send = 64;
if ((size - sent) < to_send) { to_send = size - sent; }
int res = usb.send(usb_data + sent, to_send);
printf("result from sending to usb: %d\r\n", res);
sent += to_send;
}
if ((size % 64) == 0) { usb.send(usb_data, 0); }
}
bool ret = usb.readEP_NB(buf + rx_i, (uint32_t *)&size);
if(!ret) { continue; }
rx_i += size;
if(size < 64) {
printf("received frame with size: %d\r\n", rx_i);
// send this frame over Ethernet
char *ethernet_data = (char *)malloc(sizeof(char) * rx_i);
memcpy(buf, ethernet_data, rx_i);
eth.write(ethernet_data, rx_i);
int result = eth.send();
printf("result: %d\r\n", result);
rx_i = 0;
}
wait(0.05);
}
}
因此,在每个循环中,我从以太网接口读取并将这些包传递给USB-CDC ECM(一次64字节)。接下来,我读取USB端的传入流量,并将此流量传递到以太网接口。
这不起作用。我使用Wireshark来分析流量,但它看起来很奇怪,数据包似乎已损坏。有效载荷始终相同。这种情况发生在从互联网到计算机的流量中。
有谁知道这里出了什么问题?我只是将数据包传递给另一个接口,不要修改它们。下面,我添加了我的wireshark输出。
答案 0 :(得分:1)
在我看来,您的memcpy()
来电都是错误的。
void *memcpy(void *dest, const void *src, size_t n);
目的地是第一个,来源是第二个参数。