📄 rcif.h
字号:
/*** ******************************************************************************* R C I F . H****** RedCreek InterFace include file.**** ---------------------------------------------------------------------** --- Copyright (c) 1998-1999, RedCreek Communications Inc. ---** --- All rights reserved. ---** ---------------------------------------------------------------------**** File Description:**** Header file private ioctl commands.****** 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.** This program is distributed in the hope that it will be useful,** but WITHOUT ANY WARRANTY; without even the implied warranty of** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the** GNU General Public License for more details.** You should have received a copy of the GNU General Public License** along with this program; if not, write to the Free Software** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.** **************************************************************************/#ifndef RCIF_H#define RCIF_H/* The following protocol revision # should be incremented every time a new protocol or new structures are used in this file. */int USER_PROTOCOL_REV = 2; /* used to track different protocol revisions *//* define a single TCB & buffer */typedef struct /* a single buffer */{ U32 context; /* context */ U32 scount; /* segment count */ U32 size; /* segment size */ U32 addr; /* segment physical address */}__attribute__((packed))singleB, *psingleB ;typedef struct /* a single TCB */{ /* ** +-----------------------+ ** | 1 | one buffer in the TCB ** +-----------------------+ ** | <user's Context> | user's buffer reference ** +-----------------------+ ** | 1 | one segment buffer ** +-----------------------+ _ ** | <buffer size> | size \ ** +-----------------------+ \ segment descriptor ** | <physical address> | physical address of buffer / ** +-----------------------+ _/ */ U32 bcount; /* buffer count */ singleB b; /* buffer */}__attribute__((packed))singleTCB, *psingleTCB;/* When adding new entries, please add all 5 related changes, since it helps keep everything consistent: 1) User structure entry 2) User data entry 3) Structure short-cut entry 4) Data short-cut entry 5) Command identifier entry For Example ("GETSPEED"): 1) struct RCgetspeed_tag { U32 LinkSpeedCode; } RCgetspeed; 2) struct RCgetspeed_tag *getspeed; 3) #define RCUS_GETSPEED data.RCgetspeed; 4) #define RCUD_GETSPEED _RC_user_data.getspeed 5) #define RCUC_GETSPEED 0x02 Notes for the "GETSPEED" entry, above: 1) RCgetspeed - RC{name} RCgetspeed_tag - RC{name}_tag LinkSpeedCode - create any structure format desired (not too large, since memory will be unioned with all other entries) 2) RCgetspeed_tag - RC{name}_tag chosen in #1 getspeed - arbitrary name (ptr to structure in #1) 3) RCUS_GETSPEED - RCUS_{NAME} ("NAME" & "name" do not have to the same) data.RCgetspeed - data.RC{name} ("RC{name}" from #1) 4) RCUD_GETSPEED - _RC_user_data.getspeed ("getspeed" from #2) 5) RCUC_GETSPEED - unique hex identifier entry.*/typedef struct RC_user_tag RCuser_struct;/* 1) User structure entry */struct RC_user_tag{ int cmd; union { /* GETINFO structure */ struct RCgetinfo_tag { unsigned long int mem_start; unsigned long int mem_end; unsigned long int base_addr; unsigned char irq; unsigned char dma; unsigned char port; } RCgetinfo; /* <---- RCgetinfo */ /* GETSPEED structure */ struct RCgetspeed_tag { U32 LinkSpeedCode; } RCgetspeed; /* <---- RCgetspeed */ /* SETSPEED structure */ struct RCsetspeed_tag { U16 LinkSpeedCode; } RCsetspeed; /* <---- RCsetspeed */ /* GETPROM structure */ struct RCgetprom_tag { U32 PromMode; } RCgetprom; /* <---- RCgetprom */ /* SETPROM structure */ struct RCsetprom_tag { U16 PromMode; } RCsetprom; /* <---- RCsetprom */ /* GETBROADCAST structure */ struct RCgetbroadcast_tag { U32 BroadcastMode; } RCgetbroadcast; /* <---- RCgetbroadcast */ /* SETBROADCAST structure */ struct RCsetbroadcast_tag { U16 BroadcastMode; } RCsetbroadcast; /* <---- RCsetbroadcast */ /* GETFIRMWAREVER structure */ #define FirmStringLen 80 struct RCgetfwver_tag { U8 FirmString[FirmStringLen]; } RCgetfwver; /* <---- RCgetfwver */ /* GETIPANDMASK structure */ struct RCgetipnmask_tag { U32 IpAddr; U32 NetMask; } RCgetipandmask; /* <---- RCgetipandmask */ /* SETIPANDMASK structure */ struct RCsetipnmask_tag { U32 IpAddr; U32 NetMask; } RCsetipandmask; /* <---- RCsetipandmask */ /* GETMAC structure */ #define MAC_SIZE 10 struct RCgetmac_tag { U8 mac[MAC_SIZE]; } RCgetmac; /* <---- RCgetmac */ /* SETMAC structure */ struct RCsetmac_tag { U8 mac[MAC_SIZE]; } RCsetmac; /* <---- RCsetmac */ /* GETLINKSTATUS structure */ struct RCgetlnkstatus_tag { U32 ReturnStatus; } RCgetlnkstatus; /* <---- RCgetlnkstatus */ /* GETLINKSTATISTICS structure */ struct RCgetlinkstats_tag { RCLINKSTATS StatsReturn; } RCgetlinkstats; /* <---- RCgetlinkstats */ /* DEFAULT structure (when no command was recognized) */ struct RCdefault_tag { int rc; } RCdefault; /* <---- RCdefault */ } data;}; /* struct RC_user_tag { ... } *//* 2) User data entry *//* RCUD = RedCreek User Data */union RC_user_data_tag { /* structure tags used are taken from RC_user_tag structure above */ struct RCgetinfo_tag *getinfo; struct RCgetspeed_tag *getspeed; struct RCgetprom_tag *getprom; struct RCgetbroadcast_tag *getbroadcast; struct RCgetfwver_tag *getfwver; struct RCgetipnmask_tag *getipandmask; struct RCgetmac_tag *getmac; struct RCgetlnkstatus_tag *getlinkstatus; struct RCgetlinkstats_tag *getlinkstatistics; struct RCdefault_tag *rcdefault; struct RCsetspeed_tag *setspeed; struct RCsetprom_tag *setprom; struct RCsetbroadcast_tag *setbroadcast; struct RCsetipnmask_tag *setipandmask; struct RCsetmac_tag *setmac;} _RC_user_data; /* declare as a global, so the defines below will work *//* 3) Structure short-cut entry *//* define structure short-cuts */ /* structure names are taken from RC_user_tag structure above */#define RCUS_GETINFO data.RCgetinfo;#define RCUS_GETSPEED data.RCgetspeed;#define RCUS_GETPROM data.RCgetprom;#define RCUS_GETBROADCAST data.RCgetbroadcast;#define RCUS_GETFWVER data.RCgetfwver;#define RCUS_GETIPANDMASK data.RCgetipandmask;#define RCUS_GETMAC data.RCgetmac;#define RCUS_GETLINKSTATUS data.RCgetlnkstatus;#define RCUS_GETLINKSTATISTICS data.RCgetlinkstats;#define RCUS_DEFAULT data.RCdefault;#define RCUS_SETSPEED data.RCsetspeed;#define RCUS_SETPROM data.RCsetprom;#define RCUS_SETBROADCAST data.RCsetbroadcast;#define RCUS_SETIPANDMASK data.RCsetipandmask;#define RCUS_SETMAC data.RCsetmac;/* 4) Data short-cut entry *//* define data short-cuts */ /* pointer names are from RC_user_data_tag union (just below RC_user_tag) */#define RCUD_GETINFO _RC_user_data.getinfo#define RCUD_GETSPEED _RC_user_data.getspeed#define RCUD_GETPROM _RC_user_data.getprom#define RCUD_GETBROADCAST _RC_user_data.getbroadcast#define RCUD_GETFWVER _RC_user_data.getfwver#define RCUD_GETIPANDMASK _RC_user_data.getipandmask#define RCUD_GETMAC _RC_user_data.getmac#define RCUD_GETLINKSTATUS _RC_user_data.getlinkstatus#define RCUD_GETLINKSTATISTICS _RC_user_data.getlinkstatistics#define RCUD_DEFAULT _RC_user_data.rcdefault#define RCUD_SETSPEED _RC_user_data.setspeed#define RCUD_SETPROM _RC_user_data.setprom#define RCUD_SETBROADCAST _RC_user_data.setbroadcast#define RCUD_SETIPANDMASK _RC_user_data.setipandmask#define RCUD_SETMAC _RC_user_data.setmac/* 5) Command identifier entry *//* define command identifiers */#define RCUC_GETINFO 0x01#define RCUC_GETSPEED 0x02#define RCUC_GETFWVER 0x03#define RCUC_GETIPANDMASK 0x04#define RCUC_GETMAC 0x05#define RCUC_GETLINKSTATUS 0x06#define RCUC_GETLINKSTATISTICS 0x07#define RCUC_GETPROM 0x14#define RCUC_GETBROADCAST 0x15#define RCUC_DEFAULT 0xff#define RCUC_SETSPEED 0x08#define RCUC_SETIPANDMASK 0x09#define RCUC_SETMAC 0x0a#define RCUC_SETPROM 0x16#define RCUC_SETBROADCAST 0x17/* define ioctl commands to use, when talking to RC 45/PCI driver */#define RCU_PROTOCOL_REV SIOCDEVPRIVATE#define RCU_COMMAND SIOCDEVPRIVATE+1/* Intended use for the above defines is shown below (GETINFO, as this example): RCuser_struct RCuser; // declare RCuser structure struct ifreq ifr; // declare an interface request structure RCuser.cmd = RCUC_GETINFO; // set user command to GETINFO ifr->ifr_data = (caddr_t) &RCuser; // set point to user structure sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); // get a socket ioctl(sock, RCU_COMMAND, &ifr); // do ioctl on socket RCUD_GETINFO = &RCuser.RCUS_GETINFO; // set data pointer for GETINFO // print results printf("memory 0x%lx-0x%lx, base address 0x%x, irq 0x%x\n", RCUD_GETINFO->mem_start, RCUD_GETINFO->mem_end, RCUD_GETINFO->base_addr, RCUD_GETINFO->irq);*/#endif /* RCIF_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -