ioctl 细节

dlpi 驱动程序支持 ioctl 操作。

dlpi 驱动程序支持以下 ioctl 操作:

  • DL_ROUTE
  • DL_TUNE_有限责任公司
  • DL_零统计
  • DL_SET_REMADDR

这些命令及其关联的数据结构在 /usr/include/sys/dlpi_aix.h 头文件中进行了描述。

注: 需要参数长于一个长字的 ioctl 命令或指定用于读取或写入的指针的 ioctl 命令必须使用 I_STR 格式,如以下示例中所示:

int
istr(int fd, int cmd, char *data, int len) {
       struct strioctl  ic;
       ic.cmd = cmd;
       ic.timout = -1;
       ic.dp = data;
       ic.dp = data;
       ic.len = len;
       return ioctl(fd, I_STR, &ic);
}
描述
DL_ROUTE 禁用当前流上的源路由,查询 动态路由发现 以获取源路由,或者静态地将源路由分配给此流。 仅当流处于空闲状态 (DL_IDLE) 时才接受。
  • 如果自变量长度为 0 ,那么不会在传出帧上使用源路由。
  • 如果自变量长度等于当前介质的 MAC 地址长度 (例如,对于大多数 802.x 提供程序,为 6) ,那么 DRD 算法用于获取自变量中指定的地址的源路由。 从 ioctl 返回时, MAC 地址将替换为源路由。
  • 否则,假定自变量包含格式的地址mac_addr.source_routesource_route部分在所有通信中用作此流的源路由。
例如,可以使用以下代码来发现任意地址的源路由:

char *
getroute(int fd, char *addr, int len) {
        static char route[MAXROUTE_LEN];
        bcopy(addr, route, len);
        if (istr(fd, DL_ROUTE, route, len))
                return 0;
        return route;
}
DL_TUNE_有限责任公司 允许 DLS 用户更改缺省 LLC 可调参数。 自变量必须指向 llctune_t 数据结构。

检查标志字段以确定应该更改哪些参数 (如果有)。 标志字段中的每个位对应于 llctune_t中的一个类似命名的字段; 如果设置了该位,那么相应的参数将设置为 llctune_t中的值。 仅影响当前流,并且在关闭流时将废弃更改。

如果设置了 F_LLC_SET 标志,并且用户具有 root 用户权限,那么更改后的参数将保存为所有新流的新缺省参数。

此命令将当前可调参数的更新作为其参数返回。

例如,要将t1值,可以使用以下代码:

int
more_t1(int fd) {
        llctune_t t;
        t.flags = 0;
        if (istr(fd, DL_TUNE_LLC, &t, sizeof(t)))
           return -1;
        t.flags = F_LLC_T1;
        t.t1 *= 2;
        return istr(fd, DL_TUNE_LLC, &t, sizeof(t));
}

要查询可调参数,请发出标志字段设置为零的 DL_TUNE_LLC 。 这将不改变参数并返回当前可调参数值。

DL_零统计 将统计信息计数器重置为零。 驱动程序维护两个独立的统计信息集,一个用于每个流 (本地) ,另一个是所有流 (全局) 的累积统计信息。

此命令接受简单布尔参数。 如果自变量为 True (非零) ,那么全局统计信息将为零。 否则,仅会将当前流的统计信息归零。

例如,要使当前流上的统计信息计数器为零,可以使用以下代码:

int
zero_stats(int fd) {
        return ioctl(fd, DL_ZERO_STATS, 0);
}
DL_SET_REMADDR 允许在仍处于 DL_IDLE 状态的面向连接的流上进行 XID/TEST 交换。

dlpi 驱动程序使用源 (远程) 地址和 dl_sap 来确定在何处路由面向连接的流的入局消息。 远程地址通常在 DL_CONNECT_REQ中指定。 如果 DLS 用户在连接到远程站之前需要交换 XID 或 TEST 消息,那么必须使用 DL_SET_REMADDR

注: 请注意,如果要仅在状态为 DL_DATAXFER时交换 XID 和 TEST 消息,那么 需要此命令。
此命令的自变量是远程 MAC 地址。 一个可能的代码片段可能是:

int
setaddr(int fd, char *addr, int len) {
        return istr(fd, DL_SET_REMADDR, addr, len);
}