參考資訊:
https://zhuanlan.zhihu.com/p/597577575
https://studies.ac.upc.edu/doctorat/ENGRAP/VxWorks-device-drivers.htm
https://forums.windriver.com/t/vxworks-software-development-kit-sdk/43
https://mail.prz-rzeszow.pl/~ssamolej/vxworks/vxworks_kernel_programmers_guide_6.6.pdf
https://d13321s3lxgewa.cloudfront.net/downloads/wrsdk-vxworks7-docs/2309/README_qemu.html
https://learning.windriver.com/path/vxworks7-essentials-workbench-and-tools/vxworks-kernel-shell
https://cpp.hotexamples.com/site/file?hash=0x097d75ab101fe1fd6f0ba040e22d27e925f02c2a5bb9f311e7f20174c3e077c5&fullName=vxworks5-master/target/src/drv/wdbEndPktDrv.c&project=andy345/vxworks5
main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iosLib.h>
#include <muxLib.h>
#include <ipnet_ip4.h>
#include <net/ethernet.h>
#include <netinet/udp.h>
#include <netinet/tcp.h>
#define MYPORT 9999
#define NIC_INTF_NAME "gei"
static PROTO_COOKIE MuxCookie = NULL;
static STATUS mux_rx_callback(void *pCookie, long type, M_BLK_ID mblk, LL_HDR_INFO *llHdrInfo, void *muxUserArg)
{
char *pInPkt = NULL;
char *pData = NULL;
struct ip *pIpHdr = NULL;
struct tcphdr *pTcpHdr = NULL;
struct udphdr *pUdpHdr = NULL;
int size = llHdrInfo->dataOffset + IPNET_IP_HDR_SIZE + sizeof(struct tcphdr);
unsigned short sport = 0;
unsigned short dport = 0;
if (type != ETHERTYPE_IP) {
return OK;
}
if (!(mblk->mBlkHdr.mFlags & M_PKTHDR) || (mblk->mBlkPktHdr.len < size)) {
return OK;
}
if (mblk->mBlkHdr.mLen < size) {
if (netMblkOffsetToBufCopy(mblk, llHdrInfo->dataOffset, pInPkt, size, NULL) == 0) {
return OK;
}
pIpHdr = (struct ip *)pInPkt;
pTcpHdr = (struct tcphdr *)(pInPkt + IPNET_IP_HDR_SIZE);
pData = (char *)((unsigned char *)pTcpHdr + sizeof(struct tcphdr));
}
else {
pIpHdr = (struct ip *)(mblk->mBlkHdr.mData + llHdrInfo->dataOffset);
pTcpHdr = (struct tcphdr *)(mblk->mBlkHdr.mData + llHdrInfo->dataOffset + IPNET_IP_HDR_SIZE);
pData = (char *)((unsigned char *)pTcpHdr + sizeof(struct tcphdr));
}
sport = ntohs(pTcpHdr->th_sport);
dport = ntohs(pTcpHdr->th_dport);
if ((pIpHdr->ip_p == IPPROTO_TCP) && (sport == MYPORT)) {
printf("TCP flags: 0x%x\n", pTcpHdr->th_flags);
if (pTcpHdr->th_flags & TH_PUSH) {
printf("TCP data: \'%s\'\n", pData);
}
}
return OK;
}
STATUS myInit(void)
{
if (muxLibInit() != OK) {
printf( "Failed to initialize mux subsystem\n");
return -1;
}
if(muxDevExists(NIC_INTF_NAME, 0)) {
if ((MuxCookie = muxBind(NIC_INTF_NAME, 0, mux_rx_callback, NULL, NULL, NULL, MUX_PROTO_SNARF, "MyMuxTest", NULL)) == NULL) {
printf("Failed to bind network interface\n ");
}
}
printf("Bind mux interface successfully\n");
return OK;
}