4. ./netlink/usrlink.h
/*
* usrlink.h
*
* Created on: 2014骞?鏈?7鏃? * Author: cr
*/
#ifndef USRLINK_H_
#define USRLINK_H_
#define USER_NETLINK_CMD 25
#define MAXMSGLEN 1024
typedef enum error_e {
NET_ERROR,
NET_OK,
NET_PARAM,
NET_MEM,
NET_SOCK,
} netlink_err;
typedef enum module_e {
HELLO_CMD = 1,
} netlink_module;
typedef enum type_e {
HELLO_SET,
HELLO_GET,
} netlink_type;
#endif /* USRLINK_H_ */
5. ./netlink/Makefile
MOD_NAME := netlink $(MOD_NAME)-objs : netlink.o -include $(MODULES_ROOT_DIR)/rules.dir .PHONY:
6. 编译方式。
其中Makefile、rulers.dir 在Knetlink/下, netlink.c 、netlink.h 、Makefile在Knetlink/netlink/目录下。 编译时在Knetlink目录下执行Make即可
用户程序
用户程序的Makefile 这里就不放出了。 我是直接在eclipse下建的工程 自动编译的、...
1. netlink.c
/*
* usrlink.c
*
* Created on: 2014骞?鏈?7鏃? * Author: cr
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "usrlink.h"
int netlink_sock_init(netlink_sock *netlink_s, int module, int protocol)
{
netlink_s->sock = socket(PF_NETLINK, SOCK_RAW, protocol);
if(netlink_s->sock < 0)
return NET_SOCK;
memset(&netlink_s->src, 0 ,sizeof(netlink_s->src));
netlink_s->src.nl_family = AF_NETLINK;
netlink_s->src.nl_pid = module;
netlink_s->src.nl_groups = 0;
if(bind(netlink_s->sock, (struct sockaddr *)&netlink_s->src, sizeof(netlink_s->src)) < 0)
return NET_SOCK;
netlink_s->dest.nl_family = AF_NETLINK;
netlink_s->dest.nl_pid = 0;
netlink_s->dest.nl_groups = 0;
return NET_OK;
}
int netlink_send(netlink_sock *netlink_s, int type, char *sbuf, int slen, char *rbuf, int *rlen)
{
struct msghdr msg;
struct nlmsghdr *nlhdr = NULL;
struct iovec iov;
int ret;
nlhdr = (struct nlmsghdr *)malloc(NLMSG_SPACE(MAXMSGLEN));
if(NULL == nlhdr)
return NET_MEM;
memcpy(NLMSG_DATA(nlhdr), sbuf, slen);
nlhdr->nlmsg_len = NLMSG_SPACE(slen);
nlhdr->nlmsg_pid = netlink_s->src.nl_pid;
nlhdr->nlmsg_type = type;
nlhdr->nlmsg_flags = 0;
iov.iov_base = (void *)nlhdr;
iov.iov_len = nlhdr->nlmsg_len;
msg.msg_name = (void *)&(netlink_s->dest);
msg.msg_namelen = sizeof(netlink_s->dest);
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
ret = sendmsg(netlink_s->sock, &msg, 0);
if(ret < 0)
{
printf("Send failn");
goto error;
}
ret = recvmsg(netlink_s->sock, &msg, 0);
if(ret < 0)
{
printf("Read failn");
goto error;
}
memcpy(rbuf, NLMSG_DATA(nlhdr), nlhdr->nlmsg_len);
*rlen = nlhdr->nlmsg_len;
return NET_OK;
error:
free(nlhdr);
return NET_SOCK;
}
int netlink_sock_deinit(netlink_sock *netlink_s)
{
close(netlink_s->sock);
memset(netlink_s, 0, sizeof(netlink_sock));
return NET_OK;
}








