ARCnet

注意

如果你和我们中的许多人一样,没有拿到ARCnet卡的说明书,请参阅此目录中的ARCnet硬件,了解跳线设置和布线信息。

既然似乎没有人听我的,也许一首诗会引起你的注意

This driver's getting fat and beefy,
But my cat is still named Fifi.

嗯,我想我可以把它叫做一首诗,即使它只有两行。嘿,我是学计算机科学的,不是学英语的。饶了我吧。

重点是:如果你测试了这个并且让它工作了,我真的真的真的真的真的想听到你的消息。或者如果你没有成功。或者任何事情。

ARCnet 0.32 ALPHA 版本首次进入 Linux 内核 1.1.80 - 这很好,但是在那之后,更少的人开始写信给我,因为他们甚至不必安装补丁了。 <叹气>

来吧,做一个绅士!给我发一份成功报告!

(嘿,这比我原来的诗还棒……这越来越糟了!)

警告

如果你不尽快通过电子邮件告诉我你的成功/失败情况,我可能会被迫开始唱歌。我们都不希望那样,对吧?

(你知道,可能会有人认为我有点过分强调这一点。如果你这么认为,为什么不在一封简短的电子邮件中喷我一下呢?请同时包括您正在使用的卡类型,软件,网络大小以及它是否正常工作。)

我的电子邮件地址是:apenwarr@worldvisions.ca

这些是 Linux 的 ARCnet 驱动程序。

这个新版本 (2.91) 是由 David Woodhouse <dwmw2@infradead.org> 整理的,目的是在添加对另一种芯片组的支持后整理驱动程序。现在,通用支持已从各个芯片组驱动程序中分离出来,并且源文件中的 #ifdef 不再那么拥挤了!我对这个文件做了一些修改,但仍然保留了 Avery 的第一人称,因为我不想完全重写它。

之前的版本是我 (Avery Pennarun) 花了几个月断断续续的努力,来自其他人的许多错误报告/修复和建议,尤其是来自 Tomasz Motylewski 的大量投入和编码的结果。从 ARCnet 2.10 ALPHA 开始,Tomasz 全新改进的 RFC1051 支持已包含在内,并且似乎运行良好!

我在哪里讨论这些驱动程序?

Tomasz 非常好心地建立了一个新的改进的邮件列表。发送一封正文为“subscribe linux-arcnet 您的真实姓名”的消息到listserv@tichy.ch.uj.edu.pl 即可订阅。然后,要向列表提交消息,请发送邮件至 linux-arcnet@tichy.ch.uj.edu.pl

邮件列表的存档位于

linux-net@vger.kernel.org(现在已经失效,被 netdev@vger.kernel.org 取代)上的人们也一直非常乐于助人,尤其是在我们谈论可能一开始就无法正常工作的 ALPHA Linux 内核时。

其他驱动程序和信息

您可以在万维网上尝试我的 ARCNET 页面:

此外,SMC(生产 ARCnet 卡的公司之一)有一个您可能会感兴趣的网站,其中包括几个用于各种卡(包括 ARCnet)的驱动程序。尝试访问

Performance Technologies 制作支持 ARCnet 的各种网络软件

http://www.perftech.com/ 或 ftp 到 ftp.perftech.com。

Novell 为 DOS 制作了一个网络堆栈,其中包括 ARCnet 驱动程序。尝试 FTP 到 ftp.novell.com。

您可以从 oak.oakland.edu:/simtel/msdos/pktdrvr 获取 Crynwr 数据包驱动程序集合(包括 arcether.com,这是您想要与 ARCnet 卡一起使用的驱动程序)。但是,如果没有补丁,它在 386+ 上无法完美运行,并且也不喜欢几张卡。我的 WWW 页面上提供了修复版本,或者如果您无法访问 WWW,也可以通过电子邮件获取。

安装驱动程序

您安装驱动程序所需要做的就是

make config
        (be sure to choose ARCnet in the network devices
        and at least one chipset driver.)
make clean
make zImage

如果您获得的这个 ARCnet 软件包是对当前内核中 ARCnet 驱动程序的升级,您需要先将 arcnet.c 复制到 linux/drivers/net 目录中的对应文件。

如果您在重新启动进入新的 Linux 内核时收到一些 ARCnet 消息,您就知道驱动程序已正确安装。

有四个芯片组选项

  1. 标准 ARCnet COM90xx 芯片组。

这是普通的 ARCnet 卡,您可能已经拥有了。这是唯一一个如果未告知卡的位置,将会自动探测的芯片组驱动程序。它在命令行上遵循以下选项

com90xx=[<io>[,<irq>[,<shmem>]]][,<name>] | <name>

如果您将芯片组支持作为模块加载,则选项为

io=<io> irq=<irq> shmem=<shmem> device=<name>

要禁用自动探测,只需在内核命令行上指定“com90xx=”。要仅指定名称,但允许自动探测,只需输入“com90xx=<name>”

  1. ARCnet COM20020 芯片组。

这是 SMC 推出的新芯片组,支持混杂模式(数据包嗅探)、额外的诊断信息等。不幸的是,没有明智的方法可以自动探测这些卡。您必须在内核命令行上指定 I/O 地址。

命令行选项为

com20020=<io>[,<irq>[,<node_ID>[,backplane[,CKP[,timeout]]]]][,name]

如果您将芯片组支持作为模块加载,则选项为

io=<io> irq=<irq> node=<node_ID> backplane=<backplane> clock=<CKP>
timeout=<timeout> device=<name>

COM20020 芯片组允许您在软件中设置节点 ID,覆盖卡上仍然通过 DIP 开关设置的默认值。如果您没有 COM20020 数据表,并且不知道其他三个选项指的是什么,那么它们不会让您感兴趣 - 忘记它们。

  1. IO 映射模式下的 ARCnet COM90xx 芯片组。

这也可以与普通的 ARCnet 卡一起使用,但不使用共享内存。它的性能不如上述驱动程序,但它提供的原因是为了防止您拥有一张不支持共享内存的卡,或者(奇怪的是)如果您的机器中有太多 ARCnet 卡,以至于您用完了 shmem 插槽。如果您不在内核命令行上给出 IO 地址,则驱动程序将找不到该卡。

命令行选项为

com90io=<io>[,<irq>][,<name>]
如果您将芯片组支持作为模块加载,则选项为

io=<io> irq=<irq> device=<name>

  1. ARCnet RIM I 卡。

这些是 _完全_ 内存映射的 COM90xx 芯片。对这些的支持未经测试。如果您有其中之一,请通过邮件向作者发送一份成功报告。必须指定所有选项,除了设备名称。命令行选项

arcrimi=<shmem>,<irq>,<node_ID>[,<name>]

如果您将芯片组支持作为模块加载,则选项为

shmem=<shmem> irq=<irq> node=<node_ID> device=<name>

可加载模块支持

配置并重新构建 Linux。当被问到时,如果您想使用可加载模块,请对“通用 ARCnet 支持”和对您的 ARCnet 芯片组的支持回答“m”。如果您愿意,也可以对“通用 ARCnet 支持”回答“y”,对芯片组支持回答“m”。

make config
make clean
make zImage
make modules

如果您正在使用可加载模块,则需要使用 insmod 加载它,并且可以在命令行上指定卡的各种特性。(在驱动程序的最新版本中,自动探测更加可靠,并且作为模块工作,因此现在大多数这些都是不必要的。)

例如

cd /usr/src/linux/modules
insmod arcnet.o
insmod com90xx.o
insmod com20020.o io=0x2e0 device=eth1

使用驱动程序

如果您的内核包含 ARCnet COM90xx 支持,它应该在您启动时自动探测您的卡。如果您使用编译到内核中的不同芯片组驱动程序,则必须在内核命令行上给出必要的选项,如上所述。

去阅读 Linux 的 NET-2-HOWTO 和 ETHERNET-HOWTO;它们应该在您获取此驱动程序的地方可用。将您的 ARCnet 视为一个功能增强(或降低,视情况而定)的以太网卡。

顺便说一句,请务必将 HOWTO 中的所有“eth0”引用更改为“arc0”。请记住,ARCnet 不是“真正的”以太网,并且设备名称是不同的。

一台计算机中的多张卡

Linux 现在对此有很好的支持,但由于我一直很忙,ARCnet 驱动程序在这方面有点受影响。如果编译到内核中,COM90xx 支持将(尝试)自动检测所有已安装的卡。

如果您有其他卡,并且支持已编译到内核中,那么您可以简单地在内核命令行上重复这些选项,例如

LILO: linux com20020=0x2e0 com20020=0x380 com90io=0x260

如果您的芯片组支持是作为可加载模块构建的,那么您需要执行类似以下的操作

insmod -o arc0 com90xx
insmod -o arc1 com20020 io=0x2e0
insmod -o arc2 com90xx

ARCnet 驱动程序现在将自动整理它们的名称。

我如何让它与...一起工作?

NFS

linux->linux 应该没问题,只需假装您正在使用以太网卡即可。oak.oakland.edu:/simtel/msdos/nfs 有一些不错的 DOS 客户端。还有一个名为 SOSS 的基于 DOS 的 NFS 服务器。它的多任务处理方式不像 Linux 那样(实际上,它根本不进行多任务处理),但你永远不知道你可能需要什么。

对于 AmiTCP(以及可能其他的),您可能需要在 Amiga nfstab 中设置以下选项:MD 1024 MR 1024 MW 1024 (感谢 Christian Gottschling <ferksy@indigo.tng.oche.de> 提供此信息。)

这些可能指的是最大 NFS 数据/读取/写入块大小。我不知道为什么 Amiga 上的默认值不起作用;如果您了解更多信息,请写信给我。

DOS

如果您正在使用免费软件 arcether.com,您可能需要从我的网页安装驱动程序补丁。它有助于 PC/TCP,并且如果 arcether 在初始化期间超时太快,也可以让它加载。事实上,如果您在 386+ 上使用它,您真的真的需要这个补丁。

Windows

请参阅 DOS :) Trumpet Winsock 可以与 Novell 或 Arcether 客户端一起正常工作,前提是您记得加载 winpkt。

LAN Manager 和 Windows for Workgroups

这些程序使用的协议与 Internet 标准不兼容。它们试图伪装成以太网卡,并使网络上的其他所有设备感到困惑。

但是,Linux ARCnet 驱动程序 v2.00 及更高版本通过 “arc0e” 设备支持此协议。有关更多信息,请参阅“多协议支持”部分。

使用 Linux 的免费软件 Samba 服务器和客户端,您现在可以很好地与基于 TCP/IP 的 WfWg 或 Lan Manager 网络进行交互。

Windows 95

Win95 包含的工具允许您使用 LANMAN 风格的网络驱动程序 (NDIS) 或 Novell 驱动程序 (ODI) 来处理 ARCnet 数据包。如果您使用 ODI,您需要使用 Linux 的 “arc0” 设备。如果您使用 NDIS,则尝试 “arc0e” 设备。如果您需要 arc0e,您完全疯了,或者您需要构建某种使用两种封装类型的混合网络,请参阅下面的“多协议支持”部分。

OS/2

我被告知它可以在 Warp Connect 下与 SMC 的 ARCnet 驱动程序一起工作。您需要为此使用 “arc0e” 接口。如果您让 SMC 驱动程序与“普通” Warp Bonus Pack 中包含的 TCP/IP 组件一起工作,请告诉我。

ftp.microsoft.com 还有一个免费的 “Lan Manager for OS/2” 客户端,它应该使用与 WfWg 相同的协议。但是,我无法在 Warp 下安装它。请通过邮件告知我任何结果。

NetBSD/AmiTCP

这些使用旧版本的 Internet 标准 ARCnet 协议 (RFC1051),该协议与使用 arc0s 设备的 Linux 驱动程序 v2.10 ALPHA 及更高版本兼容。(请参阅下面的“多协议 ARCnet”。)** 较新版本的 NetBSD 显然支持 RFC1201。

使用多协议 ARCnet

ARCnet 驱动程序 v2.10 ALPHA 支持三种协议,每种协议都有自己的“虚拟网络设备”

arc0

RFC1201 协议,正式的 Internet 标准,它恰好与 Novell 的 TRXNET 驱动程序 100% 兼容。ARCnet 驱动程序的 1.00 版本仅支持此协议。arc0 是这三种协议中最快的(无论出于何种原因),并且允许使用更大的数据包,因为它支持 RFC1201“数据包拆分”操作。除非您有特殊需要使用不同的协议,否则我强烈建议您坚持使用此协议。

arc0e

“以太网封装”,它通过 ARCnet 发送的数据包实际上很像以太网数据包,包括 6 字节的硬件地址。此协议与 Microsoft 的 NDIS ARCnet 驱动程序兼容,例如 WfWg 和 LANMAN 中的驱动程序。由于 493 的 MTU 实际上小于 TCP/IP “要求” 的 MTU (576),因此某些网络操作可能无法正常工作。但是,在大多数情况下,Linux TCP/IP 层可以通过自动分段 TCP/IP 数据包使其适合来补偿。arc0e 的工作速度也比 arc0 稍慢,原因尚待确定。(可能是较小的 MTU 造成的。)

arc0s

“[s]imple” RFC1051 协议是“以前”的 Internet 标准,它与新标准完全不兼容。然而,今天的一些软件继续支持旧标准(并且仅支持旧标准),包括 NetBSD 和 AmiTCP。RFC1051 也不支持 RFC1201 的数据包拆分,并且 507 的 MTU 仍然小于 Internet 的“要求”,因此您很可能会遇到问题。由于与 arc0e 相同的原因,它也比 RFC1201 慢约 25%。

arc0s 支持由 Tomasz Motylewski 提供,并由我稍作修改。错误可能是我造成的。

如果您愿意,您可以选择不将 arc0e 和 arc0s 编译到驱动程序中 - 这将节省您一些内存,并避免在例如尝试使用最近 Linux 内核中的 “NFS-root” 组件时造成混淆。

当您第一次 ifconfig arc0 设备时,会自动创建 arc0e 和 arc0s 设备。但是,要实际使用它们,您还需要 ifconfig 您需要的其他虚拟设备。然后,您可以通过多种方式设置网络

  1. 单一协议。

    这是配置网络的最简单方法:仅使用两种可用协议中的一种。如上所述,除非您有充分的理由(例如某些其他软件,即 WfWg,仅适用于 arc0e),否则最好只使用 arc0。

    如果您只需要 arc0,那么以下命令应该可以让您开始

    ifconfig arc0 MY.IP.ADD.RESS
    route add MY.IP.ADD.RESS arc0
    route add -net SUB.NET.ADD.RESS arc0
    [add other local routes here]
    

    如果您需要 arc0e(并且只需要 arc0e),则会略有不同

    ifconfig arc0 MY.IP.ADD.RESS
    ifconfig arc0e MY.IP.ADD.RESS
    route add MY.IP.ADD.RESS arc0e
    route add -net SUB.NET.ADD.RESS arc0e
    

    arc0s 的工作方式与 arc0e 非常相似。

  2. 同一条线路上的多个协议。

    现在事情开始变得令人困惑。要尝试它,您可能需要有点疯狂。这是*我*所做的。:) 请注意,我的家庭网络中不包含 arc0s;我没有任何 NetBSD 或 AmiTCP 计算机,因此我仅在有限的测试期间使用 arc0s。

    我的家庭网络上有三台计算机;两台 Linux 计算机(由于上述原因,它们更喜欢 RFC1201 协议)和一台无法运行 Linux 但运行免费 Microsoft LANMAN 客户端的 XT。

    更糟糕的是,其中一台 Linux 计算机 (freedom) 还有一个调制解调器,并充当我 Internet 提供商的路由器。另一台 Linux 计算机 (insight) 也有自己的 IP 地址,并且需要使用 freedom 作为其默认网关。但是,XT (patience) 没有自己的 Internet IP 地址,因此我在“私有子网”上为它分配了一个(由 RFC1597 定义)。

    首先,采用一个简单的网络,其中只有 insight 和 freedom。Insight 需要

    • 通过 RFC1201 (arc0) 协议与 freedom 通信,因为我更喜欢它,而且它速度更快。

    • 使用 freedom 作为其 Internet 网关。

    这很容易做到。像这样设置 insight

    ifconfig arc0 insight
    route add insight arc0
    route add freedom arc0  /* I would use the subnet here (like I said
                                    to in "single protocol" above),
                                    but the rest of the subnet
                                    unfortunately lies across the PPP
                                    link on freedom, which confuses
                                    things. */
    route add default gw freedom
    

    freedom 的配置如下

    ifconfig arc0 freedom
    route add freedom arc0
    route add insight arc0
    /* and default gateway is configured by pppd */
    

    太好了,现在 insight 直接在 arc0 上与 freedom 通信,并通过 freedom 向 Internet 发送数据包。如果您不知道如何执行上述操作,则现在应该停止阅读本节,因为它只会变得更糟。

    现在,我如何将 patience 添加到网络中?它将使用 LANMAN 客户端,这意味着我需要 arc0e 设备。它需要能够与 insight 和 freedom 通信,并且还需要使用 freedom 作为 Internet 网关。(请记住,patience 有一个“私有 IP 地址”,它在 Internet 上不起作用;这没关系,我在 freedom 上为此子网配置了 Linux IP 伪装)。

    因此,patience(必然如此;我没有从我的提供商那里获得另一个 IP 号码)的 IP 地址与 freedom 和 insight 所在的子网不同,但需要使用 freedom 作为 Internet 网关。更糟糕的是,包括 LANMAN 在内的大多数 DOS 网络程序都具有依赖于网络掩码和“默认网关”来确定如何路由数据包的脑残网络方案。这意味着,要到达 freedom 或 insight,patience 将通过其默认网关发送,而不管 freedom 和 insight(通过 arc0e 设备)都可以理解直接传输的事实。

    我通过为 freedom 提供一个额外的 IP 地址(别名“gatekeeper”)来补偿,该地址位于我的私有子网上,该子网与 patience 所在的子网相同。然后,我将 gatekeeper 定义为 patience 的默认网关。

    要配置 freedom(除了上述命令之外)

    ifconfig arc0e gatekeeper
    route add gatekeeper arc0e
    route add patience arc0e
    

    这样,freedom 将通过 arc0e 发送所有用于 patience 的数据包,并将其 IP 地址作为 gatekeeper(在私有子网上)。当它与 insight 或 Internet 通信时,它将使用其 “freedom” Internet IP 地址。

    您会注意到我们尚未在 insight 上配置 arc0e 设备。这将起作用,但不是真正必要的,并且需要我从我的私有子网为 insight 分配另一个特殊的 IP 号码。由于 insight 和 patience 都使用 freedom 作为其默认网关,因此两者已经可以相互通信。

    我第一次这样设置真是太幸运了(咳嗽),因为当我将 insight 启动到 DOS 时,它非常方便。在那里,它运行 Novell ODI 协议栈,该协议栈仅适用于 RFC1201 ARCnet。在这种模式下,insight 将无法直接与 patience 通信,因为 Novell 堆栈与 Microsoft 的以太网封装不兼容。在不更改 freedom 或 patience 上的任何设置的情况下,我只需将 freedom 设置为 insight 的默认网关(记住,现在是在 DOS 中),并且所有转发都会在通常无法通信的两个主机之间“自动”进行。

    对于喜欢图表的人,我在同一物理 ARCnet 线路创建了两个“虚拟子网”。您可以像这样描绘它

        [RFC1201 NETWORK]                   [ETHER-ENCAP NETWORK]
    (registered Internet subnet)           (RFC1597 private subnet)
    
                           (IP Masquerade)
        /---------------\         *            /---------------\
        |               |         *            |               |
        |               +-Freedom-*-Gatekeeper-+               |
        |               |    |    *            |               |
        \-------+-------/    |    *            \-------+-------/
                |            |                         |
             Insight         |                      Patience
                         (Internet)
    

它有效:接下来怎么办?

请向以下地址发送邮件,描述您的设置,最好包括驱动程序版本、内核版本、ARCnet 网卡型号、CPU 类型、网络上的系统数量以及正在使用的软件列表

我确实会(有时会自动)回复我收到的所有消息。我的电子邮件可能很奇怪(通常也会在发送给我的途中被转发到各处),因此如果您在合理的时间内没有收到回复,请重新发送。

它不起作用:接下来怎么办?

执行与上述相同的操作,但也要在邮件中包含 ifconfig 和 route 命令的输出,以及任何相关的日志条目(即,自上次重新启动以来出现的任何以“arcnet:”开头的内容)。

如果您想尝试自己修复它(我强烈建议您先给我发送有关该问题的邮件,因为它可能已经得到解决),您可能需要尝试一些可用的调试级别。对于在 D_DURING 或更高版本上的大量测试,最好先杀死您的 klogd 守护进程!D_DURING 为每个发送或接收的数据包显示 4-5 行。D_TX、D_RX 和 D_SKB 实际上会显示每个发送或接收的数据包,这显然很大。

从 v2.40 ALPHA 开始,自动探测例程已发生重大更改。特别是,除非您打开 D_INIT_REASONS 调试标志,否则它们不会告诉您为什么找不到网卡。

驱动程序运行后,您可以以 root 身份运行 arcdump shell 脚本(从我这里或在完整的 ARCnet 包中可用,如果您有),以随时列出 arcnet 缓冲区的内容。要对此进行任何理解,您应该获取相关的 RFC。(一些 RFC 列在 arcnet.c 的顶部附近)。arcdump 假设您的网卡位于 0xD0000。如果不是,请编辑脚本。

缓冲区 0 和 1 用于接收,缓冲区 2 和 3 用于发送。乒乓缓冲区在两种方式中都已实现。

如果您的调试级别包括 D_DURING 并且您没有定义 SLOW_XMIT_COPY,则每次重置网卡时(仅当您执行 ifconfig up 或当 Linux 确定驱动程序已损坏时才会发生这种情况),缓冲区都会被清除为常量值 0x42。在传输期间,缓冲区未使用的部分也将被清除为 0x42。这是为了更容易地确定数据包正在使用哪些字节。

您可以通过键入以下内容来更改调试级别,而无需重新编译内核

ifconfig arc0 down metric 1xxx
/etc/rc.d/rc.inet1

其中 “xxx” 是您想要的调试级别。 例如,“metric 1015” 会将您设置为调试级别 15。 目前,调试级别 7 是默认值。

请注意,调试级别(从 v1.90 ALPHA 版本开始)是不同调试标志的二进制组合;因此,调试级别 7 实际上是 1+2+4,即 D_NORMAL+D_EXTRA+D_INIT。 要包含 D_DURING,您需要在此基础上加 16,从而得到调试级别 23。

如果您不理解这一点,您可能也不想了解太多。 请给我发送电子邮件描述您的问题。

我想汇款:现在怎么办?

去睡个午觉或者做点别的。 早上你会感觉好些。