tech-net archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: MPLS patches



David Young wrote:
MPLS decap/encap appears to be intricately entwined with ether_output,
ip_output, ip_input, et cetera.  That doesn't seem right.  Instead, I
think that there should be a pseudo-interface, mpls0, whose input/output
routines do decap/encap, respectively.  This de-clutters the IPv4/IPv6
stacks and the ethernet code, and it provides a location for tapping
packets with tcpdump before encapsulation and after decapsulation.


Hi,

I had an idea at one moment to create an pseudo-interface for every neighbor and route packets through those pseudo-interfaces. Also one single interface was a pre-option. But I don't think this will be very intuitive and I didn't see any vendor reporting something similar to this so I assume no one does it.

Also this raises another problem: I could do this if NetBSD would have a clear difference between control and forwarding but this is not the case and I don't want to change the ifa/p for a route without a very strong reason.

Btw, tcpdump decapsulates the MPLS frames and reports the inner IP packets generating an output like this:

13:32:20.880484 MPLS (label 20, exp 0, [S], ttl 64)
IP (tos 0x0, ttl 64, id 17838, offset 0, flags [none], proto UDP (17), length 71) 193.28.151.120.50013 > 193.28.151.5.53: [udp sum ok] 29453+ PTR? 2.116.208.68.in-addr.arpa. (43)

Are you interested in catching IP packets before shim push/pop for some other reasons ?

There are several fragments of code like this,

        if (m->m_len < sizeof (struct ip) &&
            (m = m_pullup(m, sizeof(struct ip))) == NULL)
                return ENOBUFS;

that should be written like this,

        if (M_UNWRITABLE(m, sizeof(struct ip)) &&
            (m = m_pullup(m, sizeof(struct ip))) == NULL)
                return ENOBUFS;

instead.

I'm not sure about that. True, I should check M_READONLY but in a mandatory way where I actually want to write data into that mbuf. But should I check if it's readonly for cases like the m_push_inet{6}() where I prepend and modify only the prepended data ?


Dave


--
Thanks,
Mihai



Home | Main Index | Thread Index | Old Index