開發和下載開源軟體

Browse Subversion Repository

Contents of /trunk/1.5.x/ccs-patch/fs/tomoyo_network.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 502 - (show annotations) (download) (as text)
Tue Sep 25 13:33:45 2007 UTC (16 years, 7 months ago) by kumaneko
File MIME type: text/x-csrc
File size: 18961 byte(s)


1 /*
2 * fs/tomoyo_network.c
3 *
4 * Implementation of the Domain-Based Mandatory Access Control.
5 *
6 * Copyright (C) 2005-2007 NTT DATA CORPORATION
7 *
8 * Version: 1.5.0 2007/09/20
9 *
10 * This file is applicable to both 2.4.30 and 2.6.11 and later.
11 * See README.ccs for ChangeLog.
12 *
13 */
14 /***** TOMOYO Linux start. *****/
15
16 #include <linux/ccs_common.h>
17 #include <linux/tomoyo.h>
18 #include <linux/realpath.h>
19 #include <net/ip.h>
20
21 /************************* VARIABLES *************************/
22
23 extern struct semaphore domain_acl_lock;
24
25 /************************* AUDIT FUNCTIONS *************************/
26
27 static int AuditNetworkLog(const int is_ipv6, const char *operation, const u32 *address, const u16 port, const int is_granted)
28 {
29 char *buf;
30 int len = 256;
31 if (CanSaveAuditLog(is_granted) < 0) return -ENOMEM;
32 if ((buf = InitAuditLog(&len)) == NULL) return -ENOMEM;
33 snprintf(buf + strlen(buf), len - strlen(buf) - 1, KEYWORD_ALLOW_NETWORK "%s ", operation);
34 if (is_ipv6) {
35 print_ipv6(buf + strlen(buf), len - strlen(buf), (const u16 *) address);
36 } else {
37 u32 ip = *address;
38 snprintf(buf + strlen(buf), len - strlen(buf) - 1, "%u.%u.%u.%u", NIPQUAD(ip));
39 }
40 snprintf(buf + strlen(buf), len - strlen(buf) - 1, " %u\n", port);
41 return WriteAuditLog(buf, is_granted);
42 }
43
44 /************************* ADDRESS GROUP HANDLER *************************/
45
46 static struct address_group_entry *group_list = NULL;
47
48 static int AddAddressGroupEntry(const char *group_name, const u8 is_ipv6, const u16 *min_address, const u16 *max_address, const int is_delete)
49 {
50 static DECLARE_MUTEX(lock);
51 struct address_group_entry *new_group, *group;
52 struct address_group_member *new_member, *member;
53 const struct path_info *saved_group_name;
54 int error = -ENOMEM;
55 if (!IsCorrectPath(group_name, 0, 0, 0, __FUNCTION__) || !group_name[0]) return -EINVAL;
56 if ((saved_group_name = SaveName(group_name)) == NULL) return -ENOMEM;
57 down(&lock);
58 for (group = group_list; group; group = group->next) {
59 if (saved_group_name != group->group_name) continue;
60 for (member = group->first_member; member; member = member->next) {
61 if (member->is_ipv6 != is_ipv6) continue;
62 if (is_ipv6) {
63 if (memcmp(member->min.ipv6, min_address, 16) || memcmp(member->max.ipv6, max_address, 16)) continue;
64 } else {
65 if (member->min.ipv4 != * (u32 *) min_address || member->max.ipv4 != * (u32 *) max_address) continue;
66 }
67 member->is_deleted = is_delete;
68 error = 0;
69 goto out;
70 }
71 break;
72 }
73 if (is_delete) {
74 error = -ENOENT;
75 goto out;
76 }
77 if (!group) {
78 if ((new_group = alloc_element(sizeof(*new_group))) == NULL) goto out;
79 new_group->group_name = saved_group_name;
80 mb(); /* Instead of using spinlock. */
81 if ((group = group_list) != NULL) {
82 while (group->next) group = group->next; group->next = new_group;
83 } else {
84 group_list= new_group;
85 }
86 group = new_group;
87 }
88 if ((new_member = alloc_element(sizeof(*new_member))) == NULL) goto out;
89 new_member->is_ipv6 = is_ipv6;
90 if (is_ipv6) {
91 memmove(new_member->min.ipv6, min_address, 16);
92 memmove(new_member->max.ipv6, max_address, 16);
93 } else {
94 new_member->min.ipv4 = * (u32 *) min_address;
95 new_member->max.ipv4 = * (u32 *) max_address;
96 }
97 mb(); /* Instead of using spinlock. */
98 if ((member = group->first_member) != NULL) {
99 while (member->next) member = member->next; member->next = new_member;
100 } else {
101 group->first_member = new_member;
102 }
103 error = 0;
104 out:
105 up(&lock);
106 return error;
107 }
108
109 int AddAddressGroupPolicy(char *data, const int is_delete)
110 {
111 int count, is_ipv6;
112 u16 min_address[8], max_address[8];
113 char *cp = strchr(data, ' ');
114 if (!cp) return -EINVAL;
115 *cp++ = '\0';
116 if ((count = sscanf(cp, "%hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx-%hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx",
117 &min_address[0], &min_address[1], &min_address[2], &min_address[3],
118 &min_address[4], &min_address[5], &min_address[6], &min_address[7],
119 &max_address[0], &max_address[1], &max_address[2], &max_address[3],
120 &max_address[4], &max_address[5], &max_address[6], &max_address[7])) == 8 || count == 16) {
121 int i;
122 for (i = 0; i < 8; i++) {
123 min_address[i] = htons(min_address[i]);
124 max_address[i] = htons(max_address[i]);
125 }
126 if (count == 8) memmove(max_address, min_address, sizeof(min_address));
127 is_ipv6 = 1;
128 } else if ((count = sscanf(cp, "%hu.%hu.%hu.%hu-%hu.%hu.%hu.%hu",
129 &min_address[0], &min_address[1], &min_address[2], &min_address[3],
130 &max_address[0], &max_address[1], &max_address[2], &max_address[3])) == 4 || count == 8) {
131 u32 ip = ((((u8) min_address[0]) << 24) + (((u8) min_address[1]) << 16) + (((u8) min_address[2]) << 8) + (u8) min_address[3]);
132 * (u32 *) min_address = ip;
133 if (count == 8) ip = ((((u8) max_address[0]) << 24) + (((u8) max_address[1]) << 16) + (((u8) max_address[2]) << 8) + (u8) max_address[3]);
134 * (u32 *) max_address = ip;
135 is_ipv6 = 0;
136 } else {
137 return -EINVAL;
138 }
139 return AddAddressGroupEntry(data, is_ipv6, min_address, max_address, is_delete);
140 }
141
142 static struct address_group_entry *FindOrAssignNewAddressGroup(const char *group_name)
143 {
144 int i;
145 struct address_group_entry *group;
146 for (i = 0; i <= 1; i++) {
147 for (group = group_list; group; group = group->next) {
148 if (strcmp(group_name, group->group_name->name) == 0) return group;
149 }
150 if (i == 0) {
151 const u16 dummy[2] = { 0, 0 };
152 AddAddressGroupEntry(group_name, 0, dummy, dummy, 0);
153 AddAddressGroupEntry(group_name, 0, dummy, dummy, 1);
154 }
155 }
156 return NULL;
157 }
158
159 static int AddressMatchesToGroup(const u8 is_ipv6, const u32 *address, const struct address_group_entry *group)
160 {
161 struct address_group_member *member;
162 const u32 ip = ntohl(*address);
163 for (member = group->first_member; member; member = member->next) {
164 if (member->is_deleted) continue;
165 if (member->is_ipv6) {
166 if (is_ipv6 && memcmp(member->min.ipv6, address, 16) <= 0 && memcmp(address, member->max.ipv6, 16) <= 0) return 1;
167 } else {
168 if (!is_ipv6 && member->min.ipv4 <= ip && ip <= member->max.ipv4) return 1;
169 }
170 }
171 return 0;
172 }
173
174 int ReadAddressGroupPolicy(struct io_buffer *head)
175 {
176 struct address_group_entry *group = head->read_var1;
177 struct address_group_member *member = head->read_var2;
178 if (!group) group = group_list;
179 while (group) {
180 head->read_var1 = group;
181 if (!member) member = group->first_member;
182 while (member) {
183 head->read_var2 = member;
184 if (!member->is_deleted) {
185 char buf[128];
186 if (member->is_ipv6) {
187 const u16 *min_address = member->min.ipv6, *max_address = member->max.ipv6;
188 print_ipv6(buf, sizeof(buf), min_address);
189 if (memcmp(min_address, max_address, 16)) {
190 char *cp = strchr(buf, '\0');
191 *cp++ = '-';
192 print_ipv6(cp, sizeof(buf) - strlen(buf), max_address);
193 }
194 } else {
195 const u32 min_address = member->min.ipv4, max_address = member->max.ipv4;
196 memset(buf, 0, sizeof(buf));
197 snprintf(buf, sizeof(buf) - 1, "%u.%u.%u.%u", HIPQUAD(min_address));
198 if (min_address != max_address) {
199 const int len = strlen(buf);
200 snprintf(buf + len, sizeof(buf) - 1 - len, "-%u.%u.%u.%u", HIPQUAD(max_address));
201 }
202 }
203 if (io_printf(head, KEYWORD_ADDRESS_GROUP "%s %s\n", group->group_name->name, buf)) break;
204 }
205 member = member->next;
206 }
207 if (member) break;
208 head->read_var2 = NULL;
209 group = group->next;
210 }
211 return group ? -ENOMEM : 0;
212 }
213
214 /************************* NETWORK NETWORK ACL HANDLER *************************/
215
216 char *print_ipv6(char *buffer, const int buffer_len, const u16 *ip)
217 {
218 memset(buffer, 0, buffer_len);
219 snprintf(buffer, buffer_len - 1, "%x:%x:%x:%x:%x:%x:%x:%x", ntohs(ip[0]), ntohs(ip[1]), ntohs(ip[2]), ntohs(ip[3]), ntohs(ip[4]), ntohs(ip[5]), ntohs(ip[6]), ntohs(ip[7]));
220 return buffer;
221 }
222
223 const char *network2keyword(const unsigned int operation)
224 {
225 const char *keyword = "unknown";
226 switch (operation) {
227 case NETWORK_ACL_UDP_BIND:
228 keyword = "UDP bind";
229 break;
230 case NETWORK_ACL_UDP_CONNECT:
231 keyword = "UDP connect";
232 break;
233 case NETWORK_ACL_TCP_BIND:
234 keyword = "TCP bind";
235 break;
236 case NETWORK_ACL_TCP_LISTEN:
237 keyword = "TCP listen";
238 break;
239 case NETWORK_ACL_TCP_CONNECT:
240 keyword = "TCP connect";
241 break;
242 case NETWORK_ACL_TCP_ACCEPT:
243 keyword = "TCP accept";
244 break;
245 case NETWORK_ACL_RAW_BIND:
246 keyword = "RAW bind";
247 break;
248 case NETWORK_ACL_RAW_CONNECT:
249 keyword = "RAW connect";
250 break;
251 }
252 return keyword;
253 }
254
255 static int AddNetworkEntry(const u8 operation, const u8 record_type, const struct address_group_entry *group, const u32 *min_address, const u32 *max_address, const u16 min_port, const u16 max_port, struct domain_info *domain, const u8 is_add, const struct condition_list *condition)
256 {
257 struct acl_info *ptr;
258 int error = -ENOMEM;
259 const u32 min_ip = ntohl(*min_address), max_ip = ntohl(*max_address); /* using host byte order to allow u32 comparison than memcmp().*/
260 if (!domain) return -EINVAL;
261 down(&domain_acl_lock);
262 if (is_add) {
263 if ((ptr = domain->first_acl_ptr) == NULL) goto first_entry;
264 while (1) {
265 struct ip_network_acl_record *new_ptr = (struct ip_network_acl_record *) ptr;
266 if (ptr->type == TYPE_IP_NETWORK_ACL && new_ptr->operation_type == operation && new_ptr->record_type == record_type && ptr->cond == condition && new_ptr->min_port == min_port && max_port == new_ptr->max_port) {
267 if (record_type == IP_RECORD_TYPE_ADDRESS_GROUP) {
268 if (new_ptr->u.group == group) {
269 ptr->is_deleted = 0;
270 /* Found. Nothing to do. */
271 error = 0;
272 break;
273 }
274 } else if (record_type == IP_RECORD_TYPE_IPv4) {
275 if (new_ptr->u.ipv4.min == min_ip && max_ip == new_ptr->u.ipv4.max) {
276 ptr->is_deleted = 0;
277 /* Found. Nothing to do. */
278 error = 0;
279 break;
280 }
281 } else if (record_type == IP_RECORD_TYPE_IPv6) {
282 if (memcmp(new_ptr->u.ipv6.min, min_address, 16) == 0 && memcmp(max_address, new_ptr->u.ipv6.max, 16) == 0) {
283 ptr->is_deleted = 0;
284 /* Found. Nothing to do. */
285 error = 0;
286 break;
287 }
288 }
289 }
290 if (ptr->next) {
291 ptr = ptr->next;
292 continue;
293 }
294 first_entry: ;
295 if (is_add == 1 && TooManyDomainACL(domain)) break;
296 /* Not found. Append it to the tail. */
297 if ((new_ptr = alloc_element(sizeof(*new_ptr))) == NULL) break;
298 new_ptr->head.type = TYPE_IP_NETWORK_ACL;
299 new_ptr->operation_type = operation;
300 new_ptr->record_type = record_type;
301 new_ptr->head.cond = condition;
302 if (record_type == IP_RECORD_TYPE_ADDRESS_GROUP) {
303 new_ptr->u.group = group;
304 } else if (record_type == IP_RECORD_TYPE_IPv4) {
305 new_ptr->u.ipv4.min = min_ip;
306 new_ptr->u.ipv4.max = max_ip;
307 } else {
308 memmove(new_ptr->u.ipv6.min, min_address, 16);
309 memmove(new_ptr->u.ipv6.max, max_address, 16);
310 }
311 new_ptr->min_port = min_port;
312 new_ptr->max_port = max_port;
313 error = AddDomainACL(ptr, domain, (struct acl_info *) new_ptr);
314 break;
315 }
316 } else {
317 error = -ENOENT;
318 for (ptr = domain->first_acl_ptr; ptr; ptr = ptr->next) {
319 struct ip_network_acl_record *ptr2 = (struct ip_network_acl_record *) ptr;
320 if (ptr->type != TYPE_IP_NETWORK_ACL || ptr->is_deleted || ptr2->operation_type != operation || ptr2->record_type != record_type || ptr->cond != condition || ptr2->min_port != min_port || ptr2->max_port != max_port) continue;
321 if (record_type == IP_RECORD_TYPE_ADDRESS_GROUP) {
322 if (ptr2->u.group != group) continue;
323 } else if (record_type == IP_RECORD_TYPE_IPv4) {
324 if (ptr2->u.ipv4.min != min_ip || max_ip != ptr2->u.ipv4.max) continue;
325 } else if (record_type == IP_RECORD_TYPE_IPv6) {
326 if (memcmp(ptr2->u.ipv6.min, min_address, 16) || memcmp(max_address, ptr2->u.ipv6.max, 16)) continue;
327 }
328 error = DelDomainACL(ptr);
329 break;
330 }
331 }
332 up(&domain_acl_lock);
333 return error;
334 }
335
336 static int CheckNetworkEntry(const int is_ipv6, const int operation, const u32 *address, const u16 port)
337 {
338 struct domain_info * const domain = current->domain_info;
339 struct acl_info *ptr;
340 const char *keyword = network2keyword(operation);
341 const int is_enforce = CheckCCSEnforce(CCS_TOMOYO_MAC_FOR_NETWORK);
342 const u32 ip = ntohl(*address); /* using host byte order to allow u32 comparison than memcmp().*/
343 if (!CheckCCSFlags(CCS_TOMOYO_MAC_FOR_NETWORK)) return 0;
344 for (ptr = domain->first_acl_ptr; ptr; ptr = ptr->next) {
345 struct ip_network_acl_record *ptr2 = (struct ip_network_acl_record *) ptr;
346 if (ptr->type != TYPE_IP_NETWORK_ACL || ptr->is_deleted || ptr2->operation_type != operation || port < ptr2->min_port || ptr2->max_port < port || CheckCondition(ptr->cond, NULL)) continue;
347 if (ptr2->record_type == IP_RECORD_TYPE_ADDRESS_GROUP) {
348 if (AddressMatchesToGroup(is_ipv6, address, ptr2->u.group)) break;
349 } else if (ptr2->record_type == IP_RECORD_TYPE_IPv4) {
350 if (!is_ipv6 && ptr2->u.ipv4.min <= ip && ip <= ptr2->u.ipv4.max) break;
351 } else {
352 if (is_ipv6 && memcmp(ptr2->u.ipv6.min, address, 16) <= 0 && memcmp(address, ptr2->u.ipv6.max, 16) <= 0) break;
353 }
354 }
355 if (ptr) {
356 AuditNetworkLog(is_ipv6, keyword, address, port, 1);
357 return 0;
358 }
359 if (TomoyoVerboseMode()) {
360 if (is_ipv6) {
361 char buf[64];
362 print_ipv6(buf, sizeof(buf), (const u16 *) address);
363 printk("TOMOYO-%s: %s to %s %u denied for %s\n", GetMSG(is_enforce), keyword, buf, port, GetLastName(domain));
364 } else {
365 printk("TOMOYO-%s: %s to %u.%u.%u.%u %u denied for %s\n", GetMSG(is_enforce), keyword, HIPQUAD(ip), port, GetLastName(domain));
366 }
367 }
368 AuditNetworkLog(is_ipv6, keyword, address, port, 0);
369 if (is_enforce) {
370 if (is_ipv6) {
371 char buf[64];
372 print_ipv6(buf, sizeof(buf), (const u16 *) address);
373 return CheckSupervisor("%s\n" KEYWORD_ALLOW_NETWORK "%s %s %u\n", domain->domainname->name, keyword, buf, port);
374 }
375 return CheckSupervisor("%s\n" KEYWORD_ALLOW_NETWORK "%s %u.%u.%u.%u %u\n", domain->domainname->name, keyword, HIPQUAD(ip), port);
376 }
377 if (CheckCCSAccept(CCS_TOMOYO_MAC_FOR_NETWORK)) AddNetworkEntry(operation, is_ipv6 ? IP_RECORD_TYPE_IPv6: IP_RECORD_TYPE_IPv4, NULL, address, address, port, port, domain, 1, NULL);
378 return 0;
379 }
380
381 int AddNetworkPolicy(char *data, struct domain_info *domain, const int is_delete)
382 {
383 u8 sock_type, operation, record_type;
384 u16 min_address[8], max_address[8];
385 struct address_group_entry *group = NULL;
386 u16 min_port, max_port;
387 int count;
388 char *cp1 = NULL, *cp2 = NULL;
389 const struct condition_list *condition = NULL;
390 cp1 = FindConditionPart(data);
391 if (cp1 && (condition = FindOrAssignNewCondition(cp1)) == NULL) goto out;
392 if ((cp1 = strchr(data, ' ')) == NULL) goto out; cp1++;
393 if (strncmp(data, "TCP ", 4) == 0) sock_type = SOCK_STREAM;
394 else if (strncmp(data, "UDP ", 4) == 0) sock_type = SOCK_DGRAM;
395 else if (strncmp(data, "RAW ", 4) == 0) sock_type = SOCK_RAW;
396 else goto out;
397 if ((cp2 = strchr(cp1, ' ')) == NULL) goto out; cp2++;
398 if (strncmp(cp1, "bind ", 5) == 0) {
399 operation = (sock_type == SOCK_STREAM) ? NETWORK_ACL_TCP_BIND : (sock_type == SOCK_DGRAM) ? NETWORK_ACL_UDP_BIND : NETWORK_ACL_RAW_BIND;
400 } else if (strncmp(cp1, "connect ", 8) == 0) {
401 operation = (sock_type == SOCK_STREAM) ? NETWORK_ACL_TCP_CONNECT : (sock_type == SOCK_DGRAM) ? NETWORK_ACL_UDP_CONNECT : NETWORK_ACL_RAW_CONNECT;
402 } else if (sock_type == SOCK_STREAM && strncmp(cp1, "listen ", 7) == 0) {
403 operation = NETWORK_ACL_TCP_LISTEN;
404 } else if (sock_type == SOCK_STREAM && strncmp(cp1, "accept ", 7) == 0) {
405 operation = NETWORK_ACL_TCP_ACCEPT;
406 } else {
407 goto out;
408 }
409 if ((cp1 = strchr(cp2, ' ')) == NULL) goto out; *cp1++ = '\0';
410 if ((count = sscanf(cp2, "%hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx-%hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx",
411 &min_address[0], &min_address[1], &min_address[2], &min_address[3],
412 &min_address[4], &min_address[5], &min_address[6], &min_address[7],
413 &max_address[0], &max_address[1], &max_address[2], &max_address[3],
414 &max_address[4], &max_address[5], &max_address[6], &max_address[7])) == 8 || count == 16) {
415 int i;
416 for (i = 0; i < 8; i++) {
417 min_address[i] = htons(min_address[i]);
418 max_address[i] = htons(max_address[i]);
419 }
420 if (count == 8) memmove(max_address, min_address, sizeof(min_address));
421 record_type = IP_RECORD_TYPE_IPv6;
422 } else if ((count = sscanf(cp2, "%hu.%hu.%hu.%hu-%hu.%hu.%hu.%hu",
423 &min_address[0], &min_address[1], &min_address[2], &min_address[3],
424 &max_address[0], &max_address[1], &max_address[2], &max_address[3])) == 4 || count == 8) {
425 u32 ip = htonl((((u8) min_address[0]) << 24) + (((u8) min_address[1]) << 16) + (((u8) min_address[2]) << 8) + (u8) min_address[3]);
426 * (u32 *) min_address = ip;
427 if (count == 8) ip = htonl((((u8) max_address[0]) << 24) + (((u8) max_address[1]) << 16) + (((u8) max_address[2]) << 8) + (u8) max_address[3]);
428 * (u32 *) max_address = ip;
429 record_type = IP_RECORD_TYPE_IPv4;
430 } else if (*cp2 == '@') {
431 if ((group = FindOrAssignNewAddressGroup(cp2 + 1)) == NULL) return -ENOMEM;
432 record_type = IP_RECORD_TYPE_ADDRESS_GROUP;
433 } else {
434 goto out;
435 }
436 if (strchr(cp1, ' ')) goto out;
437 if ((count = sscanf(cp1, "%hu-%hu", &min_port, &max_port)) == 1 || count == 2) {
438 if (count == 1) max_port = min_port;
439 return AddNetworkEntry(operation, record_type, group, (u32 *) min_address, (u32 *) max_address, min_port, max_port, domain, is_delete ? 0 : -1, condition);
440 }
441 out: ;
442 return -EINVAL;
443 }
444
445 int CheckNetworkListenACL(const int is_ipv6, const u8 *address, const u16 port)
446 {
447 return CheckNetworkEntry(is_ipv6, NETWORK_ACL_TCP_LISTEN, (const u32 *) address, ntohs(port));
448 }
449 EXPORT_SYMBOL(CheckNetworkListenACL);
450
451 int CheckNetworkConnectACL(const int is_ipv6, const int sock_type, const u8 *address, const u16 port)
452 {
453 return CheckNetworkEntry(is_ipv6, sock_type == SOCK_STREAM ? NETWORK_ACL_TCP_CONNECT : (sock_type == SOCK_DGRAM ? NETWORK_ACL_UDP_CONNECT : NETWORK_ACL_RAW_CONNECT), (const u32 *) address, ntohs(port));
454 }
455 EXPORT_SYMBOL(CheckNetworkConnectACL);
456
457 int CheckNetworkBindACL(const int is_ipv6, const int sock_type, const u8 *address, const u16 port)
458 {
459 return CheckNetworkEntry(is_ipv6, sock_type == SOCK_STREAM ? NETWORK_ACL_TCP_BIND : (sock_type == SOCK_DGRAM ? NETWORK_ACL_UDP_BIND : NETWORK_ACL_RAW_BIND), (const u32 *) address, ntohs(port));
460 }
461 EXPORT_SYMBOL(CheckNetworkBindACL);
462
463 int CheckNetworkAcceptACL(const int is_ipv6, const u8 *address, const u16 port)
464 {
465 return CheckNetworkEntry(is_ipv6, NETWORK_ACL_TCP_ACCEPT, (const u32 *) address, ntohs(port));
466 }
467 EXPORT_SYMBOL(CheckNetworkAcceptACL);
468
469 int CheckNetworkSendMsgACL(const int is_ipv6, const int sock_type, const u8 *address, const u16 port)
470 {
471 return CheckNetworkEntry(is_ipv6, sock_type == SOCK_DGRAM ? NETWORK_ACL_UDP_CONNECT : NETWORK_ACL_RAW_CONNECT, (const u32 *) address, ntohs(port));
472 }
473 EXPORT_SYMBOL(CheckNetworkSendMsgACL);
474
475 int CheckNetworkRecvMsgACL(const int is_ipv6, const int sock_type, const u8 *address, const u16 port)
476 {
477 return CheckNetworkEntry(is_ipv6, sock_type == SOCK_DGRAM ? NETWORK_ACL_UDP_CONNECT : NETWORK_ACL_RAW_CONNECT, (const u32 *) address, ntohs(port));
478 }
479 EXPORT_SYMBOL(CheckNetworkRecvMsgACL);
480
481 /***** TOMOYO Linux end. *****/

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26