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