kern/122839: [multicast] FreeBSD 7 multicast routing problem
4pr at legis.krsn.ru
4pr at legis.krsn.ru
Wed Jun 18 15:20:04 UTC 2008
The following reply was made to PR kern/122839; it has been noted by GNATS.
From: 4pr at legis.krsn.ru
To: bug-followup at FreeBSD.org, bms at FreeBSD.org, tomas at tutus.se,
4pr at legis.krsn.ru
Cc:
Subject: Re: kern/122839: [multicast] FreeBSD 7 multicast routing problem
Date: Wed, 18 Jun 2008 22:47:37 +0800
--=_mixed 0051374DC725746C_=
Content-Type: text/plain; charset="US-ASCII"
Hello!
Thanks for given ideas and your help!
Using patch suggested by Tomas Svensson we have made our version of it:
--- if_em.c.orig 2007-11-29 06:24:38.000000000 +0700
+++ if_em.c 2008-04-24 16:49:04.000000000 +0800
@@ -1080,7 +1080,7 @@
if (ifp->if_flags & IFF_UP) {
if ((ifp->if_drv_flags & IFF_DRV_RUNNING)) {
if ((ifp->if_flags ^ adapter->if_flags) &
- IFF_PROMISC) {
+ (IFF_PROMISC | IFF_ALLMULTI)) {
em_disable_promisc(adapter);
em_set_promisc(adapter);
}
@@ -2379,12 +2379,14 @@
static void
em_disable_promisc(struct adapter *adapter)
{
+ struct ifnet *ifp = adapter->ifp;
uint32_t reg_rctl;
reg_rctl = E1000_READ_REG(&adapter->hw, E1000_RCTL);
reg_rctl &= (~E1000_RCTL_UPE);
- reg_rctl &= (~E1000_RCTL_MPE);
+ if (!(ifp->if_flags & IFF_ALLMULTI))
+ reg_rctl &= (~E1000_RCTL_MPE);
E1000_WRITE_REG(&adapter->hw, E1000_RCTL, reg_rctl);
}
Also we have made a patch for if_msk.c :
--- if_msk.c.orig 2007-12-08 19:16:14.000000000 +0700
+++ if_msk.c 2008-04-24 17:51:02.000000000 +0800
@@ -558,11 +558,11 @@
bzero(mchash, sizeof(mchash));
mode = GMAC_READ_2(sc, sc_if->msk_port, GM_RX_CTRL);
- mode |= GM_RXCR_UCF_ENA;
if ((ifp->if_flags & (IFF_PROMISC | IFF_ALLMULTI)) != 0) {
if ((ifp->if_flags & IFF_PROMISC) != 0)
mode &= ~(GM_RXCR_UCF_ENA | GM_RXCR_MCF_ENA);
else if ((ifp->if_flags & IFF_ALLMULTI) != 0) {
+ mode &= ~(GM_RXCR_MCF_ENA);
mchash[0] = 0xffff;
mchash[1] = 0xffff;
}
@@ -627,8 +627,12 @@
mode = GMAC_READ_2(sc, sc_if->msk_port, GM_RX_CTRL);
if (ifp->if_flags & IFF_PROMISC)
mode &= ~(GM_RXCR_UCF_ENA | GM_RXCR_MCF_ENA);
- else
+ else {
mode |= (GM_RXCR_UCF_ENA | GM_RXCR_MCF_ENA);
+ // ALLMULTI handling
+ if (ifp->if_flags & IFF_ALLMULTI)
+ mode &= ~(GM_RXCR_MCF_ENA);
+ }
GMAC_WRITE_2(sc, sc_if->msk_port, GM_RX_CTRL, mode);
}
@@ -934,7 +938,7 @@
if ((ifp->if_flags & IFF_UP) != 0) {
if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) {
if (((ifp->if_flags ^ sc_if->msk_if_flags)
- & IFF_PROMISC) != 0) {
+ & (IFF_PROMISC | IFF_ALLMULTI)) != 0)
{
msk_setpromisc(sc_if);
msk_setmulti(sc_if);
}
Both patches solves for us described problem with multicast routing on
FreeBSD7.0
But, if it is possible, as we are not too good with FreeBSD patching, cold
somebody review and do a sanity check for our patches, just in case we
have made a serios/simple mistekes? :)
Thank you
--=_mixed 0051374DC725746C_=
Content-Type: application/octet-stream; name="if_em.c.diff"
Content-Disposition: attachment; filename="if_em.c.diff"
Content-Transfer-Encoding: base64
LS0tIGlmX2VtLmMub3JpZwkyMDA3LTExLTI5IDA2OjI0OjM4LjAwMDAwMDAwMCArMDcwMAorKysg
aWZfZW0uYwkyMDA4LTA0LTI0IDE2OjQ5OjA0LjAwMDAwMDAwMCArMDgwMApAQCAtMTA4MCw3ICsx
MDgwLDcgQEAKIAkJaWYgKGlmcC0+aWZfZmxhZ3MgJiBJRkZfVVApIHsKIAkJCWlmICgoaWZwLT5p
Zl9kcnZfZmxhZ3MgJiBJRkZfRFJWX1JVTk5JTkcpKSB7CiAJCQkJaWYgKChpZnAtPmlmX2ZsYWdz
IF4gYWRhcHRlci0+aWZfZmxhZ3MpICYKLQkJCQkgICAgSUZGX1BST01JU0MpIHsKKwkJCQkgICAg
KElGRl9QUk9NSVNDIHwgSUZGX0FMTE1VTFRJKSkgewogCQkJCQllbV9kaXNhYmxlX3Byb21pc2Mo
YWRhcHRlcik7CiAJCQkJCWVtX3NldF9wcm9taXNjKGFkYXB0ZXIpOwogCQkJCX0KQEAgLTIzNzks
MTIgKzIzNzksMTQgQEAKIHN0YXRpYyB2b2lkCiBlbV9kaXNhYmxlX3Byb21pc2Moc3RydWN0IGFk
YXB0ZXIgKmFkYXB0ZXIpCiB7CisJc3RydWN0IGlmbmV0CSppZnAgPSBhZGFwdGVyLT5pZnA7CiAJ
dWludDMyX3QJcmVnX3JjdGw7CiAKIAlyZWdfcmN0bCA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVy
LT5odywgRTEwMDBfUkNUTCk7CiAKIAlyZWdfcmN0bCAmPSAgKH5FMTAwMF9SQ1RMX1VQRSk7Ci0J
cmVnX3JjdGwgJj0gICh+RTEwMDBfUkNUTF9NUEUpOworCWlmICghKGlmcC0+aWZfZmxhZ3MgJiBJ
RkZfQUxMTVVMVEkpKQorICAgIAkJcmVnX3JjdGwgJj0gICh+RTEwMDBfUkNUTF9NUEUpOwogCUUx
MDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX1JDVEwsIHJlZ19yY3RsKTsKIH0KIAo=
--=_mixed 0051374DC725746C_=
Content-Type: application/octet-stream; name="if_msk.c.diff"
Content-Disposition: attachment; filename="if_msk.c.diff"
Content-Transfer-Encoding: base64
LS0tIGlmX21zay5jLm9yaWcJMjAwNy0xMi0wOCAxOToxNjoxNC4wMDAwMDAwMDAgKzA3MDAKKysr
IGlmX21zay5jCTIwMDgtMDQtMjQgMTc6NTE6MDIuMDAwMDAwMDAwICswODAwCkBAIC01NTgsMTEg
KzU1OCwxMSBAQAogCiAJYnplcm8obWNoYXNoLCBzaXplb2YobWNoYXNoKSk7CiAJbW9kZSA9IEdN
QUNfUkVBRF8yKHNjLCBzY19pZi0+bXNrX3BvcnQsIEdNX1JYX0NUUkwpOwotCW1vZGUgfD0gR01f
UlhDUl9VQ0ZfRU5BOwogCWlmICgoaWZwLT5pZl9mbGFncyAmIChJRkZfUFJPTUlTQyB8IElGRl9B
TExNVUxUSSkpICE9IDApIHsKIAkJaWYgKChpZnAtPmlmX2ZsYWdzICYgSUZGX1BST01JU0MpICE9
IDApCiAJCQltb2RlICY9IH4oR01fUlhDUl9VQ0ZfRU5BIHwgR01fUlhDUl9NQ0ZfRU5BKTsKIAkJ
ZWxzZSBpZiAoKGlmcC0+aWZfZmxhZ3MgJiBJRkZfQUxMTVVMVEkpICE9IDApIHsKKwkJCW1vZGUg
Jj0gfihHTV9SWENSX01DRl9FTkEpOwogCQkJbWNoYXNoWzBdID0gMHhmZmZmOwogCQkJbWNoYXNo
WzFdID0gMHhmZmZmOwogCQl9CkBAIC02MjcsOCArNjI3LDEyIEBACiAJbW9kZSA9IEdNQUNfUkVB
RF8yKHNjLCBzY19pZi0+bXNrX3BvcnQsIEdNX1JYX0NUUkwpOwogCWlmIChpZnAtPmlmX2ZsYWdz
ICYgSUZGX1BST01JU0MpCiAJCW1vZGUgJj0gfihHTV9SWENSX1VDRl9FTkEgfCBHTV9SWENSX01D
Rl9FTkEpOwotCWVsc2UKKwllbHNlIHsKIAkJbW9kZSB8PSAoR01fUlhDUl9VQ0ZfRU5BIHwgR01f
UlhDUl9NQ0ZfRU5BKTsKKwkJLy8gQUxMTVVMVEkgaGFuZGxpbmcKKwkJaWYgKGlmcC0+aWZfZmxh
Z3MgJiBJRkZfQUxMTVVMVEkpCisJCQltb2RlICY9IH4oR01fUlhDUl9NQ0ZfRU5BKTsKKwl9CiAJ
R01BQ19XUklURV8yKHNjLCBzY19pZi0+bXNrX3BvcnQsIEdNX1JYX0NUUkwsIG1vZGUpOwogfQog
CkBAIC05MzQsNyArOTM4LDcgQEAKIAkJaWYgKChpZnAtPmlmX2ZsYWdzICYgSUZGX1VQKSAhPSAw
KSB7CiAJCQlpZiAoKGlmcC0+aWZfZHJ2X2ZsYWdzICYgSUZGX0RSVl9SVU5OSU5HKSAhPSAwKSB7
CiAJCQkJaWYgKCgoaWZwLT5pZl9mbGFncyBeIHNjX2lmLT5tc2tfaWZfZmxhZ3MpCi0JCQkJICAg
ICYgSUZGX1BST01JU0MpICE9IDApIHsKKwkJCQkgICAgJiAoSUZGX1BST01JU0MgfCBJRkZfQUxM
TVVMVEkpKSAhPSAwKSB7CiAJCQkJCW1za19zZXRwcm9taXNjKHNjX2lmKTsKIAkJCQkJbXNrX3Nl
dG11bHRpKHNjX2lmKTsKIAkJCQl9Cg==
--=_mixed 0051374DC725746C_=--
More information about the freebsd-net
mailing list