使用 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);

目标是第一个,源是第二个参数。