[linux-dvb] [PATCH-REWORKED] frontend.h add dvb-s2 support including backwards compability

Felix Domke tmbinc at elitedvb.net
Fri Feb 24 13:45:53 CET 2006

Johannes Stezenbach wrote:
> On Wed, Feb 22, 2006, Marcel Siegert wrote:
>>once again same topic.
>>after short discussion with felix domke on irc, 
>>we found that the attached solution is more suitable.
> I'd actually prefer an extended definition of struct dvb_frontend_parameters
> with room for more parameters (e.g. to query DVB-T cell ids etc.), plus
> some padding to allow for future extensions.
> FE_SET_FRONTEND would be redefined to use the new struct, however
> it must be source code compatible (i.e. no changes to apps
> necessary, they should continue to work with identical capabilites
> if compiled against the new frontend.h).
> Binary compatibility can be retained by adding *_OLD cruft,
> see dvb/net.h for an example.
> What do you think?
This would basicly be Marcel's first idea, right?

In that idea, struct dvb_frontend_(parameters|event)_ex would be
fixed-size, and FE_(GET|SET)_FRONTEND_EX / FE_GET_EVENT_EX would operate
on that structure.

It would fix DVB-S2, but break for every new change. As you said, some
padding would help here, but only until there is a new scheme which
requires even larger parameter sets.

Now, the basic idea was to let FE_SET_FRONTEND(_EX) operate not on a
full dvb_frontend_parameters, but on a subset, i.e.
sizeof(frequency)+sizeof(inversion)+sizeof(struct dvb_<mode>_paramters).
That would make it possible to define new fields, without breaking old

(We could also define new dvb_<mode>_parameters which always include
frequency and inversion as first two fields with
dvb_<modulation>_parameters as backward compatbility without these
fields, as a side note)

Do you all agree with that until here?

Now, we could simply add a field into the "struct
dvb_frontend_parameters", say:

struct dvb_frontend_parameters_ex {
	int standard; /* new */
 	__u32 frequency;
	fe_spectral_inversion_t inversion;
 	union {
		struct dvb_dvbs_parameters qpsk;
		struct dvb_dvbc_parameters  qam;
		struct dvb_dvbt_parameters ofdm;
		struct dvb_dvbs2_parameters qpsk2;
 	} u;

Note that the size of this struct can grow when new standards are added.
All kernel stuff only uses the actually used structure, which is
indicated by the "standard"-field.

The "standard"-field had to be filled on a FE_SET_FRONTEND_EX. A call to
FE_GET_FRONTEND had to ensure that the same structure (size) as the last
call to FE_SET_FRONTEND_EX has to be used, same for FE_GET_EVENT.

Now, we had 3 more IOCTLs:
FE_SET_FRONTEND_EX (which uses the new "standard"-field)
FE_GET_FRONTEND_EX (which also uses the new struct, and is able to use
the new standard modes)
FE_GET_EVENT_EX    (which also uses the new struct)

Having a growing structure would be the only way to be scalable even for
new standards. We could always add more fields into that union. Older
applications, which define a smaller union, would still be compatible as
FE_GET_FRONTEND_EX only fills the appropriate number of bytes. Only when
a new standard is selected, more bytes would be written.

Note that, as written above, FE_GET_* has to use EXACTLY the same mode
(as set by the last FE_SET_FRONTEND_EX call) every time, otherwise the
application could have allocated a differently sized union. Plus an
application would not expect to tune on one standard, but get a
different standard back.

Now, as small modification to the above, i would introduce the
FE_SET_MODE (i would call it FE_SET_STANDARD), in order to replace the
"standard" field in the structure.

That would have a number of advantages:
 - We could keep the available IOCTLs. FE_SET_MODE set the required
mode, and FE_GET_FRONTEND etc. are 100% backward compatible when an
"old" standard is selected.
 - There is no special need to specify the FE_GET_FRONTEND/FE_GET_EVENT
behaviour. The whole frontend operates on the standard set by the
FE_SET_MODE ioctl.
 - Capabilities (for example, the symbol rate range, which typically
differs between DVB-S and DVB-S2) could change after a FE_SET_MODE
 - Combo frontends, for example DVB-S/DVB-T, could be handled fine. You
just switch them to the required standard.

Some notes to backward compatibility:

An application not prepared for a new standard would never select a
standard which doesn't fit into their idea of the union size. Thus this
would give backward compatibility (older apps with newer core).

Newer applications, selecting a standard which isn't available, would
detect that this standard is not available (FE_SET_MODE would fail).
This is also no problem.

Newer applications, running with an older dvb-core which doesn't know of
FE_SET_MODE would allocate the current size of the union. The older
dvb-core would copy sizeof(dvb_frontend_parameters), not the specialized
number of bytes (which could be less). This is also no problem - an
application should always use the "struct dvb_frontend_parameters".



More information about the linux-dvb mailing list