[Ns-developers] virtual netdevice (Was: release update [feedback needed])

Gustavo Carneiro gjcarneiro at gmail.com
Fri Jun 12 02:31:33 PDT 2009


2009/6/11 Tom Henderson <tomh at tomh.org>

> Gustavo Carneiro wrote:
>
>>
>>
>> 2009/6/11 Gustavo Carneiro <gjcarneiro at gmail.com <mailto:
>> gjcarneiro at gmail.com>>
>>
>>
>>
>>    2009/6/11 Gustavo Carneiro <gjcarneiro at gmail.com
>>    <mailto:gjcarneiro at gmail.com>>
>>
>>        (changing subject or else a lot of disparate topics are mixed
>>        into the same thread!)
>>
>>        2009/6/10 Tom Henderson <tomh at tomh.org <mailto:tomh at tomh.org>>
>>
>>        [...]
>>
>>
>>
>>
>>                   Gustavo,
>>                   - I thought you were going to clean up the
>>                Receive/PromiscReceive
>>                   separate functions?
>>
>>
>>                I don't understand the concern here, or what I should
>>                do.  If I remove one of them, which one do I keep?  How
>>                can we be sure it's the right one?
>>
>>                 - Receive() is simpler to use and usually what we want,
>>                but does not support simulating frames received by a
>> bridge;
>>
>>                 - PromiscReceive takes more parameters, harder to use
>>                if you  want to do something simpler, but needed for
>>                certain scenarios.
>>
>>
>>            My comment was that all of the other net devices call the
>>            promisc callback out of Receive(), but here, the user has to
>>            pick PromiscReceive or Receive() and I'm not sure how he or
>>            she picks the right one.
>>
>>            Can you describe the use case for PromiscReceive?  You
>>            implied bridging but I'm not seeing it.
>>
>>
>>        I cannot possibly know all the use cases of VirtualNetDevice.
>>  However, not supporting PromiscReceive will mean that not all
>>        functionality of NetDevice is made available by
>>        VirtualNetDevice.  Indeed, one use case is a "virtual bridge
>>        port", i.e. a bridge port that is not physical but instead is,
>>        for example, a TCP link.  Why this scenario or others matter is
>>        not my job to point out, I just don't want to limit
>>        functionality if the cost of supporting the funcionality is
>>        low.  You seem to think the cost is high because having
>>        PromisReceive will confuse users.  I think the whole
>>        VirtualNetDevice is already for advanced users who know what
>>        they are doing.  That's one of the reasons why VirtualNetDevice
>>        does not have a "helper class".  The whole point is that
>>        subclassing NetDevice is _a lot_ of work, work that is not
>>        justified for certain kinds of scenarios, and VirtualNetDevice
>>        avoids subclassing.
>>
>>
>>    That being said, I realized later that it's impossible to align with
>>    CsmaNetDevice's trace sources without the information provided by
>>    PromiscReceive, so I removed Received and renamed PromiscReceive to
>>    Receive.  Also renamed SetSendFromCallback to SetSendCallback, for
>>    simplicity.  Pushed.
>>
>
> OK, I did not intend to force you to remove it if you thought it was
> useful; I was pointing out that you seemed to agree originally that this
> could have been rolled together (as it is now) but then did not change it.
>  My main point was that it seemed that users may be hard pressed to know
> whether promiscReceiveCallback or receiveCallback is set, and therefore
> which method to call.  I don't think there is any issue with your latest
> code since you merged them.


I couldn't help but merge them due to the csma trace sources that I copied
over to VirtualNetDevice needing more parameters than the non-promisc
Receive had to offer.

Even now things are not 100% aligned because CsmaNetDevice::PromiscSniffer
gives a packet with EthernetHeader included, while VirtualNetDevice does not
(because it would make it less generic if it was constrained to mac48
addresses), but it's the best that can be done.


>
>
>>    Unfortunately now the example program is failing with a packet tag
>>    error.  Any idea what could be wrong?
>>
>>
>> Replying to myself.  SocketAddressTag was being added twice when the
>> packet exists one UDP socket and is reinjected to enter another UDP socket,
>> and NS-3 does not like it.  Calling Packet::RemoveAllPacketTags took care of
>> it.
>>
>>
>
> this is perhaps a nit, but RemoveAllPacketTags() may have side effects for
> some users; does RemovePacketTag (SocketAddressTag) not work here?


Done.


-- 
Gustavo J. A. M. Carneiro
INESC Porto, Telecommunications and Multimedia Unit
"The universe is always one step beyond logic." -- Frank Herbert


More information about the Ns-developers mailing list