patch-2.2.6 linux/net/irda/ircomm/attach.c
Next file: linux/net/irda/ircomm/ircomm_common.c
Previous file: linux/net/irda/ircomm/Makefile
Back to the patch index
Back to the overall index
- Lines: 361
- Date:
Wed Dec 31 16:00:00 1969
- Orig file:
v2.2.5/linux/net/irda/ircomm/attach.c
- Orig date:
Wed Mar 10 15:29:52 1999
diff -u --recursive --new-file v2.2.5/linux/net/irda/ircomm/attach.c linux/net/irda/ircomm/attach.c
@@ -1,360 +0,0 @@
-/*********************************************************************
- *
- * Filename: attach.c
- * Version:
- * Description: An implementation of IrCOMM service interface.
- * Status: Experimental.
- * Author: Takahide Higuchi <thiguchi@pluto.dti.ne.jp>
- *
- * Copyright (c) 1998, Takahide Higuchi, <thiguchi@pluto.dti.ne.jp>,
- * All Rights Reserved.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of
- * the License, or (at your option) any later version.
- *
- * I, Takahide Higuchi, provide no warranty for any of this software.
- * This material is provided "AS-IS" and at no charge.
- *
- ********************************************************************/
-
-
-/*
- * ----------------------------------------------------------------------
- * IrIAS related things for IrCOMM
- * If you are to use ircomm layer, use ircomm_attach_cable to
- * setup it and register your program.
- * ----------------------------------------------------------------------
- */
-
-
-#include <linux/sched.h>
-#include <linux/tqueue.h>
-
-#include <net/irda/irlap.h>
-#include <net/irda/irttp.h>
-#include <net/irda/iriap.h>
-#include <net/irda/irias_object.h>
-
-#include <net/irda/ircomm_common.h>
-
-extern struct ircomm_cb **ircomm;
-struct ircomm_cb *discovering_instance;
-
-static void got_lsapsel(struct ircomm_cb * info);
-static void query_lsapsel(struct ircomm_cb * self);
-void ircomm_getvalue_confirm( __u16 obj_id, struct ias_value *value,
- void *priv);
-
-#if 0
-static char *rcsid = "$Id: attach.c,v 1.11 1998/10/22 12:02:20 dagb Exp $";
-#endif
-
-
-/*
- * handler for iriap_getvaluebyclass_request()
- *
- */
-void ircomm_getvalue_confirm( __u16 obj_id, struct ias_value *value,void *priv)
-{
- struct ircomm_cb *self = (struct ircomm_cb *) priv;
-
- ASSERT( self != NULL, return;);
- ASSERT( self->magic == IRCOMM_MAGIC, return;);
-
- /* Check if request succeeded */
- if ( !value) {
- DEBUG( 0, __FUNCTION__ "(), got NULL value!\n");
-
- return;
- }
-
- DEBUG(0, __FUNCTION__"type(%d)\n", value->type);
-
- switch(value->type){
-
- case IAS_OCT_SEQ:
- /*
- * FIXME:we should use data which came here
- * it is used for nothing at this time
- */
-
-#if 1
- DEBUG(0, "octet sequence is:\n");
- {
- int i;
- for ( i=0;i<value->len;i++)
- printk("%02x",
- (int)(*value->t.oct_seq + i) );
- printk("\n");
- }
-#endif
- query_lsapsel(self);
- break;
-
- case IAS_INTEGER:
- /* LsapSel seems to be sent to me */
-
- if ( value->t.integer == -1){
- DEBUG( 0, "ircomm_getvalue_confirm: invalid value!\n");
- return;
- }
- if(self->state == COMM_IDLE){
- self->dlsap = value->t.integer;
- got_lsapsel(self);
- }
- break;
-
- case IAS_STRING:
- DEBUG(0, __FUNCTION__":STRING is not implemented\n");
- DEBUG(0, __FUNCTION__":received string:%s\n", value->t.string);
- query_lsapsel(self); /* experiment */
- break;
-
- case IAS_MISSING:
- DEBUG( 0, __FUNCTION__":MISSING is not implemented\n");
- break;
-
- default:
- DEBUG( 0, __FUNCTION__":unknown type!\n");
- break;
- }
-}
-
-static void got_lsapsel(struct ircomm_cb * self)
-{
- struct notify_t notify;
-
- DEBUG(0, "ircomm:got_lsapsel: got peersap!(%d)\n", self->dlsap );
-
- /* remove tsap for server */
- irttp_close_tsap(self->tsap);
-
- /* create TSAP for initiater ... */
- irda_notify_init(¬ify);
- notify.data_indication = ircomm_accept_data_indication;
- notify.connect_confirm = ircomm_accept_connect_confirm;
- notify.connect_indication = ircomm_accept_connect_indication;
- notify.flow_indication = ircomm_accept_flow_indication;
- notify.disconnect_indication = ircomm_accept_disconnect_indication;
- strncpy( notify.name, "IrCOMM cli", NOTIFY_MAX_NAME);
- notify.instance = self;
-
- self->tsap = irttp_open_tsap(LSAP_ANY, DEFAULT_INITIAL_CREDIT,
- ¬ify);
- ASSERT(self->tsap != NULL, return;);
-
- /*
- * invoke state machine
- * and notify that I'm ready to accept connect_request
- */
-
- ircomm_next_state(self, COMM_IDLE);
- if(self->d_handler)
- self->d_handler(self);
-}
-
-static void query_lsapsel(struct ircomm_cb * self)
-{
- DEBUG(0, "ircomm:query_lsapsel..\n");
-
- /*
- * since we've got Parameters field of IAS, we are to get peersap.
- */
-
- if (!(self->servicetype & THREE_WIRE_RAW)) {
- iriap_getvaluebyclass_request(
- "IrDA:IrCOMM", "IrDA:TinyTP:LsapSel",
- self->saddr, self->daddr,
- ircomm_getvalue_confirm, self );
- } else {
- DEBUG(0, __FUNCTION__ "THREE_WIRE_RAW is not implemented!\n");
- }
-}
-
-
-
-/*
- * ircomm_discovery_indication()
- * Remote device is discovered, try query the remote IAS to see which
- * device it is, and which services it has.
- */
-
-void ircomm_discovery_indication( DISCOVERY *discovery)
-{
- struct ircomm_cb *self;
-
- DEBUG( 0, "ircomm_discovery_indication\n");
-
- self = discovering_instance;
- ASSERT(self != NULL, return;);
- ASSERT(self->magic == IRCOMM_MAGIC, return;);
-
- self->daddr = discovery->daddr;
- self->saddr = discovery->saddr;
-
- DEBUG( 0, "ircomm_discovery_indication:daddr=%08x\n", self->daddr);
-
- /* query "Parameters" attribute of LM-IAS */
-
- DEBUG(0, "ircomm:querying parameters..\n");
-#if 0
- iriap_getvaluebyclass_request(self->daddr, "IrDA:IrCOMM",
- "Parameters",
- ircomm_getvalue_confirm,
- self);
-#else
- query_lsapsel(self);
-#endif
- return;
-}
-
-
-struct ircomm_cb * ircomm_attach_cable( __u8 servicetype,
- struct notify_t notify,
- void *handler )
-{
- int i;
- struct ircomm_cb *self = NULL;
- struct notify_t server_notify;
- struct ias_object* obj;
-
- /* FIXME: it should not be hard coded */
- __u8 oct_seq[6] = { 0,1,4,1,1,1 };
-
- ASSERT(ircomm != NULL,return NULL;);
- DEBUG(0,"ircomm_attach_cable:\n");
-
-
- /* find free handle */
-
- for(i = 0; i < IRCOMM_MAX_CONNECTION; i++){
- ASSERT(ircomm[i] != NULL,return(NULL););
- if(!ircomm[i]->in_use){
- self = ircomm[i];
- break;
- }
- }
-
- if (!self){
- DEBUG(0,"ircomm_attach_cable:no free handle!\n");
- return (NULL);
- }
-
- self->in_use = 1;
- self->servicetype = servicetype;
-
- DEBUG(0,"attach_cable:servicetype:%d\n",servicetype);
- self->d_handler = handler;
- self->notify = notify;
-
- /* register server.. */
-
- /*
- * TODO: since server TSAP is currentry hard coded,
- * we can use *only one* IrCOMM connection.
- * We have to create one more TSAP and register IAS entry dynamically
- * each time when we are to allocate new server here.
- */
- irda_notify_init(&server_notify);
- server_notify.data_indication = ircomm_accept_data_indication;
- server_notify.connect_confirm = ircomm_accept_connect_confirm;
- server_notify.connect_indication = ircomm_accept_connect_indication;
- server_notify.flow_indication = ircomm_accept_flow_indication;
- server_notify.disconnect_indication = ircomm_accept_disconnect_indication;
- server_notify.instance = self;
- strncpy( server_notify.name, "IrCOMM srv", NOTIFY_MAX_NAME);
-
- self->tsap = irttp_open_tsap(LSAP_ANY, DEFAULT_INITIAL_CREDIT,
- &server_notify);
- if(!self->tsap){
- DEBUG(0,"ircomm:Sorry, failed to allocate server_tsap\n");
- return NULL;
- }
-
- /*
- * Register with LM-IAS
- */
- obj = irias_new_object( "IrDA:IrCOMM", IAS_IRCOMM_ID);
- irias_add_integer_attrib( obj, "IrDA:TinyTP:LsapSel",
- self->tsap->stsap_sel );
-
- /* FIXME: it should not be hard coded */
-
- irias_add_octseq_attrib( obj, "Parameters",
- &oct_seq[0], 6);
- irias_insert_object( obj);
-
-/* obj = irias_new_object( "IrDA:IrCOMM", IAS_IRCOMM_ID); */
-/* irias_add_octseq_attrib( obj, "Parameters", len, &octseq); */
-/* irias_insert_object( obj); */
-
-
-
- /* and start discovering .. */
- discovering_instance = self;
-
- switch(servicetype){
- case NINE_WIRE:
- DEBUG(0,"ircomm_attach_cable:discovering..\n");
- irlmp_register_layer(S_COMM , CLIENT|SERVER, TRUE,
- ircomm_discovery_indication);
- break;
-
-/* case CENTRONICS: */
-/* case THREE_WIRE: */
-/* case THREE_WIRE_RAW: */
-
- default:
- DEBUG(0,"ircomm_attach_cable:requested servicetype is not "
- "implemented!\n");
- return NULL;
- }
-
- ircomm_next_state(self, COMM_IDLE);
- return (self);
-}
-
-int ircomm_detach_cable(struct ircomm_cb *self)
-{
- ASSERT( self != NULL, return -EIO;);
- ASSERT( self->magic == IRCOMM_MAGIC, return -EIO;);
-
- DEBUG(0,"ircomm_detach_cable:\n");
-
- /* shutdown ircomm layer */
- if(self->state != COMM_IDLE ){
- DEBUG(0,"ircomm:detach_cable:not IDLE\n");
- if(self->state != COMM_WAITI)
- ircomm_disconnect_request(self, NULL);
- }
-
-
- switch(self->servicetype){
-/* case CENTRONICS: */
- case NINE_WIRE:
-/* case THREE_WIRE: */
- irlmp_unregister_layer( S_COMM, CLIENT|SERVER );
- break;
-
-/* case THREE_WIRE_RAW: */
-/* irlmp_unregister( S_COMM ) */
-/* irlmp_unregister( S_PRINTER) */
-/* break; */
-
- default:
- DEBUG(0,"ircomm_detach_cable:requested servicetype is not "
- "implemented!\n");
- return -ENODEV;
- }
-
- /* remove tsaps */
- if(self->tsap)
- irttp_close_tsap(self->tsap);
-
- self->tsap = NULL;
- self->in_use = 0;
-
- return 0;
-}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)