Using the dummy0 interface for a local-only service to be broadcasted by Avahi
Till Kamppeter
till.kamppeter at gmail.com
Mon Dec 19 15:00:07 UTC 2016
[ TL;DR: Skip to "Adding dummy0 interface to the distro" ]
Hi,
as most of you know I am working on the printing stack, and one part of
it is IPP-over-USB. IPP is the Internet Printing Protocol, a
sophisticated network protocol to access printers and multi-function
devices in a way that one cannot only send out print jobs, but also
monitor their status, and especially poll capability info from the
printers. The latter allows for using printers without drivers (=
printer-model-specific software and/or data) as long as the printer
knows a standardized language.
To not confine IPP and so driverless printing to network printers,
IPP-over-USB was introduced, which allows to use IPP also on
USB-connected printers. For this I am maintaining ippusbxd:
https://github.com/tillkamppeter/ippusbxd
In the beginning, I simply mirrored an IPP-over-USB printer to
localhost:60000 (and following ports if there is more than one printer)
so that the IPP backend of CUPS can access it like a network printer.
Then I ran into a problem: Printer setup tools like
system-config-printer and the built-in CUPS tool http://localhost:631/
do not auto-discover a printer on localhost:60000 also cups-browsed, a
daemon to auto-setup network printers does not discover such a printer.
The auto discovery is done via Bonjour (Avahi on Linux) and ippusbxd is
not broadcasting the printers via Avahi.
Now I added the Avahi broadcasting to ippusbxd and ran into another
problem: Avahi does not broadcast on the loopback interface "lo". So it
cannot broadcast a service on localhost (note that I only want to
broadcast it on the local machine, not on the network). "lo" does not
support multicast devices.
So I googled and posted on the Avahi mailing list and ended up with
http://unix.stackexchange.com/questions/151980/how-can-i-use-avahi-without-a-network-connection
making me try the "dummy0" device and it works for me (after adding
functionality for selecting the interface to broadcast on to ippusbxd).
I add the interface
sudo modprobe dummy
sudo ifconfig dummy0 10.0.0.1 netmask 255.255.255.0 multicast
sudo ifconfig dummy0 up multicast
and then run ippusbxd like that:
ippusbxd -v 0x03F0 -m 0xC211 -p 60000 -i dummy0
This mirrors the USB printer with VID 0x03F0 and PID 0xC211 to
10.0.0.1:60000 and broadcasts it only on my local machine via
Bonjour/Avahi. cups-browsed picks up the broadcast and auto-creates a
driverless print queue for this printer then.
Adding dummy0 interface to the distro
-------------------------------------
What I would like to do is to add the "dummy0" interface as a
local-only, multicast interface to the distro, either as a default part
like "lo" or initiated by the maintainer scripts of the ippusbxd Debian
package (or the printing snap).
WDYT?
Does it cause any problems using "dummy0" for a production purpose? Is
there any better way? Perhaps even one which would allow me to work with
localhost?
How should I implement this? Simply run above commands from maintainer
scripts of ippusbxd? Get them run when the first IPP-over-USB printer is
detected via UDEV? Or implementation in network-manager or so?
Till
More information about the ubuntu-devel
mailing list