📄 irlan_client.c
字号:
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 + -