I just installed Gentoo 1.4 on my Ultra 60 (Sparc 64) build. I updated everything so it's all current as of yesterday. I also compiled in bridging support in the kernel and can see that the bridging module loads. I then did an emerge bridge-utils. When I try to add a bridge though I get this: # brctl addbr br0 br_add_bridge: Operation not supported I noticed that bridge-utils was version 0.9.3-r1. On the web site: bridge.sourceforge.net, the version was 0.9.6. So I "unemerged" the bridge-utils, changed the 0.9.6 ebuild keywords to add sparc, and emerged using the 0.9.6 ebuild. (suggested in forums) Now when I try to do bridging, I get: # brctl addbr bridge0 # brctl addif bridge0 hme0 bridge bridge0 doesn't exist! # brctl show bridge name bridge id STP enabled interfaces (No bridges shown) # brctl addbr bridge0 device bridge0 already exists; can't create bridge with the same name I have 5 hme ports on my Ultra 60 and I need bridging. I also need traffic shaping. FreeBSD panics when you turn on bridging, OpenBSD is pokey when you bridge through more than 2 ports and doesn't have sufficiently advanced traffic shaping. Linux is my last hope! Please help. Reproducible: Always Steps to Reproduce: 1. Make sure briding is enabled in the kernel. 2. brctl addbr bridge0 3. brctl show (bridge0 does not show up) Actual Results: Can't seem to add a bridge virtual interface. Expected Results: Should have created a virtual bridge interface which you could then associate interfaces with. The bridge module loads (can see it with lsmod). Not sure why brctl can't create virtual bridge interface. Hardware: Ultra 60, 360MHz UltraSPARC II, 2GB RAM, 9 and 18GB SCSI HDDs, builtin hme port, qfe card with 4 "hme" ports, SCSI-CDROM Note that briding works in OpenBSD (with same machine described above) albeit slowly so it is not a hardware problem or limitation. I would be happy to try things, just let me know what to do. Thanks--Jim
straces (dev-util/strace-4.4.98): Add new bridge: test60{root}:/root<504>strace brctl addbr br10 execve("/sbin/brctl", ["brctl", "addbr", "br10"], [/* 28 vars */]) = 0 uname({sys="Linux", node="test60", ...}) = 0 brk(0) = 0x25040 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7001a000 open("/etc/ld.so.preload", O_RDONLY) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=9986, ...}) = 0 mmap(NULL, 9986, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7001c000 close(3) = 0 open("/lib/libc.so.6", O_RDONLY) = 3 read(3, "\177ELF\1\2\1\0\0\0\0\0\0\0\0\0\0\3\0\22\0\0\0\1\0\1\313"..., 1024) = 1024 fstat64(3, {st_mode=S_IFREG|0755, st_size=1583553, ...}) = 0 mmap(NULL, 1414760, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x7002c000 mprotect(0x70170000, 87656, PROT_NONE) = 0 mmap(0x7017c000, 32768, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x140000) = 0x7017c000 mmap(0x70184000, 5736, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x70184000 close(3) = 0 munmap(0x7001c000, 9986) = 0 open("/dev/urandom", O_RDONLY) = 3 read(3, "\307-\221\367\331\324\310{J\222F\3\330r\347\247\321<\274"..., 32) = 32 close(3) = 0 socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 3 uname({sys="Linux", node="test60", ...}) = 0 ioctl(3, 0x8940, 0xeffff900) = 1 ioctl(3, 0x8940, 0xeffff868) = 1 brk(0) = 0x25040 brk(0x27040) = 0x27040 brk(0) = 0x27040 brk(0x28000) = 0x28000 socket(PF_INET6, SOCK_DGRAM, 0) = -1 EAFNOSUPPORT (Address family not supported by protocol) socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 4 ioctl(4, 0x8910, 0xeffff810) = 0 close(4) = 0 ioctl(3, 0x89f3, 0xeffff790) = -1 EOPNOTSUPP (Operation not supported) ioctl(3, 0x8940, 0xeffff8f0) = 0 exit(0) = ? Add same bridge: test60{root}:/root<505>strace brctl addbr br10 execve("/sbin/brctl", ["brctl", "addbr", "br10"], [/* 28 vars */]) = 0 uname({sys="Linux", node="test60", ...}) = 0 brk(0) = 0x25040 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7001a000 open("/etc/ld.so.preload", O_RDONLY) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=9986, ...}) = 0 mmap(NULL, 9986, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7001c000 close(3) = 0 open("/lib/libc.so.6", O_RDONLY) = 3 read(3, "\177ELF\1\2\1\0\0\0\0\0\0\0\0\0\0\3\0\22\0\0\0\1\0\1\313"..., 1024) = 1024 fstat64(3, {st_mode=S_IFREG|0755, st_size=1583553, ...}) = 0 mmap(NULL, 1414760, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x7002c000 mprotect(0x70170000, 87656, PROT_NONE) = 0 mmap(0x7017c000, 32768, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x140000) = 0x7017c000 mmap(0x70184000, 5736, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x70184000 close(3) = 0 munmap(0x7001c000, 9986) = 0 open("/dev/urandom", O_RDONLY) = 3 read(3, "\333\325\275\344\v\264\\\210i\31\243\6\30R\243\311\256"..., 32) = 32 close(3) = 0 socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 3 uname({sys="Linux", node="test60", ...}) = 0 ioctl(3, 0x8940, 0xeffff900) = 1 ioctl(3, 0x8940, 0xeffff868) = 2 brk(0) = 0x25040 brk(0x27040) = 0x27040 brk(0) = 0x27040 brk(0x28000) = 0x28000 socket(PF_INET6, SOCK_DGRAM, 0) = -1 EAFNOSUPPORT (Address family not supported by protocol) socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 4 ioctl(4, 0x8910, 0xeffff810) = 0 close(4) = 0 ioctl(3, 0x89f3, 0xeffff790) = -1 EOPNOTSUPP (Operation not supported) ioctl(3, 0x8940, 0xeffff8f0) = -1 EEXIST (File exists) write(2, "device br10 already exists; can\'"..., 67device br10 already exists; can't create bridge with the same name ) = 67 exit(0) = ? Bridge status: test60{root}:/root<506>strace brctl show execve("/sbin/brctl", ["brctl", "show"], [/* 28 vars */]) = 0 uname({sys="Linux", node="test60", ...}) = 0 brk(0) = 0x25040 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7001a000 open("/etc/ld.so.preload", O_RDONLY) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=9986, ...}) = 0 mmap(NULL, 9986, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7001c000 close(3) = 0 open("/lib/libc.so.6", O_RDONLY) = 3 read(3, "\177ELF\1\2\1\0\0\0\0\0\0\0\0\0\0\3\0\22\0\0\0\1\0\1\313"..., 1024) = 1024 fstat64(3, {st_mode=S_IFREG|0755, st_size=1583553, ...}) = 0 mmap(NULL, 1414760, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x7002c000 mprotect(0x70170000, 87656, PROT_NONE) = 0 mmap(0x7017c000, 32768, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x140000) = 0x7017c000 mmap(0x70184000, 5736, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x70184000 close(3) = 0 munmap(0x7001c000, 9986) = 0 open("/dev/urandom", O_RDONLY) = 3 read(3, "C\374\303\246\324\364}\352\1779\335\266\24&\253\310\247"..., 32) = 32 close(3) = 0 socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 3 uname({sys="Linux", node="test60", ...}) = 0 ioctl(3, 0x8940, 0xeffff910) = 1 ioctl(3, 0x8940, 0xeffff878) = 2 brk(0) = 0x25040 brk(0x27040) = 0x27040 brk(0) = 0x27040 brk(0x28000) = 0x28000 socket(PF_INET6, SOCK_DGRAM, 0) = -1 EAFNOSUPPORT (Address family not supported by protocol) socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 4 ioctl(4, 0x8910, 0xeffff820) = 0 close(4) = 0 ioctl(3, 0x89f3, 0xeffff7a0) = -1 EOPNOTSUPP (Operation not supported) fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(3, 0), ...}) = 0 ioctl(1, SNDCTL_TMR_SELECT, {B38400 opost isig icanon echo ...}) = 0 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7001c000 write(1, "bridge name\tbridge id\t\tSTP enabl"..., 46bridge name bridge id STP enabled interfaces ) = 46 munmap(0x7001c000, 8192) = 0 exit(0) = ?
From the recent discussion on the sparclinux ml <http://marc.theaimsgroup.com/?t=107575522300004&r=1&w=2> (for others), bridge-utils needs 64 bit support to work. This currently isn't available, but should be sometime before the 2004.1 release.
As the release of 2004.1 approaches we won't be addressing this (64 bit userland) just yet. I'm lowering the severity to "normal" for the time being.
Thanks to Santiago (Santi) Leon for providing the following fix to me to enable bridging on the Sparc64 platform. I have tested it under Debian unstable, using Kernel 2.4.25, and bridge-utils-0.9.6.tar.gz. The fix is as follows: Download bridge-utils-0.9.6.tar.gz source from bridge.sourceforge.net, untar it, edit bridge-utils/libbridge/libbridge_devif.c and search for a line that has this: return ioctl(br_socket_fd, SIOCDEVPRIVATE + 3, &ifr); and replace it with this: return ioctl(br_socket_fd, SIOCDEVPRIVATE, &ifr); (basically just remove the +3)... run make and again and try: (After you rebuild the bridge utilities, these should work beautifully!) bridge-utils/brctl/brctl addbr br0 bridge-utils/brctl/brctl adddif br0 eth0 bridge-utils/brctl/brctl show Santi mentioned that the newer kernels don't make SIOCDEVPRIVATE+3 a 64-bit compatible ioctl and that's why it doesn't work on the Sparc64 architecture. He also mentioned that the same fix works for the PowerPC64 Architecture so it might help for other 64bit architecture platforms. Note also that this is not scheduled to be fixed in bridge-tuils-0.9.7, so for now this seems to be the best work around for 64bit platforms. Here is a diff too: # diff -Nru bridge-utils/libbridge/libbridge_devif.c bridge-utils/libbridge/libbridge_devif.c.orig --- bridge-utils/libbridge/libbridge_devif.c 2004-04-01 21:10:55.000000000 -0500 +++ bridge-utils/libbridge/libbridge_devif.c.orig 2002-01-16 07:04:45.000000000 -0500 @@ -56,7 +56,7 @@ memcpy(ifr.ifr_name, br->ifname, IFNAMSIZ); ((unsigned long long *)(&ifr.ifr_data))[0] = (unsigned long long)(unsigned long)args; - return ioctl(br_socket_fd, SIOCDEVPRIVATE, &ifr); + return ioctl(br_socket_fd, SIOCDEVPRIVATE + 3, &ifr); } #endif