2008/688 Sun Cluster TCP/IP Hooks Update

Huafeng Lu Huafeng.Lv at Sun.COM
Thu Nov 13 18:35:54 PST 2008


? 2008?11?13? 22:33, James Carlson ??:
> Huafeng Lu writes:
>> To support the IP instance information, and to support future changes, 
>> we could change the API to use a TLV (type, length, value). We can put 
>> all paramters in a structure like:
>> 	typedef cl_hook_param {
>> 		int	cl_type;
>> 		size_t	cl_len;
>> 		uint8_t	cl_value[];
>> 	} cl_hook_param_t;
>> Thus, all future changes can be handled.
> 
> Not sure how that'd work, but I suggest discussing the issue with the
> other folks involved in the project and then bringing the completed
> proposal back for ARC review.
> 
> (My guess is that the 'types' defined effectively become part of the
> API itself, so the support for future changes given by that may be a
> little limited.)

Let me state it more clearly. The whole idea is illustrated below. We 
first define the following:

	typedef struct cl_hook_param {
		int	cl_type;
		uint8_t	cl_value[];
	} cl_hook_param_t;

	int (*cl_inet_connect2)(cl_hook_param_t *chp);

	typedef struct cl_hook_conn_param {
		int		type;
		netstackid_t	stack_id;
		uint8_t		protocol;
		boolean_t	is_outgoing;
		sa_family_t	family;
		uint8_t		*laddrp;
		in_port_t	lport;
		uint8_t		*faddrp;
		in_port_t	fport;
	} cl_hook_conn_param_t;

To call the hook, at Solaris side, we do:

	cl_hook_conn_param_t hp;

	hp.type = CL_HOOK_TYPE_CONN;
	hp.stack_id = id;
	hp.protocol = IPPROTO_TCP;
	...

	if ((err = cl_inet_connect2(&hp)) != 0)
		...

At Cluster side, the hook implementation looks like:

	int cl_inet_connect_impl(cl_hook_param_t *chp)
	{
		if (chp->cl_type == CL_HOOK_TYPE_CONN) {
			//get all arguments from chp->cl_value
		}
		...
	}

In the future, if we want to add or change some arguments, we only need 
to change cl_hook_conn_param_t, while the hook signature will remain 
unchanged.


One issue with this approach is that, all existing Solaris that calls 
the hook need big code change - each needs to switch to the 
cl_hook_xxx_param_t structure. An alternative is to keep all existing 
arguments and the netstackid_t outside cl_hook_xxx_param_t, so that this 
time all the hook only need to add a "NULL" argument.

Signature:
	int (*cl_inet_connect2)(netstackid_t stack_id,
	    uint8_t protocol, boolean_t is_outgoing,
	    sa_family_t addr_family,
	    uint8_t *laddrp, in_port_t lport,
	    uint8_t *faddrp, in_port_t fport,
	    cl_hook_param_t *chp) = NULL;

How to call it for now (the last argument is NULL):
	err = (*cl_inet_connect2)(id, IPPROTO_TCP, ..., fport, NULL);

In the future, when something changes, they can be put into 
cl_hook_xxx_param_t and passed into the hook.



How do you think?
--
Huafeng



More information about the opensolaris-arc mailing list