[MINOR] pattern: add the "ipmask()" converting function

This converter can be applied on top of an IPv4-type pattern. It
applies a netmask which is suited for IP address storage and matching.
This can be used to make all hosts within a certain mask to share the
same table entries and as such use the same server.

The mask can be passed in dotted form (eg: 255.255.255.0) or in CIDR
form (eg: 24).
This commit is contained in:
Willy Tarreau 2010-01-26 18:01:41 +01:00
parent 9e92d327f7
commit d31d6eb89a
2 changed files with 28 additions and 0 deletions

View File

@ -6155,6 +6155,12 @@ The currently available list of transformations include :
after a string pattern fetch function or after a conversion
function returning a string type. The result is of type string.
ipmask(mask) Apply a mask to an IPv4 address, and use the result for lookups
and storage. This can be used to make all hosts within a
certain mask to share the same table entries and as such use
the same server. The mask can be passed in dotted form (eg:
255.255.255.0) or in CIDR form (eg: 24).
8. Logging
----------

View File

@ -536,6 +536,20 @@ int pattern_notusable_key(struct pattern_expr *expr, unsigned long table_type)
return 0;
}
/* Converts an argument string to an IPv4 mask stored in network byte order in
* arg_i. Returns non-zero in case of success, 0 on error.
*/
static int pattern_conv_arg_to_ipmask(const char *arg_str, void **arg_p, int *arg_i)
{
struct in_addr mask;
if (!str2mask(arg_str, &mask))
return 0;
*arg_i = mask.s_addr;
return 1;
}
/*****************************************************************/
/* Pattern format convert functions */
/*****************************************************************/
@ -562,10 +576,18 @@ static int pattern_conv_str2upper(const void *arg_p, int arg_i, union pattern_da
return 1;
}
/* takes the netmask in arg_i */
static int pattern_conv_ipmask(const void *arg_p, int arg_i, union pattern_data *data)
{
data->ip.s_addr &= arg_i;
return 1;
}
/* Note: must not be declared <const> as its list will be overwritten */
static struct pattern_conv_kw_list pattern_conv_kws = {{ },{
{ "upper", pattern_conv_str2upper, PATTERN_TYPE_STRING, PATTERN_TYPE_STRING },
{ "lower", pattern_conv_str2lower, PATTERN_TYPE_STRING, PATTERN_TYPE_STRING },
{ "ipmask", pattern_conv_ipmask, PATTERN_TYPE_IP, PATTERN_TYPE_IP, pattern_conv_arg_to_ipmask },
{ NULL, NULL, 0, 0 },
}};