data->config_options = g_list_delete_link(data->config_options, list);
}
+static struct ppp_option *extract_ppp_option(guint8 *packet_data)
+{
+ struct ppp_option *option;
+ guint8 otype = packet_data[0];
+ guint8 olen = packet_data[1];
+
+ option = g_try_malloc0(olen);
+ if (option == NULL)
+ return NULL;
+
+ option->type = otype;
+ option->length = olen;
+ memcpy(option->data, &packet_data[2], olen-2);
+ return option;
+}
+
static guint8 pppcp_process_configure_request(struct pppcp_data *data,
struct pppcp_packet *packet)
{
* check the options.
*/
while (i < len) {
- guint8 otype = packet->data[i];
- guint8 olen = packet->data[i+1];
- option = g_try_malloc0(olen);
+ option = extract_ppp_option(&packet->data[i]);
if (option == NULL)
break;
- option->type = otype;
- option->length = olen;
- memcpy(option->data, &packet->data[i+2], olen-2);
+
+ /* skip ahead to the next option */
+ i += option->length;
+
if (action->option_scan)
rval = action->option_scan(option, data);
switch (rval) {
option);
break;
case OPTION_ERR:
- g_printerr("unhandled option type %d\n", otype);
+ g_printerr("unhandled option type %d\n", option->type);
+ g_free(option);
}
- /* skip ahead to the next option */
- i += olen;
}
/* make sure all required config options were included */
* and apply them.
*/
while (i < len) {
- guint8 otype = packet->data[i];
- guint8 olen = packet->data[i + 1];
- acked_option = g_try_malloc0(olen);
+ acked_option = extract_ppp_option(&packet->data[i]);
if (acked_option == NULL)
break;
- acked_option->type = otype;
- acked_option->length = olen;
- memcpy(acked_option->data, &packet->data[i + 2], olen - 2);
list = g_list_find_custom(data->config_options,
- GUINT_TO_POINTER((guint) otype), is_option);
+ GUINT_TO_POINTER((guint) acked_option->type),
+ is_option);
if (list) {
/*
* once we've applied the option, delete it from
g_list_delete_link(data->config_options, list);
} else
g_printerr("oops -- found acked option %d we didn't request\n", acked_option->type);
- g_free(acked_option);
/* skip ahead to the next option */
- i += olen;
+ i += acked_option->length;
+
+ g_free(acked_option);
}
return RCA;
}
* modify a value there, or add a new option.
*/
while (i < len) {
- guint8 otype = packet->data[i];
- guint8 olen = packet->data[i+1];
- naked_option = g_try_malloc0(olen);
+ naked_option = extract_ppp_option(&packet->data[i]);
if (naked_option == NULL)
break;
- naked_option->type = otype;
- naked_option->length = olen;
- memcpy(naked_option->data, &packet->data[i + 2], olen - 2);
+
+ /* skip ahead to the next option */
+ i += naked_option->length;
+
if (action->option_scan)
rval = action->option_scan(naked_option, data);
if (rval == OPTION_ACCEPT) {
* match.
*/
list = g_list_find_custom(data->config_options,
- GUINT_TO_POINTER((guint) otype), is_option);
+ GUINT_TO_POINTER((guint) naked_option->type),
+ is_option);
if (list) {
/* modify current option value to match */
config_option = list->data;
* we need to reallocate
*/
if ((config_option->length ==
- naked_option->length) && (olen - 2)) {
+ naked_option->length) &&
+ (naked_option - 2)) {
memcpy(config_option->data,
- naked_option->data,
- olen - 2);
+ naked_option->data,
+ naked_option->length - 2);
} else {
/* XXX implement this */
g_printerr("uh oh, option value doesn't match\n");
g_printerr("oops, option wasn't acceptable\n");
g_free(naked_option);
}
-
- /* skip ahead to the next option */
- i += olen;
}
return RCN;
}