📄 netlink_local.c
字号:
#include <sys/socket.h>#include <linux/types.h>#include <linux/netlink.h>#define MAX_PAYLOAD 1024 /* maximum payload size*/#define NETLINK_RECV_1 30
#define ILV_TOTAL_NUMBER 3
typedef struct TagRedirILVToLFB
{
unsigned long dwMetaDataID;
unsigned long dwMetaDataLength;
void *pvMetaData;
}TRedirILVToLFB;
typedef struct TagRedirectDataToLFB{
unsigned long dwILVNum;
TRedirILVToLFB *ptILVs;
unsigned long dwRedirectDataLength;
void *pvRedirectData;
}TRedirectDataToLFB;
typedef struct TagRedirectData
{
unsigned long dwPortID;
unsigned long dwRedirectDataLength; }TRedirectData;
void main() { struct sockaddr_nl src_addrl, dest_addrl; struct nlmsghdr *nlhl = NULL; struct msghdr msgl; struct iovec iovl; int sockfd; TRedirectData *pTempRedirData;
TRedirectDataToLFB tTempRedirData; sockfd = socket(PF_NETLINK, SOCK_RAW, NETLINK_RECV_1); printf("%d\n",sockfd); memset(&msgl, 0, sizeof(struct msghdr)); memset(&iovl, 0, sizeof(struct iovec)); memset(&src_addrl, 0, sizeof(src_addrl)); src_addrl.nl_family = AF_NETLINK; src_addrl.nl_pid = getpid(); /* self pid */ src_addrl.nl_groups = 0; /* not in mcast groups */ bind(sockfd, (struct sockaddr*)&src_addrl, sizeof(src_addrl)); memset(&dest_addrl, 0, sizeof(dest_addrl)); dest_addrl.nl_family = AF_NETLINK; dest_addrl.nl_pid = 0; /* For Linux Kernel */ dest_addrl.nl_groups = 0; /* unicast */ nlhl=(struct nlmsghdr *)malloc(NLMSG_SPACE(MAX_PAYLOAD)); /* Fill the netlink message header */ nlhl->nlmsg_len = NLMSG_SPACE(MAX_PAYLOAD); nlhl->nlmsg_pid = getpid(); /* self pid */ nlhl->nlmsg_flags = 0; /* Fill in the netlink message payload */ strcpy(NLMSG_DATA(nlhl), "Hello you!"); iovl.iov_base = (void *)nlhl; iovl.iov_len = nlhl->nlmsg_len; msgl.msg_name = (void *)&dest_addrl; msgl.msg_namelen = sizeof(dest_addrl); msgl.msg_iov = &iovl; msgl.msg_iovlen = 1; //sendmsg(sockfd, &msgl, 0); printf("%d\n", sendmsg(sockfd, &msgl, 0)); while(1) { int ret, i; unsigned char buff[1600]; void *pvRedirectData;
unsigned int dwRedirectDataType=0x0800; /* Read message from kernel */ memset(nlhl, 0, NLMSG_SPACE(MAX_PAYLOAD)); ret = recvmsg(sockfd, &msgl, 0); printf("%d\n",ret); memcpy(buff, NLMSG_DATA(nlhl), ret); pTempRedirData = (TRedirectData *)malloc(sizeof(TRedirectData)); //pTempRedirData = (TRedirectData *)buff; memcpy(pTempRedirData, (TRedirectData *)buff, sizeof(TRedirectData)); pvRedirectData = buff + 8;
tTempRedirData.dwILVNum = ILV_TOTAL_NUMBER;
tTempRedirData.dwRedirectDataLength = htonl(pTempRedirData->dwRedirectDataLength);
tTempRedirData.ptILVs = (TRedirILVToLFB *)malloc(ILV_TOTAL_NUMBER*sizeof(TRedirILVToLFB));
memset((char *)(tTempRedirData.ptILVs),0,ILV_TOTAL_NUMBER*sizeof(TRedirILVToLFB));
(tTempRedirData.ptILVs)[0].dwMetaDataID = 1;
dwRedirectDataType = htonl(dwRedirectDataType);
(tTempRedirData.ptILVs)[0].pvMetaData = &dwRedirectDataType;
(tTempRedirData.ptILVs)[0].dwMetaDataLength = 4;
(tTempRedirData.ptILVs)[1].dwMetaDataID = 2;
pTempRedirData->dwPortID = htonl(pTempRedirData->dwPortID);
(tTempRedirData.ptILVs)[1].pvMetaData = &(pTempRedirData->dwPortID);
(tTempRedirData.ptILVs)[1].dwMetaDataLength = 4;
(tTempRedirData.ptILVs)[2].dwMetaDataID = 3;
pTempRedirData->dwRedirectDataLength = htonl(pTempRedirData->dwRedirectDataLength);
(tTempRedirData.ptILVs)[2].pvMetaData = &(pTempRedirData->dwRedirectDataLength);
(tTempRedirData.ptILVs)[2].dwMetaDataLength = 4;
tTempRedirData.pvRedirectData = pvRedirectData;
printf(" Received message payload: \n");
for(i=0;i<ret-16;i++)
{
if(i%16 == 0)
printf("\n");
printf("%02x ", buff[i]);
}
printf("\ndwPortID:%lu\n",*(unsigned long *)(tTempRedirData.ptILVs)[1].pvMetaData);
printf("\n%lu\n", pTempRedirData->dwRedirectDataLength);
printf("\ndwRedirectDataLength:%lu\n",*(unsigned long *)(tTempRedirData.ptILVs)[2].pvMetaData); for(i=0;i<ret-24; i++) { if(i%16 == 0) printf("\n"); //printf("%02x ",*((unsigned char *)pvRedirectData++)); printf("%02x ",*((unsigned char *)(tTempRedirData.pvRedirectData)++)); }
// RFL_RedirectDataToCEProc(&tTempRedirData);
free(tTempRedirData.ptILVs); free(pTempRedirData); } /* Close Netlink Socket */ close(sockfd);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -