使用 mbed LPC1768 桥接两个接口(USB-CDC ECM 和以太网)之间的以太网流量
Bridging ethernet traffic between two interfaces (USB-CDC ECM and Ethernet) using an mbed LPC1768
我正在做一个项目,我有一个 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 来分析流量,但它看起来很奇怪,数据包似乎已损坏。有效载荷始终相同。从 Internet 到计算机的流量会发生这种情况。
有人知道这里出了什么问题吗?我只是将数据包传递到另一个接口,不修改它们。下面,我添加了我的 wireshark 输出。
在我看来,您的 memcpy()
调用方式完全错误。
void *memcpy(void *dest, const void *src, size_t n);
目标是第一个,源是第二个参数。
我正在做一个项目,我有一个 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 来分析流量,但它看起来很奇怪,数据包似乎已损坏。有效载荷始终相同。从 Internet 到计算机的流量会发生这种情况。
有人知道这里出了什么问题吗?我只是将数据包传递到另一个接口,不修改它们。下面,我添加了我的 wireshark 输出。
在我看来,您的 memcpy()
调用方式完全错误。
void *memcpy(void *dest, const void *src, size_t n);
目标是第一个,源是第二个参数。