1 /* 2 * NetLabel NETLINK Interface 3 * 4 * This file defines the NETLINK interface for the NetLabel system. The 5 * NetLabel system manages static and dynamic label mappings for network 6 * protocols such as CIPSO and RIPSO. 7 * 8 * Author: Paul Moore <paul.moore@hp.com> 9 * 10 */ 11 12 /* 13 * (c) Copyright Hewlett-Packard Development Company, L.P., 2006 14 * 15 * This program is free software; you can redistribute it and/or modify 16 * it under the terms of the GNU General Public License as published by 17 * the Free Software Foundation; either version 2 of the License, or 18 * (at your option) any later version. 19 * 20 * This program is distributed in the hope that it will be useful, 21 * but WITHOUT ANY WARRANTY; without even the implied warranty of 22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 23 * the GNU General Public License for more details. 24 * 25 * You should have received a copy of the GNU General Public License 26 * along with this program; if not, write to the Free Software 27 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 28 * 29 */ 30 31 #include <linux/init.h> 32 #include <linux/types.h> 33 #include <linux/list.h> 34 #include <linux/socket.h> 35 #include <net/sock.h> 36 #include <net/netlink.h> 37 #include <net/genetlink.h> 38 #include <net/netlabel.h> 39 #include <asm/bug.h> 40 41 #include "netlabel_mgmt.h" 42 #include "netlabel_unlabeled.h" 43 #include "netlabel_cipso_v4.h" 44 #include "netlabel_user.h" 45 46 /* 47 * NetLabel NETLINK Setup Functions 48 */ 49 50 /** 51 * netlbl_netlink_init - Initialize the NETLINK communication channel 52 * 53 * Description: 54 * Call out to the NetLabel components so they can register their families and 55 * commands with the Generic NETLINK mechanism. Returns zero on success and 56 * non-zero on failure. 57 * 58 */ 59 int netlbl_netlink_init(void) 60 { 61 int ret_val; 62 63 ret_val = netlbl_mgmt_genl_init(); 64 if (ret_val != 0) 65 return ret_val; 66 67 ret_val = netlbl_cipsov4_genl_init(); 68 if (ret_val != 0) 69 return ret_val; 70 71 ret_val = netlbl_unlabel_genl_init(); 72 if (ret_val != 0) 73 return ret_val; 74 75 return 0; 76 } 77 78 /* 79 * NetLabel Common Protocol Functions 80 */ 81 82 /** 83 * netlbl_netlink_send_ack - Send an ACK message 84 * @info: the generic NETLINK information 85 * @genl_family: the generic NETLINK family ID value 86 * @ack_cmd: the generic NETLINK family ACK command value 87 * @ret_code: return code to use 88 * 89 * Description: 90 * This function sends an ACK message to the sender of the NETLINK message 91 * specified by @info. 92 * 93 */ 94 void netlbl_netlink_send_ack(const struct genl_info *info, 95 u32 genl_family, 96 u8 ack_cmd, 97 u32 ret_code) 98 { 99 size_t data_size; 100 struct sk_buff *skb; 101 102 data_size = GENL_HDRLEN + 2 * NETLBL_LEN_U32; 103 skb = netlbl_netlink_alloc_skb(0, data_size, GFP_KERNEL); 104 if (skb == NULL) 105 return; 106 107 if (netlbl_netlink_hdr_put(skb, 108 info->snd_pid, 109 0, 110 genl_family, 111 ack_cmd) == NULL) 112 goto send_ack_failure; 113 114 if (nla_put_u32(skb, NLA_U32, info->snd_seq) != 0) 115 goto send_ack_failure; 116 if (nla_put_u32(skb, NLA_U32, ret_code) != 0) 117 goto send_ack_failure; 118 119 netlbl_netlink_snd(skb, info->snd_pid); 120 return; 121 122 send_ack_failure: 123 kfree_skb(skb); 124 } 125 126 /* 127 * NETLINK I/O Functions 128 */ 129 130 /** 131 * netlbl_netlink_snd - Send a NetLabel message 132 * @skb: NetLabel message 133 * @pid: destination PID 134 * 135 * Description: 136 * Sends a unicast NetLabel message over the NETLINK socket. 137 * 138 */ 139 int netlbl_netlink_snd(struct sk_buff *skb, u32 pid) 140 { 141 return genlmsg_unicast(skb, pid); 142 } 143 144 /** 145 * netlbl_netlink_snd - Send a NetLabel message 146 * @skb: NetLabel message 147 * @pid: sending PID 148 * @group: multicast group id 149 * 150 * Description: 151 * Sends a multicast NetLabel message over the NETLINK socket to all members 152 * of @group except @pid. 153 * 154 */ 155 int netlbl_netlink_snd_multicast(struct sk_buff *skb, u32 pid, u32 group) 156 { 157 return genlmsg_multicast(skb, pid, group, GFP_KERNEL); 158 } 159