11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/********************************************************************* 26819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki * 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Filename: irlan_filter.c 46819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki * Version: 56819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki * Description: 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Status: Experimental. 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Author: Dag Brattli <dagb@cs.uit.no> 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Created at: Fri Jan 29 11:16:38 1999 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Modified at: Sat Oct 30 12:58:45 1999 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Modified by: Dag Brattli <dagb@cs.uit.no> 116819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki * 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (c) 1998-1999 Dag Brattli, All Rights Reserved. 136819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki * 146819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki * This program is free software; you can redistribute it and/or 156819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki * modify it under the terms of the GNU General Public License as 166819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki * published by the Free Software Foundation; either version 2 of 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the License, or (at your option) any later version. 186819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki * 19db955170d40601d9925f01712782fbe3ce362b7eMarcin Garski * Neither Dag Brattli nor University of Tromsø admit liability nor 206819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki * provide warranty for any of this software. This material is 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * provided "AS-IS" and at no charge. 226819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki * 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ********************************************************************/ 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/skbuff.h> 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/random.h> 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/seq_file.h> 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <net/irda/irlan_common.h> 30506e7beb7468c7cf56370d0a7a6afbec56653473Adrian Bunk#include <net/irda/irlan_filter.h> 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Function irlan_filter_request (self, skb) 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Handle filter request from client peer device 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid irlan_filter_request(struct irlan_cb *self, struct sk_buff *skb) 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds IRDA_ASSERT(self != NULL, return;); 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds IRDA_ASSERT(self->magic == IRLAN_MAGIC, return;); 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 436819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki if ((self->provider.filter_type == IRLAN_DIRECTED) && 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (self->provider.filter_operation == DYNAMIC)) 451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds IRDA_DEBUG(0, "Giving peer a dynamic Ethernet address\n"); 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds self->provider.mac_address[0] = 0x40; 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds self->provider.mac_address[1] = 0x00; 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds self->provider.mac_address[2] = 0x00; 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds self->provider.mac_address[3] = 0x00; 516819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki 521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Use arbitration value to generate MAC address */ 531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (self->provider.access_type == ACCESS_PEER) { 546819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki self->provider.mac_address[4] = 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds self->provider.send_arb_val & 0xff; 566819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki self->provider.mac_address[5] = 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (self->provider.send_arb_val >> 8) & 0xff; 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else { 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Just generate something for now */ 601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds get_random_bytes(self->provider.mac_address+4, 1); 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds get_random_bytes(self->provider.mac_address+5, 1); 621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds skb->data[0] = 0x00; /* Success */ 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds skb->data[1] = 0x03; 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds irlan_insert_string_param(skb, "FILTER_MODE", "NONE"); 671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds irlan_insert_short_param(skb, "MAX_ENTRY", 0x0001); 686819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki irlan_insert_array_param(skb, "FILTER_ENTRY", 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds self->provider.mac_address, 6); 701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 726819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki 736819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki if ((self->provider.filter_type == IRLAN_DIRECTED) && 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (self->provider.filter_mode == FILTER)) 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds IRDA_DEBUG(0, "Directed filter on\n"); 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds skb->data[0] = 0x00; /* Success */ 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds skb->data[1] = 0x00; 791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 816819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki if ((self->provider.filter_type == IRLAN_DIRECTED) && 821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (self->provider.filter_mode == NONE)) 831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds IRDA_DEBUG(0, "Directed filter off\n"); 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds skb->data[0] = 0x00; /* Success */ 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds skb->data[1] = 0x00; 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 906819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki if ((self->provider.filter_type == IRLAN_BROADCAST) && 911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (self->provider.filter_mode == FILTER)) 921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds IRDA_DEBUG(0, "Broadcast filter on\n"); 941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds skb->data[0] = 0x00; /* Success */ 951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds skb->data[1] = 0x00; 961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 986819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki if ((self->provider.filter_type == IRLAN_BROADCAST) && 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (self->provider.filter_mode == NONE)) 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds IRDA_DEBUG(0, "Broadcast filter off\n"); 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds skb->data[0] = 0x00; /* Success */ 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds skb->data[1] = 0x00; 1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1066819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki if ((self->provider.filter_type == IRLAN_MULTICAST) && 1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (self->provider.filter_mode == FILTER)) 1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds IRDA_DEBUG(0, "Multicast filter on\n"); 1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds skb->data[0] = 0x00; /* Success */ 1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds skb->data[1] = 0x00; 1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1146819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki if ((self->provider.filter_type == IRLAN_MULTICAST) && 1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (self->provider.filter_mode == NONE)) 1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds IRDA_DEBUG(0, "Multicast filter off\n"); 1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds skb->data[0] = 0x00; /* Success */ 1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds skb->data[1] = 0x00; 1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1226819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki if ((self->provider.filter_type == IRLAN_MULTICAST) && 1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (self->provider.filter_operation == GET)) 1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds IRDA_DEBUG(0, "Multicast filter get\n"); 1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds skb->data[0] = 0x00; /* Success? */ 1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds skb->data[1] = 0x02; 1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds irlan_insert_string_param(skb, "FILTER_MODE", "NONE"); 1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds irlan_insert_short_param(skb, "MAX_ENTRY", 16); 1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds skb->data[0] = 0x00; /* Command not supported */ 1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds skb->data[1] = 0x00; 1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds IRDA_DEBUG(0, "Not implemented!\n"); 1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Function check_request_param (self, param, value) 1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Check parameters in request from peer device 1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid irlan_check_command_param(struct irlan_cb *self, char *param, char *value) 1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1460dc47877a3de00ceadea0005189656ae8dc52669Harvey Harrison IRDA_DEBUG(4, "%s()\n", __func__ ); 1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds IRDA_ASSERT(self != NULL, return;); 1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds IRDA_ASSERT(self->magic == IRLAN_MAGIC, return;); 1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds IRDA_DEBUG(4, "%s, %s\n", param, value); 1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This is experimental!! DB. 1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (strcmp(param, "MODE") == 0) { 1570dc47877a3de00ceadea0005189656ae8dc52669Harvey Harrison IRDA_DEBUG(0, "%s()\n", __func__ ); 1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds self->use_udata = TRUE; 1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FILTER_TYPE 1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (strcmp(param, "FILTER_TYPE") == 0) { 1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (strcmp(value, "DIRECTED") == 0) { 1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds self->provider.filter_type = IRLAN_DIRECTED; 1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (strcmp(value, "MULTICAST") == 0) { 1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds self->provider.filter_type = IRLAN_MULTICAST; 1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (strcmp(value, "BROADCAST") == 0) { 1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds self->provider.filter_type = IRLAN_BROADCAST; 1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FILTER_MODE 1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (strcmp(param, "FILTER_MODE") == 0) { 1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (strcmp(value, "ALL") == 0) { 1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds self->provider.filter_mode = ALL; 1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (strcmp(value, "FILTER") == 0) { 1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds self->provider.filter_mode = FILTER; 1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (strcmp(value, "NONE") == 0) { 1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds self->provider.filter_mode = FILTER; 1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FILTER_OPERATION 1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (strcmp(param, "FILTER_OPERATION") == 0) { 2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (strcmp(value, "DYNAMIC") == 0) { 2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds self->provider.filter_operation = DYNAMIC; 2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (strcmp(value, "GET") == 0) { 2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds self->provider.filter_operation = GET; 2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Function irlan_print_filter (filter_type, buf) 2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Print status of filter. Used by /proc file system 2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_PROC_FS 2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MASK2STR(m,s) { .mask = m, .str = s } 2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid irlan_print_filter(struct seq_file *seq, int filter_type) 2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds static struct { 2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int mask; 2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds const char *str; 2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } filter_mask2str[] = { 2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds MASK2STR(IRLAN_DIRECTED, "DIRECTED"), 2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds MASK2STR(IRLAN_FUNCTIONAL, "FUNCTIONAL"), 2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds MASK2STR(IRLAN_GROUP, "GROUP"), 2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds MASK2STR(IRLAN_MAC_FRAME, "MAC_FRAME"), 2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds MASK2STR(IRLAN_MULTICAST, "MULTICAST"), 2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds MASK2STR(IRLAN_BROADCAST, "BROADCAST"), 2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds MASK2STR(IRLAN_IPX_SOCKET, "IPX_SOCKET"), 2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds MASK2STR(0, NULL) 2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, *p; 2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (p = filter_mask2str; p->str; p++) { 2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (filter_type & p->mask) 2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds seq_printf(seq, "%s ", p->str); 2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds seq_putc(seq, '\n'); 2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef MASK2STR 2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 244