On 28/12/17 11:58 pm, John Lyon wrote:
Julian,

That looks exactly like what I want! It also looks like what I thought I was doing.  I have no idea why it worked for you and not for me.  :-(

I will copy and paste tonight after work (making changes for em0 and em1 on my own test system) and see if I can get it to work.  If it works, I will figure out what I was doing wrong and let the world know in case anyone wants to Google it in the future. If it doesn't work -- I'll be back. :-)

To answer your other questions:

(1) EAP (or more accurately in this case EAPOL) is the extensible authentication protocol over LAN and is used for 802.1X port authentication.  The authentication frames are marked with the ethertype 0x888e to distinguish them from other Ethernet frames.  They are also assigned the broadcast MAC address of 01:80:c2:00:00:03. Because 802.1D states that a standard compliant switch or bridge cannot forward frames with a MAC address inthe range of 01:80:c2:00:00:00 to 01:80:c2:00:00:0f, you can't just create a bridge in FreeBSD between the two interfaces since the FreeBSD bridge code is standard compliant.  So I have to process and forward the frames another way and it looks like Netgraph will let me do it.  Otherwise, I'm going to have to patch the bridge code in the kernel to include a sysctl variable that enables or disables this compliance.
or use the netgraph bridge. ng_bridge. it doesn't care as far as I know. it's job it to produce "bump in the wire" devices.
see /usr/share/examples/netgraph.


(2) You are correct that there are return frames (not packets as this all occurs at layer 2). However, the graph to handle the return frames is going to just be a mirror of the the graph for processing the outgoing frames.  So if I can get it working in one direction, it's trivial to create a mirror image graph for the reverse direction.

Thanks!





--------------------------------
John L. Lyon
PGP Key Available At:
https://www.dropbox.com/s/skmedtscs0tgex7/02150BFE.asc

On Thu, Dec 28, 2017 at 8:59 AM, Julian Elischer <jul...@freebsd.org <mailto:jul...@freebsd.org>> wrote:

    On 28/12/17 1:37 am, John Lyon wrote:
    Julian,

    Unfortunately, this issue remains unresolved. I would like to
    think that this is just a PEBKAC issue, but I have tried every
    permutation of escape characters in case it's an issue with my
    syntax and I get the same set of errors.  No matter what I do,
    I can't connect the no match hook of an ETF node to the upper
    hook of an ng_ether node.  Do you have any insights into why
    this might be occurring?

    By the way, thanks for reaching out to me!  I was going to
    email you directly after the holidays since your name and email
    address are at the bottom of the relevant Netgraph man pages. 
    I figured that must mean if you didn't know the answer, no one
    does. :-)

    what is EAP?
    what about return EAP packets? (are there any?)

    I think this is what you want:
    $ sudo ngctl list
    There are 7 total nodes:
      Name: igb0            Type: ether           ID: 00000001   Num
    hooks: 0
      Name: igb1            Type: ether           ID: 00000002   Num
    hooks: 0
      Name: ix0             Type: ether           ID: 00000003   Num
    hooks: 0
      Name: ix1             Type: ether           ID: 00000004   Num
    hooks: 0
      Name: tap0            Type: ether           ID: 00000005   Num
    hooks: 0
      Name: bridge3         Type: ether           ID: 00000006   Num
    hooks: 0
      Name: ngctl7372       Type: socket          ID: 00000007   Num
    hooks: 0
    $ sudo kldload ng_etf
    $ sudo ngctl name ix0:lower eapfilter
    $ sudo ngctl connect eapfilter: ix0: nomatch upper
    $ sudo ngctl connect eapfilter: ix1: eapout lower
    $ sudo ngctl show eapfilter:
      Name: eapfilter       Type: etf             ID: 00000021   Num
    hooks: 3
      Local hook      Peer name       Peer type Peer ID         Peer
    hook
      ----------      ---------       --------- -------        
    ---------
      eapout          ix1             ether 00000004        lower
      nomatch         ix0             ether 00000003        upper
      downstream      ix0             ether 00000003        lower
    $ sudo ngctl msg eapfilter: 'setfilter { matchhook="eapout"
    ethertype=0x888e }'
    $




    Thanks.


    --------------------------------
    John L. Lyon
    PGP Key Available At:
    https://www.dropbox.com/s/skmedtscs0tgex7/02150BFE.asc
    <https://www.dropbox.com/s/skmedtscs0tgex7/02150BFE.asc>

    On Wed, Dec 27, 2017 at 10:32 AM, Julian Elischer
    <jul...@freebsd.org <mailto:jul...@freebsd.org>> wrote:

        John did you get a resolution to this issue?


        On 16/12/17 2:59 am, John Lyon wrote:

            Harry and Eugene (and others),

            I appreciate all of your help.  It's been really
            insightful.  Although I
            feel like I'm getting much closer to the solution, I
            don't think my problem
            has been diagnosed.  I've outlined my thought process
            below.  Can you
            please tell me if I am misunderstanding something? 
            Admittedly, I am not a
            kernel developer and my C language skills have
            atrophied the last few
            years.  However, I've reviewed my script and I looked
            in the code for
            ng_etf.c and I don't think I am violating any of the
            requirements for
            linking a hook for no match.

            As Eugene stated:

                    1) referenced "matchook" exists and you should
                    not use "indirect name"

            here,

                    only hook own name, or else you get error
                    ENOENT (No such file or

            directory);

            This does not seem to be a problem as the upper and
            lower hooks for the em1
            already exist (I can confirm this).

                    2) referenced "matchook" is *not* downstream
                    hook, or else you get error
                    EINVAL (Invalid argument);

            I read the ng_etf.c file in the source tree and found
            this little snippet:

            /* and is not the downstream hook */
            if (hook == etfp->downstream_hook.hook) {
                 error = EINVAL;
                 break;
            }

            This appears to be an error check to make sure you are
            not creating a cycle
            in the graph by referencing the ETF node's own
            downstream hook (i.e.
            filtering incoming traffic and circularly feeding
            non-matching frames back
            into the ETF's own filter).  I'm not doing this.  I am
            feeding non-matching
            packets into the *lower* hook of another ether node and
            not back into the
            *downstream* hook of the etf node I am creating.  As a
            result, my netgraph
            should not be triggering this error condition.

                    3) it was not already configured, or else you
                    get error EEXIST (File

            exists).

            I am not getting this error, so it appears not to be an
            issue in my case.

            What am I missing here?  The man page states that "*any
            other *hook" can be

            used for the non-matching packets.  So the man page
            says this should work,
            and there's no explicit error condition that I see
            (caveat, I have not
            written in C for at least 10 years  - PEBKAC is
            entirely possible) that
            would be triggered in the ng_etf code. So what is going
            wrong?

            Thanks for all of your help, patience, and understanding.


            --------------------------------
            John L. Lyon
            PGP Key Available At:
            https://www.dropbox.com/s/skmedtscs0tgex7/02150BFE.asc
            <https://www.dropbox.com/s/skmedtscs0tgex7/02150BFE.asc>

            On Fri, Dec 15, 2017 at 3:48 AM, Harry Schmalzbauer
            <free...@omnilan.de <mailto:free...@omnilan.de>>
            wrote:

                Bezüglich Eugene Grosbein's Nachricht vom
                14.12.2017 23:07 (localtime):

                    15.12.2017 4:27, John Lyon wrote:

                                I'm a new Netgraph user, but am
                                having some problems with a simple
                                Netgraph
                                script I have written.
                                Unfortunately, the error message is
                                cryptic

                and I

                                can't tell what I am doing wrong
                                since my script closely follows the
                                example provided in the ng_etf man
                                page.

                                For some context, I'm trying to
                                filter EAP traffic coming in on my LAN
                                interface.  Any ethernet frames
                                that correspond to EAP traffic need

                to be

                                immediately forwarded from the LAN
                                interface to my WAN interface.  All
                                other ethernet frames coming in on
                                my LAN interface need to be

                handled by

                                the kernel's network stack.  A
                                (horrid) ASCII art representation of my
                                desired netgraph would look like this:

                                lower -> em0 -> downstream -> ETF
                                -> no match -> upper em0
                                -> match ->
                                lower em1

                                The script I have written is this:

                                     #! /bin/sh
                                     ngctl mkpeer em0: etf lower
                                downstream
                                     ngctl name em0:lower lan_filter
                                     ngctl connect em0: lan_filter:
                                upper nomatch
                                     ngctl msg lan_filter:
                                setfilter { matchhook="em1:lower"
                                ethertype=0x888e }

                                Unfortunately, the last line of my
                                script generates the following

                error

                                message:

                                     ngctl: send msg: Invalid Argument

                    For "setfilter" command to work, ng_etf
                    requires that:

                    1) referenced "matchook" exists and you should
                    not use "indirect name"

                here,

                    only hook own name, or else you get error
                    ENOENT (No such file or

                directory);

                    2) referenced "matchook" is *not* downstream
                    hook, or else you get error
                    EINVAL (Invalid argument);
                    3) it was not already configured, or else you
                    get error EEXIST (File

                exists).

                Eugene kindly looked into the code and found that
                the error is due to
                wrong matchhook definition.
                I've never had any contact with ng_etf yet, but
                according to the man
                page, you need to set the (additional) filter hook
                by 'nghook -a
                lan_filter: mydrain' and use 'matchhook=mydrain'
                for the 'msg' command.

                Do idea about the intention, so for the rest you
                have to tweak as needed.

                -harry


            _______________________________________________
            freebsd-net@freebsd.org
            <mailto:freebsd-net@freebsd.org> mailing list
            https://lists.freebsd.org/mailman/listinfo/freebsd-net
            <https://lists.freebsd.org/mailman/listinfo/freebsd-net>
            To unsubscribe, send any mail to
            "freebsd-net-unsubscr...@freebsd.org
            <mailto:freebsd-net-unsubscr...@freebsd.org>"







_______________________________________________
freebsd-net@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "freebsd-net-unsubscr...@freebsd.org"

Reply via email to