使用mbed LPC1768桥接两个接口(USB-CDC ECM和以太网)之间的以太网流量

时间:2015-06-19 17:21:08

标签: linux networking embedded wireshark ethernet

我正在开发一个项目,我有一台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输出。

enter image description here

1 个答案:

答案 0 :(得分:1)

在我看来,您的memcpy()来电都是错误的。

void *memcpy(void *dest, const void *src, size_t n);

目的地是第一个,来源是第二个参数。