Hi,
your analysis is correct. Yet, it is flawed: incoming packet buffers are a myth.
What follows is applicable to ns-3 AND real systems.
When a packet is received by a NetDevice, the corresponding callback is fired. It may be NonPromiscReceiveFromDevice and it may be *also* PromiscReceiveFromDevice (they could be called both).
This, in turns, will call other functions to handle the packet, and the packet is "consumed" by the upper layer.
If the node is a router, the packet will be analyzed and, depending on the routing and forwarding protocols, it will be placed in the outgoing queue of another NetDevice.
It is pretty obvious that the IS a "buffer" for the incoming packet, but it is just one packet long.
The reason is different between ns-3 and a real system.
In ns-3 the CPU time is not modeled. While the transmission protocols will make the time advance, the CPU time required to process a packet is not modeled. As a consequence, all the packets are processed in no time.
In a real system this is not true. While you are deciding what to do with a packet, another one may arrive. In this case you need an input queue, but not in ns-3, simply because it would be always empty.
In order to see something in this input queue, you'd need to model the processing delay. Either it will be either empty or with one packet.
In a real system the input queue (buffer) exists, but it is not relevant either. If that buffer would be "decently" full (average more than 1), then the only conclusion would be: the router has been designed by an imbecile, the CPU is severely limited.
A different (totally different) approach is what happens in a switch. There you can decide to have the buffers in the input lines, and use a backpressure system from the output line to pick the packets. But it is "simply" a method to place the output queues in the input lines. Well, input and output and "mixed mode" queues are a larger topic, but it basically works like that.
Summarizing: you could place some queues in the input lines, but without a system to manage the packets in the correct way, they'll be always empty. Moreover, the queue size is always extremely dependent on HOW you implement the backpressure system.
Simply queueing a packet because the CPU is busy analyzing the previous one will make the queue almost always empty, and it will be just a (bad) measure of the incoming traffic. E.g., 1Gbps NIC with 100Mbps incoming traffic, average queue size 0.1 packets. Unless the CPU is really clogged (which is very difficult to simulate in ns-3).
I hope this helps,
T.
PS: you said "serve packet according to some queue model". THIS is the point: the model. If you have a model... you're extremely lucky and you can go ahead. You need a shim layer between the NetDevice and the upper layers. The easiest thing is to check the sixlowpan module, it does exactly that.