1 /* 2 * w1_netlink.c 3 * 4 * Copyright (c) 2003 Evgeniy Polyakov <johnpol@2ka.mipt.ru> 5 * 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published by 9 * the Free Software Foundation; either version 2 of the License, or 10 * (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; if not, write to the Free Software 19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20 */ 21 22 #include <linux/skbuff.h> 23 #include <linux/netlink.h> 24 25 #include "w1.h" 26 #include "w1_log.h" 27 #include "w1_netlink.h" 28 29 #ifndef NETLINK_DISABLED 30 void w1_netlink_send(struct w1_master *dev, struct w1_netlink_msg *msg) 31 { 32 unsigned int size; 33 struct sk_buff *skb; 34 struct w1_netlink_msg *data; 35 struct nlmsghdr *nlh; 36 37 if (!dev->nls) 38 return; 39 40 size = NLMSG_SPACE(sizeof(struct w1_netlink_msg)); 41 42 skb = alloc_skb(size, GFP_ATOMIC); 43 if (!skb) { 44 dev_err(&dev->dev, "skb_alloc() failed.\n"); 45 return; 46 } 47 48 nlh = NLMSG_PUT(skb, 0, dev->seq++, NLMSG_DONE, size - sizeof(*nlh)); 49 50 data = (struct w1_netlink_msg *)NLMSG_DATA(nlh); 51 52 memcpy(data, msg, sizeof(struct w1_netlink_msg)); 53 54 NETLINK_CB(skb).dst_group = dev->groups; 55 netlink_broadcast(dev->nls, skb, 0, dev->groups, GFP_ATOMIC); 56 57 nlmsg_failure: 58 return; 59 } 60 61 int dev_init_netlink(struct w1_master *dev) 62 { 63 dev->nls = netlink_kernel_create(NETLINK_W1, 1, NULL, THIS_MODULE); 64 if (!dev->nls) { 65 printk(KERN_ERR "Failed to create new netlink socket(%u) for w1 master %s.\n", 66 NETLINK_W1, dev->dev.bus_id); 67 } 68 69 return 0; 70 } 71 72 void dev_fini_netlink(struct w1_master *dev) 73 { 74 if (dev->nls && dev->nls->sk_socket) 75 sock_release(dev->nls->sk_socket); 76 } 77 #else 78 #warning Netlink support is disabled. Please compile with NET support enabled. 79 80 void w1_netlink_send(struct w1_master *dev, struct w1_netlink_msg *msg) 81 { 82 } 83 84 int dev_init_netlink(struct w1_master *dev) 85 { 86 return 0; 87 } 88 89 void dev_fini_netlink(struct w1_master *dev) 90 { 91 } 92 #endif 93