29 #include <linux/kernel.h>
30 #include <linux/string.h>
31 #include <linux/slab.h>
32 #include <linux/errno.h>
34 #include <linux/netdevice.h>
36 #include <linux/if_arp.h>
37 #include <linux/bitops.h>
40 #include <asm/byteorder.h>
55 #undef CONFIG_IRLAN_GRATUITOUS_ARP
57 static void irlan_client_ctrl_disconnect_indication(
void *instance,
void *sap,
60 static int irlan_client_ctrl_data_indication(
void *instance,
void *sap,
62 static void irlan_client_ctrl_connect_confirm(
void *instance,
void *sap,
67 static void irlan_check_response_param(
struct irlan_cb *
self,
char *
param,
68 char *
value,
int val_len);
69 static void irlan_client_open_ctrl_tsap(
struct irlan_cb *
self);
71 static void irlan_client_kick_timer_expired(
void *
data)
92 static void irlan_client_start_kick_timer(
struct irlan_cb *
self,
int timeout)
96 irda_start_timer(&self->client.kick_timer, timeout, (
void *)
self,
97 irlan_client_kick_timer_expired);
120 IRDA_DEBUG(0,
"%s(), already awake!\n", __func__ );
129 IRDA_DEBUG(0,
"%s(), still stopped by user\n", __func__ );
134 irlan_client_open_ctrl_tsap(
self);
140 irlan_client_start_kick_timer(
self, 2*
HZ);
169 saddr = discovery->
saddr;
170 daddr = discovery->
daddr;
178 IRDA_DEBUG(1,
"%s(), Found instance (%08x)!\n", __func__ ,
193 static int irlan_client_ctrl_data_indication(
void *instance,
void *sap,
209 IRDA_DEBUG(2,
"%s(), clearing tx_busy\n", __func__ );
210 self->client.tx_busy =
FALSE;
218 static void irlan_client_ctrl_disconnect_indication(
void *instance,
void *sap,
226 IRDA_DEBUG(4,
"%s(), reason=%d\n", __func__ , reason);
236 IRDA_ASSERT(tsap == self->client.tsap_ctrl,
return;);
242 self->client.tx_busy =
FALSE;
253 static void irlan_client_open_ctrl_tsap(
struct irlan_cb *
self)
264 if (self->client.tsap_ctrl)
278 IRDA_DEBUG(2,
"%s(), Got no tsap!\n", __func__ );
281 self->client.tsap_ctrl = tsap;
290 static void irlan_client_ctrl_connect_confirm(
void *instance,
void *sap,
319 static void print_ret_code(
__u8 code)
377 IRDA_DEBUG(4,
"%s() skb->len=%d\n", __func__ , (
int) skb->
len);
383 IRDA_ERROR(
"%s(), Got NULL skb!\n", __func__);
392 print_ret_code(frame[0]);
408 IRDA_DEBUG(4,
"%s(), got %d parameters\n", __func__ , count);
413 for (i=0; i<
count;i++) {
416 IRDA_DEBUG(2,
"%s(), IrLAN, Error!\n", __func__ );
420 irlan_check_response_param(
self, name, value, val_len);
433 static void irlan_check_response_param(
struct irlan_cb *
self,
char *
param,
434 char *
value,
int val_len)
440 IRDA_DEBUG(4,
"%s(), parm=%s\n", __func__ , param);
446 if (
strcmp(param,
"MEDIA") == 0) {
447 if (
strcmp(value,
"802.3") == 0)
453 if (
strcmp(param,
"FILTER_TYPE") == 0) {
454 if (
strcmp(value,
"DIRECTED") == 0)
456 else if (
strcmp(value,
"FUNCTIONAL") == 0)
458 else if (
strcmp(value,
"GROUP") == 0)
460 else if (
strcmp(value,
"MAC_FRAME") == 0)
462 else if (
strcmp(value,
"MULTICAST") == 0)
464 else if (
strcmp(value,
"BROADCAST") == 0)
466 else if (
strcmp(value,
"IPX_SOCKET") == 0)
470 if (
strcmp(param,
"ACCESS_TYPE") == 0) {
471 if (
strcmp(value,
"DIRECT") == 0)
473 else if (
strcmp(value,
"PEER") == 0)
475 else if (
strcmp(value,
"HOSTED") == 0)
478 IRDA_DEBUG(2,
"%s(), unknown access type!\n", __func__ );
482 if (
strcmp(param,
"IRLAN_VER") == 0) {
486 self->version[0] = value[0];
487 self->version[1] = value[1];
491 if (
strcmp(param,
"DATA_CHAN") == 0) {
492 self->dtsap_sel_data = value[0];
493 IRDA_DEBUG(4,
"Data TSAP = %02x\n", self->dtsap_sel_data);
496 if (
strcmp(param,
"CON_ARB") == 0) {
497 memcpy(&tmp_cpu, value, 2);
499 self->client.recv_arb_val = tmp_cpu;
500 IRDA_DEBUG(2,
"%s(), receive arb val=%d\n", __func__ ,
501 self->client.recv_arb_val);
503 if (
strcmp(param,
"MAX_FRAME") == 0) {
504 memcpy(&tmp_cpu, value, 2);
506 self->client.max_frame = tmp_cpu;
507 IRDA_DEBUG(4,
"%s(), max frame=%d\n", __func__ ,
508 self->client.max_frame);
512 if (
strcmp(param,
"RECONNECT_KEY") == 0) {
516 memcpy(self->client.reconnect_key, value, val_len);
517 self->client.key_len = val_len;
521 if (
strcmp(param,
"FILTER_ENTRY") == 0) {
523 IRDA_DEBUG(4,
"Ethernet address = %pM\n", bytes);
524 for (i = 0; i < 6; i++)
525 self->dev->dev_addr[i] = bytes[i];
549 self->client.iriap =
NULL;
553 IRDA_DEBUG(2,
"%s(), got NULL value!\n", __func__ );
559 switch (value->
type) {
561 self->dtsap_sel_ctrl = value->
t.
integer;
571 IRDA_DEBUG(2,
"%s(), unknown type!\n", __func__ );