📄 i2o_proc.c
字号:
"AUI", "10BASE5", "FIORL", "10BASE2", "10BROAD36", "10BASE-T", "10BASE-FP", "10BASE-FB", "10BASE-FL", "100BASE-TX", "100BASE-FX", "100BASE-T4", "1000BASE-SX", "1000BASE-LX", "1000BASE-CX", "1000BASE-T", "100VG-ETHERNET", "100VG-TOKEN RING", "4MBIT TOKEN RING", "16 Mb Token Ring", "125 MBAUD FDDI", "Point-to-point", "Arbitrated loop", "Public loop", "Fabric", "Emulation", "Other", "HW default" }; switch(conn) { case I2O_LAN_UNKNOWN: idx = 0; break; case I2O_LAN_AUI: idx = 1; break; case I2O_LAN_10BASE5: idx = 2; break; case I2O_LAN_FIORL: idx = 3; break; case I2O_LAN_10BASE2: idx = 4; break; case I2O_LAN_10BROAD36: idx = 5; break; case I2O_LAN_10BASE_T: idx = 6; break; case I2O_LAN_10BASE_FP: idx = 7; break; case I2O_LAN_10BASE_FB: idx = 8; break; case I2O_LAN_10BASE_FL: idx = 9; break; case I2O_LAN_100BASE_TX: idx = 10; break; case I2O_LAN_100BASE_FX: idx = 11; break; case I2O_LAN_100BASE_T4: idx = 12; break; case I2O_LAN_1000BASE_SX: idx = 13; break; case I2O_LAN_1000BASE_LX: idx = 14; break; case I2O_LAN_1000BASE_CX: idx = 15; break; case I2O_LAN_1000BASE_T: idx = 16; break; case I2O_LAN_100VG_ETHERNET: idx = 17; break; case I2O_LAN_100VG_TR: idx = 18; break; case I2O_LAN_4MBIT: idx = 19; break; case I2O_LAN_16MBIT: idx = 20; break; case I2O_LAN_125MBAUD: idx = 21; break; case I2O_LAN_POINT_POINT: idx = 22; break; case I2O_LAN_ARB_LOOP: idx = 23; break; case I2O_LAN_PUBLIC_LOOP: idx = 24; break; case I2O_LAN_FABRIC: idx = 25; break; case I2O_LAN_EMULATION: idx = 26; break; case I2O_LAN_OTHER: idx = 27; break; case I2O_LAN_DEFAULT: idx = 28; break; } return i2o_connection_type[idx];}/* LAN group 0000h - Device info (scalar) */int i2o_proc_read_lan_dev_info(char *buf, char **start, off_t offset, int len, int *eof, void *data){ struct i2o_device *d = (struct i2o_device*)data; static u32 work32[56]; static u8 *work8 = (u8*)work32; static u16 *work16 = (u16*)work32; static u64 *work64 = (u64*)work32; int token; spin_lock(&i2o_proc_lock); len = 0; token = i2o_query_scalar(d->controller, d->lct_data.tid, 0x0000, -1, &work32, 56*4); if (token < 0) { len += i2o_report_query_status(buf+len, token, "0x0000 LAN Device Info"); spin_unlock(&i2o_proc_lock); return len; } len += sprintf(buf, "LAN Type : "); switch (work16[0]) { case 0x0030: len += sprintf(buf+len, "Ethernet, "); break; case 0x0040: len += sprintf(buf+len, "100Base VG, "); break; case 0x0050: len += sprintf(buf+len, "Token Ring, "); break; case 0x0060: len += sprintf(buf+len, "FDDI, "); break; case 0x0070: len += sprintf(buf+len, "Fibre Channel, "); break; default: len += sprintf(buf+len, "Unknown type (0x%04x), ", work16[0]); break; } if (work16[1]&0x00000001) len += sprintf(buf+len, "emulated LAN, "); else len += sprintf(buf+len, "physical LAN port, "); if (work16[1]&0x00000002) len += sprintf(buf+len, "full duplex\n"); else len += sprintf(buf+len, "simplex\n"); len += sprintf(buf+len, "Address format : "); switch(work8[4]) { case 0x00: len += sprintf(buf+len, "IEEE 48bit\n"); break; case 0x01: len += sprintf(buf+len, "FC IEEE\n"); break; default: len += sprintf(buf+len, "Unknown (0x%02x)\n", work8[4]); break; } len += sprintf(buf+len, "State : "); switch(work8[5]) { case 0x00: len += sprintf(buf+len, "Unknown\n"); break; case 0x01: len += sprintf(buf+len, "Unclaimed\n"); break; case 0x02: len += sprintf(buf+len, "Operational\n"); break; case 0x03: len += sprintf(buf+len, "Suspended\n"); break; case 0x04: len += sprintf(buf+len, "Resetting\n"); break; case 0x05: len += sprintf(buf+len, "ERROR: "); if(work16[3]&0x0001) len += sprintf(buf+len, "TxCU inoperative "); if(work16[3]&0x0002) len += sprintf(buf+len, "RxCU inoperative "); if(work16[3]&0x0004) len += sprintf(buf+len, "Local mem alloc "); len += sprintf(buf+len, "\n"); break; case 0x06: len += sprintf(buf+len, "Operational no Rx\n"); break; case 0x07: len += sprintf(buf+len, "Suspended no Rx\n"); break; default: len += sprintf(buf+len, "Unspecified\n"); break; } len += sprintf(buf+len, "Min packet size : %d\n", work32[2]); len += sprintf(buf+len, "Max packet size : %d\n", work32[3]); len += sprintf(buf+len, "HW address : " "%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X\n", work8[16],work8[17],work8[18],work8[19], work8[20],work8[21],work8[22],work8[23]); len += sprintf(buf+len, "Max Tx wire speed : %d bps\n", (int)work64[3]); len += sprintf(buf+len, "Max Rx wire speed : %d bps\n", (int)work64[4]); len += sprintf(buf+len, "Min SDU packet size : 0x%08x\n", work32[10]); len += sprintf(buf+len, "Max SDU packet size : 0x%08x\n", work32[11]); spin_unlock(&i2o_proc_lock); return len;}/* LAN group 0001h - MAC address table (scalar) */int i2o_proc_read_lan_mac_addr(char *buf, char **start, off_t offset, int len, int *eof, void *data){ struct i2o_device *d = (struct i2o_device*)data; static u32 work32[48]; static u8 *work8 = (u8*)work32; int token; spin_lock(&i2o_proc_lock); len = 0; token = i2o_query_scalar(d->controller, d->lct_data.tid, 0x0001, -1, &work32, 48*4); if (token < 0) { len += i2o_report_query_status(buf+len, token,"0x0001 LAN MAC Address"); spin_unlock(&i2o_proc_lock); return len; } len += sprintf(buf, "Active address : " "%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X\n", work8[0],work8[1],work8[2],work8[3], work8[4],work8[5],work8[6],work8[7]); len += sprintf(buf+len, "Current address : " "%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X\n", work8[8],work8[9],work8[10],work8[11], work8[12],work8[13],work8[14],work8[15]); len += sprintf(buf+len, "Functional address mask : " "%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X\n", work8[16],work8[17],work8[18],work8[19], work8[20],work8[21],work8[22],work8[23]); len += sprintf(buf+len,"HW/DDM capabilities : 0x%08x\n", work32[7]); len += sprintf(buf+len," [%s] Unicast packets supported\n", (work32[7]&0x00000001)?"+":"-"); len += sprintf(buf+len," [%s] Promiscuous mode supported\n", (work32[7]&0x00000002)?"+":"-"); len += sprintf(buf+len," [%s] Promiscuous multicast mode supported\n", (work32[7]&0x00000004)?"+":"-"); len += sprintf(buf+len," [%s] Broadcast reception disabling supported\n", (work32[7]&0x00000100)?"+":"-"); len += sprintf(buf+len," [%s] Multicast reception disabling supported\n", (work32[7]&0x00000200)?"+":"-"); len += sprintf(buf+len," [%s] Functional address disabling supported\n", (work32[7]&0x00000400)?"+":"-"); len += sprintf(buf+len," [%s] MAC reporting supported\n", (work32[7]&0x00000800)?"+":"-"); len += sprintf(buf+len,"Filter mask : 0x%08x\n", work32[6]); len += sprintf(buf+len," [%s] Unicast packets disable\n", (work32[6]&0x00000001)?"+":"-"); len += sprintf(buf+len," [%s] Promiscuous mode enable\n", (work32[6]&0x00000002)?"+":"-"); len += sprintf(buf+len," [%s] Promiscuous multicast mode enable\n", (work32[6]&0x00000004)?"+":"-"); len += sprintf(buf+len," [%s] Broadcast packets disable\n", (work32[6]&0x00000100)?"+":"-"); len += sprintf(buf+len," [%s] Multicast packets disable\n", (work32[6]&0x00000200)?"+":"-"); len += sprintf(buf+len," [%s] Functional address disable\n", (work32[6]&0x00000400)?"+":"-"); if (work32[7]&0x00000800) { len += sprintf(buf+len, " MAC reporting mode : "); if (work32[6]&0x00000800) len += sprintf(buf+len, "Pass only priority MAC packets to user\n"); else if (work32[6]&0x00001000) len += sprintf(buf+len, "Pass all MAC packets to user\n"); else if (work32[6]&0x00001800) len += sprintf(buf+len, "Pass all MAC packets (promiscuous) to user\n"); else len += sprintf(buf+len, "Do not pass MAC packets to user\n"); } len += sprintf(buf+len, "Number of multicast addresses : %d\n", work32[8]); len += sprintf(buf+len, "Perfect filtering for max %d multicast addresses\n", work32[9]); len += sprintf(buf+len, "Imperfect filtering for max %d multicast addresses\n", work32[10]); spin_unlock(&i2o_proc_lock); return len;}/* LAN group 0002h - Multicast MAC address table (table) */int i2o_proc_read_lan_mcast_addr(char *buf, char **start, off_t offset, int len, int *eof, void *data){ struct i2o_device *d = (struct i2o_device*)data; int token; int i; u8 mc_addr[8]; struct { u16 result_count; u16 pad; u16 block_size; u8 block_status; u8 error_info_size; u16 row_count; u16 more_flag; u8 mc_addr[256][8]; } result; spin_lock(&i2o_proc_lock); len = 0; token = i2o_query_table(I2O_PARAMS_TABLE_GET, d->controller, d->lct_data.tid, 0x0002, -1, NULL, 0, &result, sizeof(result)); if (token < 0) { len += i2o_report_query_status(buf+len, token,"0x002 LAN Multicast MAC Address"); spin_unlock(&i2o_proc_lock); return len; } for (i = 0; i < result.row_count; i++) { memcpy(mc_addr, result.mc_addr[i], 8); len += sprintf(buf+len, "MC MAC address[%d]: " "%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X\n", i, mc_addr[0], mc_addr[1], mc_addr[2], mc_addr[3], mc_addr[4], mc_addr[5], mc_addr[6], mc_addr[7]); } spin_unlock(&i2o_proc_lock); return len;}/* LAN group 0003h - Batch Control (scalar) */int i2o_proc_read_lan_batch_control(char *buf, char **start, off_t offset, int len, int *eof, void *data){ struct i2o_device *d = (struct i2o_device*)data; static u32 work32[9]; int token; spin_lock(&i2o_proc_lock); len = 0; token = i2o_query_scalar(d->controller, d->lct_data.tid, 0x0003, -1, &work32, 9*4); if (token < 0) { len += i2o_report_query_status(buf+len, token,"0x0003 LAN Batch Control"); spin_unlock(&i2o_proc_lock); return len; } len += sprintf(buf, "Batch mode "); if (work32[0]&0x00000001) len += sprintf(buf+len, "disabled"); else len += sprintf(buf+len, "enabled"); if (work32[0]&0x00000002) len += sprintf(buf+len, " (current setting)"); if (work32[0]&0x00000004) len += sprintf(buf+len, ", forced"); else len += sprintf(buf+len, ", toggle"); len += sprintf(buf+len, "\n"); len += sprintf(buf+len, "Max Rx batch count : %d\n", work32[5]); len += sprintf(buf+len, "Max Rx batch delay : %d\n", work32[6]); len += sprintf(buf+len, "Max Tx batch delay : %d\n", work32[7]); len += sprintf(buf+len, "Max Tx batch count : %d\n", work32[8]); spin_unlock(&i2o_proc_lock); return len;}/* LAN group 0004h - LAN Operation (scalar) */int i2o_proc_read_lan_operation(char *buf, char **start, off_t offset, int len, int *eof, void *data){ struct i2o_device *d = (struct i2o_device*)data; static u32 work32[5]; int token; spin_lock(&i2o_proc_lock); len = 0; token = i2o_query_scalar(d->controller, d->lct_data.tid, 0x0004, -1, &work32, 20); if (token < 0) { len += i2o_report_query_status(buf+len, token,"0x0004 LAN Operation"); spin_unlock(&i2o_proc_lock); return len; } len += sprintf(buf, "Packet prepadding (32b words) : %d\n", work32[0]); len += sprintf(buf+len, "Transmission error reporting : %s\n", (work32[1]&1)?"on":"off"); len += sprintf(buf+len, "Bad packet handling : %s\n", (work32[1]&0x2)?"by host":"by DDM"); len += sprintf(buf+len, "Packet orphan limit : %d\n", work32[2]); len += sprintf(buf+len, "Tx modes : 0x%08x\n", work32[3]); len += sprintf(buf+len, " [%s] HW CRC suppression\n", (work32[3]&0x00000004) ? "+" : "-"); len += sprintf(buf+len, " [%s] HW IPv4 checksum\n", (work32[3]&0x00000100) ? "+" : "-"); len += sprintf(buf+len, " [%s] HW TCP checksum\n", (work32[3]&0x00000200) ? "+" : "-"); len += sprintf(buf+len, " [%s] HW UDP checksum\n", (work32[3]&0x00000400) ? "+" : "-"); len += sprintf(buf+len, " [%s] HW RSVP checksum\n", (work32[3]&0x00000800) ? "+" : "-"); len += sprintf(buf+len, " [%s] HW ICMP checksum\n", (work32[3]&0x00001000) ? "+" : "-"); len += sprintf(buf+len, " [%s] Loopback suppression enable\n", (work32[3]&0x00002000) ? "+" : "-"); len += sprintf(buf+len, "Rx modes : 0x%08x\n", work32[4]); len += sprintf(buf+len, " [%s] FCS in payload\n", (work32[4]&0x00000004) ? "+" : "-"); len += sprintf(buf+len, " [%s] HW IPv4 checksum validation\n", (work32[4]&0x00000100) ? "+" : "-"); len += sprintf(buf+len, " [%s] HW TCP checksum validation\n", (work32[4]&0x00000200) ? "+" : "-"); len += sprintf(buf+len, " [%s] HW UDP checksum validation\n", (work32[4]&0x00000400) ? "+" : "-"); len += sprintf(buf+len, " [%s] HW RSVP checksum validation\n", (wor
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -