kern/95417: ng_fec doesn't allow jumbo packets

Vladimir Ivanov wawa at yandex-team.ru
Thu Apr 6 15:30:30 UTC 2006


>Number:         95417
>Category:       kern
>Synopsis:       ng_fec doesn't allow jumbo packets
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Thu Apr 06 15:30:11 GMT 2006
>Closed-Date:
>Last-Modified:
>Originator:     Vladimir Ivanov
>Release:        RELENG_5
>Organization:
Yandex LLC
>Environment:
FreeBSD multiped.yandex.net 5.5-PRERELEASE FreeBSD 5.5-PRERELEASE #0: Tue Apr  4 11:56:54 MSD 2006     root at multiped.yandex.net:/usr/obj/usr/src/sys/MULTIPED-CORE  i386

>Description:
FEC (Etherchannel) interface doesn't allowed to use more than 1500 bytes MTU size.
The problem caused by bug in ng_fec.c
They use ether_ioctl to process SIOCSIFMTU ioctl call.

The patch allows to change MTU size according (and in sync) with bundled interfaces' capabilities.
>How-To-Repeat:
ifconfig fec0 mtu 1501
>Fix:
multiped:~$ cat ng_fec.c.patch
--- ng_fec.c.orig       Mon Aug 29 20:31:51 2005
+++ ng_fec.c    Wed Apr  5 20:36:18 2006
@@ -697,9 +697,29 @@ ng_fec_ioctl(struct ifnet *ifp, u_long c
        /* These two are mostly handled at a higher layer */
        case SIOCSIFADDR:
        case SIOCGIFADDR:
-       case SIOCSIFMTU:
                error = ether_ioctl(ifp, command, data);
                break;
+       case SIOCSIFMTU:
+                if ( (ifr->ifr_mtu < NG_FEC_MTU_MIN ) || (ifr->ifr_mtu > NG_FEC_MTU_MAX) ) {
+                        error = EINVAL;
+                } else {
+                       struct ng_fec_portlist  *p;
+                       struct ifnet    *bifp;
+                       TAILQ_FOREACH(p, &b->ng_fec_ports, fec_list) {
+                               bifp = p->fec_if;
+                               if ((bifp->if_ioctl)(bifp, SIOCSIFMTU, data)) {
+                                       error = EINVAL;
+                                       break;
+                               }
+
+                       }
+                       if (!error) {
+                               ifp->if_mtu = ifr->ifr_mtu;
+                               ng_fec_init(priv);
+                       }
+                }
+                break;
+

        /* Set flags */
        case SIOCSIFFLAGS:

>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list