- 论坛徽章:
- 0
|
本帖最后由 ellisonfan 于 2011-12-14 17:59 编辑
求助,最近在看ipset2.3的代码,但是怎么与内核通信的没看明白。
我知道一般与内核通信会采取netlink方式,而且似乎ipset后期也是采取这样的方式。但这个版本用的方式实在看不明白,下面是用户空间的代码,希望有高手帮忙解惑- static int kernel_getsocket(void)
- {
- int sockfd = -1;
- sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
- if (sockfd < 0)
- exit_error(OTHER_PROBLEM,
- "You need to be root to perform this command.");
- return sockfd;
- }
复制代码- static inline int wrapped_getsockopt(void *data, socklen_t *size)
- {
- int res;
- int sockfd = kernel_getsocket();
- /* Send! */
- res = getsockopt(sockfd, SOL_IP, SO_IP_SET, data, size);
- if (res != 0
- && errno == ENOPROTOOPT
- && ipset_insmod("ip_set", "/sbin/modprobe") == 0)
- res = getsockopt(sockfd, SOL_IP, SO_IP_SET, data, size);
- DP("res=%d errno=%d", res, errno);
-
- return res;
- }
复制代码- static inline int wrapped_setsockopt(void *data, socklen_t size)
- {
- int res;
- int sockfd = kernel_getsocket();
- /* Send! */
- res = setsockopt(sockfd, SOL_IP, SO_IP_SET, data, size);
- if (res != 0
- && errno == ENOPROTOOPT
- && ipset_insmod("ip_set", "/sbin/modprobe") == 0)
- res = setsockopt(sockfd, SOL_IP, SO_IP_SET, data, size);
- DP("res=%d errno=%d", res, errno);
-
- return res;
- }
复制代码- static void kernel_getfrom(unsigned cmd, void *data, socklen_t * size)
- {
- int res = wrapped_getsockopt(data, size);
- if (res != 0)
- kernel_error(cmd, errno);
- }
复制代码- static void kernel_sendto(unsigned cmd, void *data, size_t size)
- {
- int res = wrapped_setsockopt(data, size);
- if (res != 0)
- kernel_error(cmd, errno);
- }
复制代码 |
|