⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 irlan_client.c

📁 linux 内核源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
static void irlan_client_ctrl_connect_confirm(void *instance, void *sap,					      struct qos_info *qos,					      __u32 max_sdu_size,					      __u8 max_header_size,					      struct sk_buff *skb){	struct irlan_cb *self;	IRDA_DEBUG(4, "%s()\n", __FUNCTION__ );	self = (struct irlan_cb *) instance;	IRDA_ASSERT(self != NULL, return;);	IRDA_ASSERT(self->magic == IRLAN_MAGIC, return;);	self->client.max_sdu_size = max_sdu_size;	self->client.max_header_size = max_header_size;	/* TODO: we could set the MTU depending on the max_sdu_size */	irlan_do_client_event(self, IRLAN_CONNECT_COMPLETE, NULL);}/* * Function print_ret_code (code) * *    Print return code of request to peer IrLAN layer. * */static void print_ret_code(__u8 code){	switch(code) {	case 0:		printk(KERN_INFO "Success\n");		break;	case 1:		IRDA_WARNING("IrLAN: Insufficient resources\n");		break;	case 2:		IRDA_WARNING("IrLAN: Invalid command format\n");		break;	case 3:		IRDA_WARNING("IrLAN: Command not supported\n");		break;	case 4:		IRDA_WARNING("IrLAN: Parameter not supported\n");		break;	case 5:		IRDA_WARNING("IrLAN: Value not supported\n");		break;	case 6:		IRDA_WARNING("IrLAN: Not open\n");		break;	case 7:		IRDA_WARNING("IrLAN: Authentication required\n");		break;	case 8:		IRDA_WARNING("IrLAN: Invalid password\n");		break;	case 9:		IRDA_WARNING("IrLAN: Protocol error\n");		break;	case 255:		IRDA_WARNING("IrLAN: Asynchronous status\n");		break;	}}/* * Function irlan_client_parse_response (self, skb) * *    Extract all parameters from received buffer, then feed them to *    check_params for parsing */void irlan_client_parse_response(struct irlan_cb *self, struct sk_buff *skb){	__u8 *frame;	__u8 *ptr;	int count;	int ret;	__u16 val_len;	int i;	char *name;	char *value;	IRDA_ASSERT(skb != NULL, return;);	IRDA_DEBUG(4, "%s() skb->len=%d\n", __FUNCTION__ , (int) skb->len);	IRDA_ASSERT(self != NULL, return;);	IRDA_ASSERT(self->magic == IRLAN_MAGIC, return;);	if (!skb) {		IRDA_ERROR("%s(), Got NULL skb!\n", __FUNCTION__);		return;	}	frame = skb->data;	/*	 *  Check return code and print it if not success	 */	if (frame[0]) {		print_ret_code(frame[0]);		return;	}	name = kmalloc(255, GFP_ATOMIC);	if (!name)		return;	value = kmalloc(1016, GFP_ATOMIC);	if (!value) {		kfree(name);		return;	}	/* How many parameters? */	count = frame[1];	IRDA_DEBUG(4, "%s(), got %d parameters\n", __FUNCTION__ , count);	ptr = frame+2;	/* For all parameters */	for (i=0; i<count;i++) {		ret = irlan_extract_param(ptr, name, value, &val_len);		if (ret < 0) {			IRDA_DEBUG(2, "%s(), IrLAN, Error!\n", __FUNCTION__ );			break;		}		ptr += ret;		irlan_check_response_param(self, name, value, val_len);	}	/* Cleanup */	kfree(name);	kfree(value);}/* * Function irlan_check_response_param (self, param, value, val_len) * *     Check which parameter is received and update local variables * */static void irlan_check_response_param(struct irlan_cb *self, char *param,				       char *value, int val_len){	__u16 tmp_cpu; /* Temporary value in host order */	__u8 *bytes;	int i;	DECLARE_MAC_BUF(mac);	IRDA_DEBUG(4, "%s(), parm=%s\n", __FUNCTION__ , param);	IRDA_ASSERT(self != NULL, return;);	IRDA_ASSERT(self->magic == IRLAN_MAGIC, return;);	/* Media type */	if (strcmp(param, "MEDIA") == 0) {		if (strcmp(value, "802.3") == 0)			self->media = MEDIA_802_3;		else			self->media = MEDIA_802_5;		return;	}	if (strcmp(param, "FILTER_TYPE") == 0) {		if (strcmp(value, "DIRECTED") == 0)			self->client.filter_type |= IRLAN_DIRECTED;		else if (strcmp(value, "FUNCTIONAL") == 0)			self->client.filter_type |= IRLAN_FUNCTIONAL;		else if (strcmp(value, "GROUP") == 0)			self->client.filter_type |= IRLAN_GROUP;		else if (strcmp(value, "MAC_FRAME") == 0)			self->client.filter_type |= IRLAN_MAC_FRAME;		else if (strcmp(value, "MULTICAST") == 0)			self->client.filter_type |= IRLAN_MULTICAST;		else if (strcmp(value, "BROADCAST") == 0)			self->client.filter_type |= IRLAN_BROADCAST;		else if (strcmp(value, "IPX_SOCKET") == 0)			self->client.filter_type |= IRLAN_IPX_SOCKET;	}	if (strcmp(param, "ACCESS_TYPE") == 0) {		if (strcmp(value, "DIRECT") == 0)			self->client.access_type = ACCESS_DIRECT;		else if (strcmp(value, "PEER") == 0)			self->client.access_type = ACCESS_PEER;		else if (strcmp(value, "HOSTED") == 0)			self->client.access_type = ACCESS_HOSTED;		else {			IRDA_DEBUG(2, "%s(), unknown access type!\n", __FUNCTION__ );		}	}	/* IRLAN version */	if (strcmp(param, "IRLAN_VER") == 0) {		IRDA_DEBUG(4, "IrLAN version %d.%d\n", (__u8) value[0],		      (__u8) value[1]);		self->version[0] = value[0];		self->version[1] = value[1];		return;	}	/* Which remote TSAP to use for data channel */	if (strcmp(param, "DATA_CHAN") == 0) {		self->dtsap_sel_data = value[0];		IRDA_DEBUG(4, "Data TSAP = %02x\n", self->dtsap_sel_data);		return;	}	if (strcmp(param, "CON_ARB") == 0) {		memcpy(&tmp_cpu, value, 2); /* Align value */		le16_to_cpus(&tmp_cpu);     /* Convert to host order */		self->client.recv_arb_val = tmp_cpu;		IRDA_DEBUG(2, "%s(), receive arb val=%d\n", __FUNCTION__ ,			   self->client.recv_arb_val);	}	if (strcmp(param, "MAX_FRAME") == 0) {		memcpy(&tmp_cpu, value, 2); /* Align value */		le16_to_cpus(&tmp_cpu);     /* Convert to host order */		self->client.max_frame = tmp_cpu;		IRDA_DEBUG(4, "%s(), max frame=%d\n", __FUNCTION__ ,			   self->client.max_frame);	}	/* RECONNECT_KEY, in case the link goes down! */	if (strcmp(param, "RECONNECT_KEY") == 0) {		IRDA_DEBUG(4, "Got reconnect key: ");		/* for (i = 0; i < val_len; i++) *//* 			printk("%02x", value[i]); */		memcpy(self->client.reconnect_key, value, val_len);		self->client.key_len = val_len;		IRDA_DEBUG(4, "\n");	}	/* FILTER_ENTRY, have we got an ethernet address? */	if (strcmp(param, "FILTER_ENTRY") == 0) {		bytes = value;		IRDA_DEBUG(4, "Ethernet address = %s\n",			   print_mac(mac, bytes));		for (i = 0; i < 6; i++)			self->dev->dev_addr[i] = bytes[i];	}}/* * Function irlan_client_get_value_confirm (obj_id, value) * *    Got results from remote LM-IAS * */void irlan_client_get_value_confirm(int result, __u16 obj_id,				    struct ias_value *value, void *priv){	struct irlan_cb *self;	IRDA_DEBUG(4, "%s()\n", __FUNCTION__ );	IRDA_ASSERT(priv != NULL, return;);	self = (struct irlan_cb *) priv;	IRDA_ASSERT(self->magic == IRLAN_MAGIC, return;);	/* We probably don't need to make any more queries */	iriap_close(self->client.iriap);	self->client.iriap = NULL;	/* Check if request succeeded */	if (result != IAS_SUCCESS) {		IRDA_DEBUG(2, "%s(), got NULL value!\n", __FUNCTION__ );		irlan_do_client_event(self, IRLAN_IAS_PROVIDER_NOT_AVAIL,				      NULL);		return;	}	switch (value->type) {	case IAS_INTEGER:		self->dtsap_sel_ctrl = value->t.integer;		if (value->t.integer != -1) {			irlan_do_client_event(self, IRLAN_IAS_PROVIDER_AVAIL,					      NULL);			return;		}		irias_delete_value(value);		break;	default:		IRDA_DEBUG(2, "%s(), unknown type!\n", __FUNCTION__ );		break;	}	irlan_do_client_event(self, IRLAN_IAS_PROVIDER_NOT_AVAIL, NULL);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -