Network programming 如何访问mBlk以太网包中的标头和数据信息?具体来说,我想提取一个发送方IP

Network programming 如何访问mBlk以太网包中的标头和数据信息?具体来说,我想提取一个发送方IP,network-programming,driver,ethernet,vxworks,Network Programming,Driver,Ethernet,Vxworks,到目前为止,我对实现这一目标的理解是使用网络函数: typedef struct net_funcs{ STATUS (*start) (void*); /* driver’s start func */ STATUS (*stop) (void*); /* driver’s stop func */ STATUS (*unload) (void*); /* driver’s unload func */ int

到目前为止,我对实现这一目标的理解是使用网络函数:

typedef struct net_funcs{
STATUS (*start) (void*);               /* driver’s start func */
STATUS (*stop) (void*);                /* driver’s stop func */
STATUS (*unload) (void*);              /* driver’s unload func */
int (*ioctl) (void*, int, caddr_t);    /* driver’s ioctl func */
STATUS (*send) (void* , M_BLK_ID);     /* driver’s send func */
STATUS (*mCastAddrAdd) (void*, char*); /* driver’s mcast add func */
STATUS (*mCastAddrDel) (void*, char*); /* driver’s mcast delete func */
STATUS (*mCastAddrGet) (void*, MULTI_TABLE*);/* driver’s mcast get func */
STATUS (*pollSend) (void*, M_BLK_ID);  /* driver’s poll send func */
STATUS (*pollRcv) (void*, M_BLK_ID);   /* driver’s poll receive func */
STATUS (*addressForm) (M_BLK_ID, M_BLK_ID, M_BLK_ID);/* driver’s addr formation func */
STATUS (*packetDataGet) (M_BLK_ID, M_BLK_ID);/* driver’s pkt data get func */
STATUS (*addrGet) (M_BLK_ID, M_BLK_ID, M_BLK_ID, M_BLK_ID, M_BLK_ID);/* driver’s pkt addr get func */} NET_FUNCS;
我有一个指向名为pMblk(类型为M_BLK_ID=*M_BLK)的M_BLK结构的指针,我相信它保存了以太网包(头和数据)的信息,这就是我的理解开始淡出的地方,我不能100%确定这是存储整个包的地方,或者只是整个(集群)的一部分。特别是使用AddTarget(使用相同的函数,但在我们的例子中是EndetherPacketAddressGet),我理解此函数的方式是,如果您将包含数据包中所有信息的结构放入param 1,然后使用其他指针,我创建了param 2:pSrc、param 3:pDest、param 4:pESrc、param 5:pEDst,我认为,发送方IP地址的信息应该在pSrc结构的某个地方,这似乎是有道理的。这就是我一直在努力将这个对象中的信息作为日志消息打印出来的地方,现在我只想打印出发送者的IP地址,稍后再打印更多信息,但我无法打印任何相关信息。 我试过:

printf("pSrc->mData: %d", pSrc->mData); // not actually using print just for the sake of the example
printf("pSrc->mData: %c", pSrc->mData); // not actually using print just for the sake of the example
产生空白或无用数据,也包括:

printf("pSrc->mData: %d", &pSrc->mData); // not actually using print just for the sake of the example
printf("pSrc->mData: %c", &pSrc->mData); // not actually using print just for the sake of the example

这些并不是我尝试过的唯一的事情我只是想让人感觉到我在哪里,我在尝试做什么,也就是说,有没有一个基本的理解,我离开这里是因为我觉得我离得很近?是否有不同的方法获取此信息,或将其存储在结构的不同成员中?对此,如有任何指导,将不胜感激

这些c代码片段会很有帮助

unsigned char    *mData = (unsigned char *)(pMblk->mBlkHdr.mData);
IP_HEADER_T      *pkt_iph = (IP_HEADER_T *)&mData[14]; /* ethernet packet only */
unsigned int      src_ip_addr = pkt_iph->src;
unsigned int      dst_ip_addr = pkt_iph->dst;

使用指针算法解决了此问题:

        srcAddr[0] = *(mBlk->m_data + 6);
        srcAddr[1] = *(mBlk->m_data + 7);
        srcAddr[2] = *(mBlk->m_data + 8);
        srcAddr[3] = *(mBlk->m_data + 9);
        srcAddr[4] = *(mBlk->m_data + 10);
        srcAddr[5] = *(mBlk->m_data + 11);
        printf("Source Address: %02x:%02x:%02x:%02x:%02x:%02x\n", srcAddr[0], srcAddr[1], srcAddr[2], srcAddr[3], srcAddr[4], srcAddr[5]);

m_data是mBlk->mBlkHdr.mData的一种类型定义,对参与方来说晚了一点,但要特别安排数据指针到消息块中的确切位置:

unsigned char *destAddr;
unsigned char *srcAddr;
LL_HDR_INFO *hdrInfo;

/*Pass in the packet and the LL_HDR_INFO object*/
endEtherPacketDataGet(mBlk, hdrInfo);

/*Copy from source to destination the number of bytes passed in*/
bcopy(mBlk->mBlkHdr.mData + hdrInfo->destAddrOffset, destAddr, hdrInfo->destSize);

/*Print the 6 byte physical address*/
printf("Destination Address: %02x:%02x:%02x:%02x:%02x:%02x\n", destAddr[0], destAddr[1], destAddr[2], destAddr[3], destAddr[4], destAddr[5]);

bcopy(mBlk->mBlkHdr.mData + hdrInfo->srcAddrOffset, srcAddr, hdrInfo->srcSize);
printf("Source Address: %02x:%02x:%02x:%02x:%02x:%02x\n", srcAddr[0], srcAddr[1], srcAddr[2], srcAddr[3], srcAddr[4], srcAddr[5]);

这将允许您调试收到的数据包中的信息。

感谢您的回复!然而,我并不认为这正是我想要的不幸的是,为了我正在做的事情,我无法访问IP_HEADER_t结构所在的网络。h,我尝试过转移功能,但似乎不起作用,也就是说,您是否有其他建议从以太网数据包中提取此信息,再次感谢!