af_netlink.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:22k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * NETLINK      Kernel-user communication protocol.
  3.  *
  4.  *  Authors: Alan Cox <alan@redhat.com>
  5.  *  Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
  6.  *
  7.  * This program is free software; you can redistribute it and/or
  8.  * modify it under the terms of the GNU General Public License
  9.  * as published by the Free Software Foundation; either version
  10.  * 2 of the License, or (at your option) any later version.
  11.  * 
  12.  * Tue Jun 26 14:36:48 MEST 2001 Herbert "herp" Rosmanith
  13.  *                               added netlink_proto_exit
  14.  *
  15.  */
  16. #include <linux/config.h>
  17. #include <linux/module.h>
  18. #include <linux/kernel.h>
  19. #include <linux/init.h>
  20. #include <linux/major.h>
  21. #include <linux/signal.h>
  22. #include <linux/sched.h>
  23. #include <linux/errno.h>
  24. #include <linux/string.h>
  25. #include <linux/stat.h>
  26. #include <linux/socket.h>
  27. #include <linux/un.h>
  28. #include <linux/fcntl.h>
  29. #include <linux/termios.h>
  30. #include <linux/sockios.h>
  31. #include <linux/net.h>
  32. #include <linux/fs.h>
  33. #include <linux/slab.h>
  34. #include <asm/uaccess.h>
  35. #include <linux/skbuff.h>
  36. #include <linux/netdevice.h>
  37. #include <linux/rtnetlink.h>
  38. #include <linux/proc_fs.h>
  39. #include <linux/smp_lock.h>
  40. #include <net/sock.h>
  41. #include <net/scm.h>
  42. #define Nprintk(a...)
  43. #if defined(CONFIG_NETLINK_DEV) || defined(CONFIG_NETLINK_DEV_MODULE)
  44. #define NL_EMULATE_DEV
  45. #endif
  46. struct netlink_opt
  47. {
  48. u32 pid;
  49. unsigned groups;
  50. u32 dst_pid;
  51. unsigned dst_groups;
  52. unsigned long state;
  53. int (*handler)(int unit, struct sk_buff *skb);
  54. wait_queue_head_t wait;
  55. struct netlink_callback *cb;
  56. spinlock_t cb_lock;
  57. void (*data_ready)(struct sock *sk, int bytes);
  58. };
  59. static struct sock *nl_table[MAX_LINKS];
  60. static DECLARE_WAIT_QUEUE_HEAD(nl_table_wait);
  61. #ifdef NL_EMULATE_DEV
  62. static struct socket *netlink_kernel[MAX_LINKS];
  63. #endif
  64. static int netlink_dump(struct sock *sk);
  65. static void netlink_destroy_callback(struct netlink_callback *cb);
  66. atomic_t netlink_sock_nr;
  67. static rwlock_t nl_table_lock = RW_LOCK_UNLOCKED;
  68. static atomic_t nl_table_users = ATOMIC_INIT(0);
  69. static void netlink_sock_destruct(struct sock *sk)
  70. {
  71. skb_queue_purge(&sk->receive_queue);
  72. if (!sk->dead) {
  73. printk("Freeing alive netlink socket %pn", sk);
  74. return;
  75. }
  76. BUG_TRAP(atomic_read(&sk->rmem_alloc)==0);
  77. BUG_TRAP(atomic_read(&sk->wmem_alloc)==0);
  78. BUG_TRAP(sk->protinfo.af_netlink->cb==NULL);
  79. kfree(sk->protinfo.af_netlink);
  80. atomic_dec(&netlink_sock_nr);
  81. #ifdef NETLINK_REFCNT_DEBUG
  82. printk(KERN_DEBUG "NETLINK %p released, %d are still aliven", sk, atomic_read(&netlink_sock_nr));
  83. #endif
  84. }
  85. /* This lock without WQ_FLAG_EXCLUSIVE is good on UP and it is _very_ bad on SMP.
  86.  * Look, when several writers sleep and reader wakes them up, all but one
  87.  * immediately hit write lock and grab all the cpus. Exclusive sleep solves
  88.  * this, _but_ remember, it adds useless work on UP machines.
  89.  */
  90. static void netlink_table_grab(void)
  91. {
  92. write_lock_bh(&nl_table_lock);
  93. if (atomic_read(&nl_table_users)) {
  94. DECLARE_WAITQUEUE(wait, current);
  95. add_wait_queue_exclusive(&nl_table_wait, &wait);
  96. for(;;) {
  97. set_current_state(TASK_UNINTERRUPTIBLE);
  98. if (atomic_read(&nl_table_users) == 0)
  99. break;
  100. write_unlock_bh(&nl_table_lock);
  101. schedule();
  102. write_lock_bh(&nl_table_lock);
  103. }
  104. __set_current_state(TASK_RUNNING);
  105. remove_wait_queue(&nl_table_wait, &wait);
  106. }
  107. }
  108. static __inline__ void netlink_table_ungrab(void)
  109. {
  110. write_unlock_bh(&nl_table_lock);
  111. wake_up(&nl_table_wait);
  112. }
  113. static __inline__ void
  114. netlink_lock_table(void)
  115. {
  116. /* read_lock() synchronizes us to netlink_table_grab */
  117. read_lock(&nl_table_lock);
  118. atomic_inc(&nl_table_users);
  119. read_unlock(&nl_table_lock);
  120. }
  121. static __inline__ void
  122. netlink_unlock_table(void)
  123. {
  124. if (atomic_dec_and_test(&nl_table_users))
  125. wake_up(&nl_table_wait);
  126. }
  127. static __inline__ struct sock *netlink_lookup(int protocol, u32 pid)
  128. {
  129. struct sock *sk;
  130. read_lock(&nl_table_lock);
  131. for (sk=nl_table[protocol]; sk; sk=sk->next) {
  132. if (sk->protinfo.af_netlink->pid == pid) {
  133. sock_hold(sk);
  134. read_unlock(&nl_table_lock);
  135. return sk;
  136. }
  137. }
  138. read_unlock(&nl_table_lock);
  139. return NULL;
  140. }
  141. extern struct proto_ops netlink_ops;
  142. static int netlink_insert(struct sock *sk, u32 pid)
  143. {
  144. int err = -EADDRINUSE;
  145. struct sock *osk;
  146. netlink_table_grab();
  147. for (osk=nl_table[sk->protocol]; osk; osk=osk->next) {
  148. if (osk->protinfo.af_netlink->pid == pid)
  149. break;
  150. }
  151. if (osk == NULL) {
  152. err = -EBUSY;
  153. if (sk->protinfo.af_netlink->pid == 0) {
  154. sk->protinfo.af_netlink->pid = pid;
  155. sk->next = nl_table[sk->protocol];
  156. nl_table[sk->protocol] = sk;
  157. sock_hold(sk);
  158. err = 0;
  159. }
  160. }
  161. netlink_table_ungrab();
  162. return err;
  163. }
  164. static void netlink_remove(struct sock *sk)
  165. {
  166. struct sock **skp;
  167. netlink_table_grab();
  168. for (skp = &nl_table[sk->protocol]; *skp; skp = &((*skp)->next)) {
  169. if (*skp == sk) {
  170. *skp = sk->next;
  171. __sock_put(sk);
  172. break;
  173. }
  174. }
  175. netlink_table_ungrab();
  176. }
  177. static int netlink_create(struct socket *sock, int protocol)
  178. {
  179. struct sock *sk;
  180. sock->state = SS_UNCONNECTED;
  181. if (sock->type != SOCK_RAW && sock->type != SOCK_DGRAM)
  182. return -ESOCKTNOSUPPORT;
  183. if (protocol<0 || protocol >= MAX_LINKS)
  184. return -EPROTONOSUPPORT;
  185. sock->ops = &netlink_ops;
  186. sk = sk_alloc(PF_NETLINK, GFP_KERNEL, 1);
  187. if (!sk)
  188. return -ENOMEM;
  189. sock_init_data(sock,sk);
  190. sk->protinfo.af_netlink = kmalloc(sizeof(struct netlink_opt), GFP_KERNEL);
  191. if (sk->protinfo.af_netlink == NULL) {
  192. sk_free(sk);
  193. return -ENOMEM;
  194. }
  195. memset(sk->protinfo.af_netlink, 0, sizeof(struct netlink_opt));
  196. spin_lock_init(&sk->protinfo.af_netlink->cb_lock);
  197. init_waitqueue_head(&sk->protinfo.af_netlink->wait);
  198. sk->destruct = netlink_sock_destruct;
  199. atomic_inc(&netlink_sock_nr);
  200. sk->protocol=protocol;
  201. return 0;
  202. }
  203. static int netlink_release(struct socket *sock)
  204. {
  205. struct sock *sk = sock->sk;
  206. if (!sk)
  207. return 0;
  208. netlink_remove(sk);
  209. spin_lock(&sk->protinfo.af_netlink->cb_lock);
  210. if (sk->protinfo.af_netlink->cb) {
  211. sk->protinfo.af_netlink->cb->done(sk->protinfo.af_netlink->cb);
  212. netlink_destroy_callback(sk->protinfo.af_netlink->cb);
  213. sk->protinfo.af_netlink->cb = NULL;
  214. __sock_put(sk);
  215. }
  216. spin_unlock(&sk->protinfo.af_netlink->cb_lock);
  217. /* OK. Socket is unlinked, and, therefore,
  218.    no new packets will arrive */
  219. sock_orphan(sk);
  220. sock->sk = NULL;
  221. wake_up_interruptible_all(&sk->protinfo.af_netlink->wait);
  222. skb_queue_purge(&sk->write_queue);
  223. sock_put(sk);
  224. return 0;
  225. }
  226. static int netlink_autobind(struct socket *sock)
  227. {
  228. struct sock *sk = sock->sk;
  229. struct sock *osk;
  230. s32 pid = current->pid;
  231. int err;
  232. retry:
  233. netlink_table_grab();
  234. for (osk=nl_table[sk->protocol]; osk; osk=osk->next) {
  235. if (osk->protinfo.af_netlink->pid == pid) {
  236. /* Bind collision, search negative pid values. */
  237. if (pid > 0)
  238. pid = -4096;
  239. pid--;
  240. netlink_table_ungrab();
  241. goto retry;
  242. }
  243. }
  244. netlink_table_ungrab();
  245. err = netlink_insert(sk, pid);
  246. if (err == -EADDRINUSE)
  247. goto retry;
  248. sk->protinfo.af_netlink->groups = 0;
  249. return 0;
  250. }
  251. static int netlink_bind(struct socket *sock, struct sockaddr *addr, int addr_len)
  252. {
  253. struct sock *sk = sock->sk;
  254. int err;
  255. struct sockaddr_nl *nladdr=(struct sockaddr_nl *)addr;
  256. if (nladdr->nl_family != AF_NETLINK)
  257. return -EINVAL;
  258. /* Only superuser is allowed to listen multicasts */
  259. if (nladdr->nl_groups && !capable(CAP_NET_ADMIN))
  260. return -EPERM;
  261. if (sk->protinfo.af_netlink->pid) {
  262. if (nladdr->nl_pid != sk->protinfo.af_netlink->pid)
  263. return -EINVAL;
  264. sk->protinfo.af_netlink->groups = nladdr->nl_groups;
  265. return 0;
  266. }
  267. if (nladdr->nl_pid == 0) {
  268. err = netlink_autobind(sock);
  269. if (err == 0)
  270. sk->protinfo.af_netlink->groups = nladdr->nl_groups;
  271. return err;
  272. }
  273. err = netlink_insert(sk, nladdr->nl_pid);
  274. if (err == 0)
  275. sk->protinfo.af_netlink->groups = nladdr->nl_groups;
  276. return err;
  277. }
  278. static int netlink_connect(struct socket *sock, struct sockaddr *addr,
  279.    int alen, int flags)
  280. {
  281. int err = 0;
  282. struct sock *sk = sock->sk;
  283. struct sockaddr_nl *nladdr=(struct sockaddr_nl*)addr;
  284. if (addr->sa_family == AF_UNSPEC) {
  285. sk->protinfo.af_netlink->dst_pid = 0;
  286. sk->protinfo.af_netlink->dst_groups = 0;
  287. return 0;
  288. }
  289. if (addr->sa_family != AF_NETLINK)
  290. return -EINVAL;
  291. /* Only superuser is allowed to send multicasts */
  292. if (nladdr->nl_groups && !capable(CAP_NET_ADMIN))
  293. return -EPERM;
  294. if (!sk->protinfo.af_netlink->pid)
  295. err = netlink_autobind(sock);
  296. if (err == 0) {
  297. sk->protinfo.af_netlink->dst_pid = nladdr->nl_pid;
  298. sk->protinfo.af_netlink->dst_groups = nladdr->nl_groups;
  299. }
  300. return 0;
  301. }
  302. static int netlink_getname(struct socket *sock, struct sockaddr *addr, int *addr_len, int peer)
  303. {
  304. struct sock *sk = sock->sk;
  305. struct sockaddr_nl *nladdr=(struct sockaddr_nl *)addr;
  306. nladdr->nl_family = AF_NETLINK;
  307. *addr_len = sizeof(*nladdr);
  308. if (peer) {
  309. nladdr->nl_pid = sk->protinfo.af_netlink->dst_pid;
  310. nladdr->nl_groups = sk->protinfo.af_netlink->dst_groups;
  311. } else {
  312. nladdr->nl_pid = sk->protinfo.af_netlink->pid;
  313. nladdr->nl_groups = sk->protinfo.af_netlink->groups;
  314. }
  315. return 0;
  316. }
  317. static void netlink_overrun(struct sock *sk)
  318. {
  319. if (!test_and_set_bit(0, &sk->protinfo.af_netlink->state)) {
  320. sk->err = ENOBUFS;
  321. sk->error_report(sk);
  322. }
  323. }
  324. int netlink_unicast(struct sock *ssk, struct sk_buff *skb, u32 pid, int nonblock)
  325. {
  326. struct sock *sk;
  327. int len = skb->len;
  328. int protocol = ssk->protocol;
  329. long timeo;
  330.         DECLARE_WAITQUEUE(wait, current);
  331. timeo = sock_sndtimeo(ssk, nonblock);
  332. retry:
  333. sk = netlink_lookup(protocol, pid);
  334. if (sk == NULL)
  335. goto no_dst;
  336. #ifdef NL_EMULATE_DEV
  337. if (sk->protinfo.af_netlink->handler) {
  338. skb_orphan(skb);
  339. len = sk->protinfo.af_netlink->handler(protocol, skb);
  340. sock_put(sk);
  341. return len;
  342. }
  343. #endif
  344. if (atomic_read(&sk->rmem_alloc) > sk->rcvbuf ||
  345.     test_bit(0, &sk->protinfo.af_netlink->state)) {
  346. if (!timeo) {
  347. if (ssk->protinfo.af_netlink->pid == 0)
  348. netlink_overrun(sk);
  349. sock_put(sk);
  350. kfree_skb(skb);
  351. return -EAGAIN;
  352. }
  353. __set_current_state(TASK_INTERRUPTIBLE);
  354. add_wait_queue(&sk->protinfo.af_netlink->wait, &wait);
  355. if ((atomic_read(&sk->rmem_alloc) > sk->rcvbuf ||
  356.     test_bit(0, &sk->protinfo.af_netlink->state)) &&
  357.     !sk->dead)
  358. timeo = schedule_timeout(timeo);
  359. __set_current_state(TASK_RUNNING);
  360. remove_wait_queue(&sk->protinfo.af_netlink->wait, &wait);
  361. sock_put(sk);
  362. if (signal_pending(current)) {
  363. kfree_skb(skb);
  364. return sock_intr_errno(timeo);
  365. }
  366. goto retry;
  367. }
  368. skb_orphan(skb);
  369. skb_set_owner_r(skb, sk);
  370. skb_queue_tail(&sk->receive_queue, skb);
  371. sk->data_ready(sk, len);
  372. sock_put(sk);
  373. return len;
  374. no_dst:
  375. kfree_skb(skb);
  376. return -ECONNREFUSED;
  377. }
  378. static __inline__ int netlink_broadcast_deliver(struct sock *sk, struct sk_buff *skb)
  379. {
  380. #ifdef NL_EMULATE_DEV
  381. if (sk->protinfo.af_netlink->handler) {
  382. skb_orphan(skb);
  383. sk->protinfo.af_netlink->handler(sk->protocol, skb);
  384. return 0;
  385. } else
  386. #endif
  387. if (atomic_read(&sk->rmem_alloc) <= sk->rcvbuf &&
  388.     !test_bit(0, &sk->protinfo.af_netlink->state)) {
  389.                 skb_orphan(skb);
  390. skb_set_owner_r(skb, sk);
  391. skb_queue_tail(&sk->receive_queue, skb);
  392. sk->data_ready(sk, skb->len);
  393. return 0;
  394. }
  395. return -1;
  396. }
  397. void netlink_broadcast(struct sock *ssk, struct sk_buff *skb, u32 pid,
  398.        u32 group, int allocation)
  399. {
  400. struct sock *sk;
  401. struct sk_buff *skb2 = NULL;
  402. int protocol = ssk->protocol;
  403. int failure = 0;
  404. /* While we sleep in clone, do not allow to change socket list */
  405. netlink_lock_table();
  406. for (sk = nl_table[protocol]; sk; sk = sk->next) {
  407. if (ssk == sk)
  408. continue;
  409. if (sk->protinfo.af_netlink->pid == pid ||
  410.     !(sk->protinfo.af_netlink->groups&group))
  411. continue;
  412. if (failure) {
  413. netlink_overrun(sk);
  414. continue;
  415. }
  416. sock_hold(sk);
  417. if (skb2 == NULL) {
  418. if (atomic_read(&skb->users) != 1) {
  419. skb2 = skb_clone(skb, allocation);
  420. } else {
  421. skb2 = skb;
  422. atomic_inc(&skb->users);
  423. }
  424. }
  425. if (skb2 == NULL) {
  426. netlink_overrun(sk);
  427. /* Clone failed. Notify ALL listeners. */
  428. failure = 1;
  429. } else if (netlink_broadcast_deliver(sk, skb2)) {
  430. netlink_overrun(sk);
  431. } else
  432. skb2 = NULL;
  433. sock_put(sk);
  434. }
  435. netlink_unlock_table();
  436. if (skb2)
  437. kfree_skb(skb2);
  438. kfree_skb(skb);
  439. }
  440. void netlink_set_err(struct sock *ssk, u32 pid, u32 group, int code)
  441. {
  442. struct sock *sk;
  443. int protocol = ssk->protocol;
  444. read_lock(&nl_table_lock);
  445. for (sk = nl_table[protocol]; sk; sk = sk->next) {
  446. if (ssk == sk)
  447. continue;
  448. if (sk->protinfo.af_netlink->pid == pid ||
  449.     !(sk->protinfo.af_netlink->groups&group))
  450. continue;
  451. sk->err = code;
  452. sk->error_report(sk);
  453. }
  454. read_unlock(&nl_table_lock);
  455. }
  456. static int netlink_sendmsg(struct socket *sock, struct msghdr *msg, int len,
  457.    struct scm_cookie *scm)
  458. {
  459. struct sock *sk = sock->sk;
  460. struct sockaddr_nl *addr=msg->msg_name;
  461. u32 dst_pid;
  462. u32 dst_groups;
  463. struct sk_buff *skb;
  464. int err;
  465. if (msg->msg_flags&MSG_OOB)
  466. return -EOPNOTSUPP;
  467. if (msg->msg_namelen) {
  468. if (addr->nl_family != AF_NETLINK)
  469. return -EINVAL;
  470. dst_pid = addr->nl_pid;
  471. dst_groups = addr->nl_groups;
  472. if (dst_groups && !capable(CAP_NET_ADMIN))
  473. return -EPERM;
  474. } else {
  475. dst_pid = sk->protinfo.af_netlink->dst_pid;
  476. dst_groups = sk->protinfo.af_netlink->dst_groups;
  477. }
  478. if (!sk->protinfo.af_netlink->pid) {
  479. err = netlink_autobind(sock);
  480. if (err)
  481. goto out;
  482. }
  483. err = -EMSGSIZE;
  484. if ((unsigned)len > sk->sndbuf-32)
  485. goto out;
  486. err = -ENOBUFS;
  487. skb = alloc_skb(len, GFP_KERNEL);
  488. if (skb==NULL)
  489. goto out;
  490. NETLINK_CB(skb).pid = sk->protinfo.af_netlink->pid;
  491. NETLINK_CB(skb).groups = sk->protinfo.af_netlink->groups;
  492. NETLINK_CB(skb).dst_pid = dst_pid;
  493. NETLINK_CB(skb).dst_groups = dst_groups;
  494. memcpy(NETLINK_CREDS(skb), &scm->creds, sizeof(struct ucred));
  495. /* What can I do? Netlink is asynchronous, so that
  496.    we will have to save current capabilities to
  497.    check them, when this message will be delivered
  498.    to corresponding kernel module.   --ANK (980802)
  499.  */
  500. NETLINK_CB(skb).eff_cap = current->cap_effective;
  501. err = -EFAULT;
  502. if (memcpy_fromiovec(skb_put(skb,len), msg->msg_iov, len)) {
  503. kfree_skb(skb);
  504. goto out;
  505. }
  506. if (dst_groups) {
  507. atomic_inc(&skb->users);
  508. netlink_broadcast(sk, skb, dst_pid, dst_groups, GFP_KERNEL);
  509. }
  510. err = netlink_unicast(sk, skb, dst_pid, msg->msg_flags&MSG_DONTWAIT);
  511. out:
  512. return err;
  513. }
  514. static int netlink_recvmsg(struct socket *sock, struct msghdr *msg, int len,
  515.    int flags, struct scm_cookie *scm)
  516. {
  517. struct sock *sk = sock->sk;
  518. int noblock = flags&MSG_DONTWAIT;
  519. int copied;
  520. struct sk_buff *skb;
  521. int err;
  522. if (flags&MSG_OOB)
  523. return -EOPNOTSUPP;
  524. copied = 0;
  525. skb = skb_recv_datagram(sk,flags,noblock,&err);
  526. if (skb==NULL)
  527. goto out;
  528. msg->msg_namelen = 0;
  529. copied = skb->len;
  530. if (len < copied) {
  531. msg->msg_flags |= MSG_TRUNC;
  532. copied = len;
  533. }
  534. skb->h.raw = skb->data;
  535. err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
  536. if (msg->msg_name) {
  537. struct sockaddr_nl *addr = (struct sockaddr_nl*)msg->msg_name;
  538. addr->nl_family = AF_NETLINK;
  539. addr->nl_pid = NETLINK_CB(skb).pid;
  540. addr->nl_groups = NETLINK_CB(skb).dst_groups;
  541. msg->msg_namelen = sizeof(*addr);
  542. }
  543. scm->creds = *NETLINK_CREDS(skb);
  544. skb_free_datagram(sk, skb);
  545. if (sk->protinfo.af_netlink->cb
  546.     && atomic_read(&sk->rmem_alloc) <= sk->rcvbuf/2)
  547. netlink_dump(sk);
  548. out:
  549. if (skb_queue_len(&sk->receive_queue) <= sk->rcvbuf/2) {
  550. if (skb_queue_len(&sk->receive_queue) == 0)
  551. clear_bit(0, &sk->protinfo.af_netlink->state);
  552. if (!test_bit(0, &sk->protinfo.af_netlink->state))
  553. wake_up_interruptible(&sk->protinfo.af_netlink->wait);
  554. }
  555. return err ? : copied;
  556. }
  557. void netlink_data_ready(struct sock *sk, int len)
  558. {
  559. if (sk->protinfo.af_netlink->data_ready)
  560. sk->protinfo.af_netlink->data_ready(sk, len);
  561. if (skb_queue_len(&sk->receive_queue) <= sk->rcvbuf/2) {
  562. if (skb_queue_len(&sk->receive_queue) == 0)
  563. clear_bit(0, &sk->protinfo.af_netlink->state);
  564. if (!test_bit(0, &sk->protinfo.af_netlink->state))
  565. wake_up_interruptible(&sk->protinfo.af_netlink->wait);
  566. }
  567. }
  568. /*
  569.  * We export these functions to other modules. They provide a 
  570.  * complete set of kernel non-blocking support for message
  571.  * queueing.
  572.  */
  573. struct sock *
  574. netlink_kernel_create(int unit, void (*input)(struct sock *sk, int len))
  575. {
  576. struct socket *sock;
  577. struct sock *sk;
  578. if (unit<0 || unit>=MAX_LINKS)
  579. return NULL;
  580. if (!(sock = sock_alloc())) 
  581. return NULL;
  582. sock->type = SOCK_RAW;
  583. if (netlink_create(sock, unit) < 0) {
  584. sock_release(sock);
  585. return NULL;
  586. }
  587. sk = sock->sk;
  588. sk->data_ready = netlink_data_ready;
  589. if (input)
  590. sk->protinfo.af_netlink->data_ready = input;
  591. netlink_insert(sk, 0);
  592. return sk;
  593. }
  594. static void netlink_destroy_callback(struct netlink_callback *cb)
  595. {
  596. if (cb->skb)
  597. kfree_skb(cb->skb);
  598. kfree(cb);
  599. }
  600. /*
  601.  * It looks a bit ugly.
  602.  * It would be better to create kernel thread.
  603.  */
  604. static int netlink_dump(struct sock *sk)
  605. {
  606. struct netlink_callback *cb;
  607. struct sk_buff *skb;
  608. struct nlmsghdr *nlh;
  609. int len;
  610. skb = sock_rmalloc(sk, NLMSG_GOODSIZE, 0, GFP_KERNEL);
  611. if (!skb)
  612. return -ENOBUFS;
  613. spin_lock(&sk->protinfo.af_netlink->cb_lock);
  614. cb = sk->protinfo.af_netlink->cb;
  615. if (cb == NULL) {
  616. spin_unlock(&sk->protinfo.af_netlink->cb_lock);
  617. kfree_skb(skb);
  618. return -EINVAL;
  619. }
  620. len = cb->dump(skb, cb);
  621. if (len > 0) {
  622. spin_unlock(&sk->protinfo.af_netlink->cb_lock);
  623. skb_queue_tail(&sk->receive_queue, skb);
  624. sk->data_ready(sk, len);
  625. return 0;
  626. }
  627. nlh = __nlmsg_put(skb, NETLINK_CB(cb->skb).pid, cb->nlh->nlmsg_seq, NLMSG_DONE, sizeof(int));
  628. nlh->nlmsg_flags |= NLM_F_MULTI;
  629. memcpy(NLMSG_DATA(nlh), &len, sizeof(len));
  630. skb_queue_tail(&sk->receive_queue, skb);
  631. sk->data_ready(sk, skb->len);
  632. cb->done(cb);
  633. sk->protinfo.af_netlink->cb = NULL;
  634. spin_unlock(&sk->protinfo.af_netlink->cb_lock);
  635. netlink_destroy_callback(cb);
  636. sock_put(sk);
  637. return 0;
  638. }
  639. int netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
  640.        struct nlmsghdr *nlh,
  641.        int (*dump)(struct sk_buff *skb, struct netlink_callback*),
  642.        int (*done)(struct netlink_callback*))
  643. {
  644. struct netlink_callback *cb;
  645. struct sock *sk;
  646. cb = kmalloc(sizeof(*cb), GFP_KERNEL);
  647. if (cb == NULL)
  648. return -ENOBUFS;
  649. memset(cb, 0, sizeof(*cb));
  650. cb->dump = dump;
  651. cb->done = done;
  652. cb->nlh = nlh;
  653. atomic_inc(&skb->users);
  654. cb->skb = skb;
  655. sk = netlink_lookup(ssk->protocol, NETLINK_CB(skb).pid);
  656. if (sk == NULL) {
  657. netlink_destroy_callback(cb);
  658. return -ECONNREFUSED;
  659. }
  660. /* A dump is in progress... */
  661. spin_lock(&sk->protinfo.af_netlink->cb_lock);
  662. if (sk->protinfo.af_netlink->cb) {
  663. spin_unlock(&sk->protinfo.af_netlink->cb_lock);
  664. netlink_destroy_callback(cb);
  665. sock_put(sk);
  666. return -EBUSY;
  667. }
  668. sk->protinfo.af_netlink->cb = cb;
  669. spin_unlock(&sk->protinfo.af_netlink->cb_lock);
  670. netlink_dump(sk);
  671. return 0;
  672. }
  673. void netlink_ack(struct sk_buff *in_skb, struct nlmsghdr *nlh, int err)
  674. {
  675. struct sk_buff *skb;
  676. struct nlmsghdr *rep;
  677. struct nlmsgerr *errmsg;
  678. int size;
  679. if (err == 0)
  680. size = NLMSG_SPACE(sizeof(struct nlmsgerr));
  681. else
  682. size = NLMSG_SPACE(4 + NLMSG_ALIGN(nlh->nlmsg_len));
  683. skb = alloc_skb(size, GFP_KERNEL);
  684. if (!skb)
  685. return;
  686. rep = __nlmsg_put(skb, NETLINK_CB(in_skb).pid, nlh->nlmsg_seq,
  687.   NLMSG_ERROR, sizeof(struct nlmsgerr));
  688. errmsg = NLMSG_DATA(rep);
  689. errmsg->error = err;
  690. memcpy(&errmsg->msg, nlh, err ? nlh->nlmsg_len : sizeof(struct nlmsghdr));
  691. netlink_unicast(in_skb->sk, skb, NETLINK_CB(in_skb).pid, MSG_DONTWAIT);
  692. }
  693. #ifdef NL_EMULATE_DEV
  694. static rwlock_t nl_emu_lock = RW_LOCK_UNLOCKED;
  695. /*
  696.  * Backward compatibility.
  697.  */
  698.  
  699. int netlink_attach(int unit, int (*function)(int, struct sk_buff *skb))
  700. {
  701. struct sock *sk = netlink_kernel_create(unit, NULL);
  702. if (sk == NULL)
  703. return -ENOBUFS;
  704. sk->protinfo.af_netlink->handler = function;
  705. write_lock_bh(&nl_emu_lock);
  706. netlink_kernel[unit] = sk->socket;
  707. write_unlock_bh(&nl_emu_lock);
  708. return 0;
  709. }
  710. void netlink_detach(int unit)
  711. {
  712. struct socket *sock;
  713. write_lock_bh(&nl_emu_lock);
  714. sock = netlink_kernel[unit];
  715. netlink_kernel[unit] = NULL;
  716. write_unlock_bh(&nl_emu_lock);
  717. sock_release(sock);
  718. }
  719. int netlink_post(int unit, struct sk_buff *skb)
  720. {
  721. struct socket *sock;
  722. read_lock(&nl_emu_lock);
  723. sock = netlink_kernel[unit];
  724. if (sock) {
  725. struct sock *sk = sock->sk;
  726. memset(skb->cb, 0, sizeof(skb->cb));
  727. sock_hold(sk);
  728. read_unlock(&nl_emu_lock);
  729. netlink_broadcast(sk, skb, 0, ~0, GFP_ATOMIC);
  730. sock_put(sk);
  731. return 0;
  732. }
  733. read_unlock(&nl_emu_lock);
  734. return -EUNATCH;
  735. }
  736. #endif
  737. #ifdef CONFIG_PROC_FS
  738. static int netlink_read_proc(char *buffer, char **start, off_t offset,
  739.      int length, int *eof, void *data)
  740. {
  741. off_t pos=0;
  742. off_t begin=0;
  743. int len=0;
  744. int i;
  745. struct sock *s;
  746. len+= sprintf(buffer,"sk       Eth Pid    Groups   "
  747.       "Rmem     Wmem     Dump     Locksn");
  748. for (i=0; i<MAX_LINKS; i++) {
  749. read_lock(&nl_table_lock);
  750. for (s = nl_table[i]; s; s = s->next) {
  751. len+=sprintf(buffer+len,"%p %-3d %-6d %08x %-8d %-8d %p %d",
  752.      s,
  753.      s->protocol,
  754.      s->protinfo.af_netlink->pid,
  755.      s->protinfo.af_netlink->groups,
  756.      atomic_read(&s->rmem_alloc),
  757.      atomic_read(&s->wmem_alloc),
  758.      s->protinfo.af_netlink->cb,
  759.      atomic_read(&s->refcnt)
  760.      );
  761. buffer[len++]='n';
  762. pos=begin+len;
  763. if(pos<offset) {
  764. len=0;
  765. begin=pos;
  766. }
  767. if(pos>offset+length) {
  768. read_unlock(&nl_table_lock);
  769. goto done;
  770. }
  771. }
  772. read_unlock(&nl_table_lock);
  773. }
  774. *eof = 1;
  775. done:
  776. *start=buffer+(offset-begin);
  777. len-=(offset-begin);
  778. if(len>length)
  779. len=length;
  780. if(len<0)
  781. len=0;
  782. return len;
  783. }
  784. #endif
  785. struct proto_ops netlink_ops = {
  786. family: PF_NETLINK,
  787. release: netlink_release,
  788. bind: netlink_bind,
  789. connect: netlink_connect,
  790. socketpair: sock_no_socketpair,
  791. accept: sock_no_accept,
  792. getname: netlink_getname,
  793. poll: datagram_poll,
  794. ioctl: sock_no_ioctl,
  795. listen: sock_no_listen,
  796. shutdown: sock_no_shutdown,
  797. setsockopt: sock_no_setsockopt,
  798. getsockopt: sock_no_getsockopt,
  799. sendmsg: netlink_sendmsg,
  800. recvmsg: netlink_recvmsg,
  801. mmap: sock_no_mmap,
  802. sendpage: sock_no_sendpage,
  803. };
  804. struct net_proto_family netlink_family_ops = {
  805. PF_NETLINK,
  806. netlink_create
  807. };
  808. static int __init netlink_proto_init(void)
  809. {
  810. struct sk_buff *dummy_skb;
  811. if (sizeof(struct netlink_skb_parms) > sizeof(dummy_skb->cb)) {
  812. printk(KERN_CRIT "netlink_init: panicn");
  813. return -1;
  814. }
  815. sock_register(&netlink_family_ops);
  816. #ifdef CONFIG_PROC_FS
  817. create_proc_read_entry("net/netlink", 0, 0, netlink_read_proc, NULL);
  818. #endif
  819. return 0;
  820. }
  821. static void __exit netlink_proto_exit(void)
  822. {
  823.        sock_unregister(PF_NETLINK);
  824.        remove_proc_entry("net/netlink", NULL);
  825. }
  826. module_init(netlink_proto_init);
  827. module_exit(netlink_proto_exit);