- 论坛徽章:
- 0
|
一个叫drcom的内核模块定义了CONN_SO_SET_AUTH_CMD
- #ifndef _TCPTRACK_H_
- #define _TCPTRACK_H_
- #include <linux/if.h>
- #define CONN_SO_BASE_CTL (64+2048+64)
- #define CONN_SO_SET_AUTH_CMD CONN_SO_BASE_CTL
- #define CONN_SO_SET_PARAMS (CONN_SO_BASE_CTL+1)
- #define CONN_SO_SET_MAX CONN_SO_SET_PARAMS
- #define CONN_MODE_NONE 0
- #define CONN_MODE_AUTH 1
- #define CONN_AUTH_DATA_LEN 16
- struct e_address
- {
- u_int32_t addr;
- u_int32_t mask;
- };
- struct conn_param
- {
- char devname[IFNAMSIZ];
- int e_count;
- struct e_address es[0];
- };
- struct conn_auth_cmd
- {
- int cmd;
- pid_t pid;
- int autologout;
- unsigned char auth_data[CONN_AUTH_DATA_LEN];
- };
- #endif
复制代码
- static int conn_set_sockopt(struct sock *sk, int optname, void *optval, unsigned int optlen)
- {
- switch (optname) {
- case CONN_SO_SET_PARAMS: /* set addresses of no need to auth */
- return conn_set_params(sk, optname, optval, optlen);
- case CONN_SO_SET_AUTH_CMD: /* set auth data, and start auth */
- return conn_set_auth_cmd(sk, optname, optval, optlen);
- default:
- return -ENOPROTOOPT;
- }
- return -ENOPROTOOPT;
- }
复制代码
- static int conn_set_auth_cmd(struct sock *sk, int optname, void *optval, unsigned int optlen)
- {
- struct conn_auth_cmd cmd;
- int hash_todo = 0;
- if (optlen < sizeof(struct conn_auth_cmd))
- return -EINVAL;
- if (copy_from_user(&cmd, optval, sizeof(struct conn_auth_cmd)))
- return -EFAULT;
- printk("<1> cmd=%d\n", cmd.cmd);
- printk("<1> pid=%d\n", cmd.pid);
- printk("<1> autologout=%d\n", cmd.autologout);
- printk("<1> auth_data=\n");
- for (n=0; n< 16;n++)
- printk("<1> 0x%02x\n",(unsigned char)cmd.auth_data[n]);
- rtnl_lock();
- write_lock_bh(&mode_lock);
- if (track_mode == CONN_MODE_NONE && cmd.cmd == CONN_MODE_AUTH) {
- track_mode = cmd.cmd;
- conn_pid = cmd.pid;
- conn_autologout = cmd.autologout;
- memcpy(conn_auth_data, cmd.auth_data, CONN_AUTH_DATA_LEN);
- hash_todo = 1; /* conn_hooks_init() */
- } else if (track_mode == CONN_MODE_AUTH && cmd.cmd == CONN_MODE_NONE) {
- track_mode = cmd.cmd;
- conn_pid = 0;
- conn_autologout = 0;
- memset(conn_auth_data, 0, CONN_AUTH_DATA_LEN);
- hash_todo = 2; /* conn_hooks_cleanup */
- } else {
- DEBUGP("Same Auth Cmd\n");
- }
- write_unlock_bh(&mode_lock);
- if (hash_todo == 1) {
- init_keepalive_timer();
- conn_hooks_init();
- printk(KERN_INFO "Drcom-Kernel: Authentication Started.\n");
- } else if (hash_todo == 2) {
- del_keepalive_timer();
- conn_hooks_cleanup();
- conn_hash_cleanup();
- printk(KERN_INFO "Drcom-Kernel: Authentication Stopped.\n");
- }
- rtnl_unlock();
- return 0;
- }
复制代码 |
|