如何访问 mBlk 以太网包中的 header 和数据信息?特别是我想提取发件人IP

How do I access header and data information within a mBlk ethernet package? specifically I want to extract a sender IP

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

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 结构的指针,我相信它保存了我们以太网包的信息(header 和数据),这是我的理解开始消退的地方,我不是 100% 确定这是我们整个包的存储位置,或者只是整个(集群)的一部分。特别是使用 adderGet(使用相同的函数,但对于我们的例子是 endEtherPacketAddrGet),我理解这个函数的方式是,如果你把你的结构和数据包中的所有信息放入参数 1,然后是其他指针,我创建了参数 2 : pSrc, param 3: pDest, param 4: pESrc, param 5: pEDst,我觉得发件人 IP 地址的信息应该在 pSrc 结构的某个地方。这是我真正努力打印出此 object 中的信息作为日志消息的地方,现在我只想打印出发件人 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]);

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