function guifi_radio_add_wds_submit(&$form, &$form_state) { $radio_id = $form_state['clicked_button']['#parents'][1]; $interface_id = $form_state['clicked_button']['#parents'][3]; guifi_log(GUIFILOG_TRACE, sprintf("function guifi_radio_add_wds(Radio: %d, Interface: %d)", $radio_id, $interface_id), $form_state['clicked_button']['#parents']); $form_state['rebuild'] = TRUE; $form_state['action'] = 'guifi_radio_add_wds_form'; // get list of the current used ips $ips_allocated = guifi_ipcalc_get_ips('0.0.0.0', '0.0.0.0', $form_state['values'], 2); $newif = _guifi_radio_add_wds_get_new_interface($form_state['values']['nid'], $ips_allocated); if ($newif == -1) { drupal_set_message(t('Unable to create link, no networks available'), 'warning'); return FALSE; } // Initialize filters $form_state['filters'] = array('dmin' => 0, 'dmax' => 15, 'search' => NULL, 'type' => 'wds', 'mode' => $form_state['values']['radios'][$radio_id]['mode'], 'from_node' => $form_state['values']['nid'], 'from_device' => $form_state['values']['id'], 'from_radio' => $radio_id, 'azimuth' => "0,360"); $form_state['newInterface'][$interface_id]['ipv4'][] = $newif; return TRUE; }
/** * * @param GuifiAPI $gapi GuifiAPI object * * @param mixed[] $parameters * * @return */ function guifi_api_link_add($gapi, $parameters) { if (!guifi_api_check_fields($gapi, array('from_device_id', 'from_radiodev_counter'), $parameters)) { return FALSE; } $from_device_id = $parameters['from_device_id']; $from_radiodev_counter = $parameters['from_radiodev_counter']; $from_device = guifi_device_load($from_device_id); if (!$from_device['id']) { $gapi->addError(500, "from_device not found: {$from_device_id}"); return FALSE; } if (!guifi_device_access('update', $from_device)) { $gapi->addError(501); return FALSE; } if (!guifi_api_check_fields($gapi, array('to_device_id', 'to_radiodev_counter'), $parameters)) { return FALSE; } $to_device_id = $parameters['to_device_id']; $to_radiodev_counter = $parameters['to_radiodev_counter']; $to_device = guifi_device_load($to_device_id); if (!$to_device['id']) { $gapi->addError(500, "to_device not found: {$to_device_id}"); return FALSE; } $from_radio =& $from_device['radios'][$from_radiodev_counter]; if ($from_radio['mode'] == 'client') { $from_interface_id = array_pop(array_keys($from_radio['interfaces'])); $from_interface =& $from_device['radios'][$from_radiodev_counter]['interfaces'][$from_interface_id]; } else { if ($from_radio['mode'] == 'ap') { // If radio mode is AP, find the wds/p2p interface (could be others, like wLan/Lan) foreach ($from_radio['interfaces'] as $from_interface_id => $from_interface) { if ($from_interface['interface_type'] == 'wds/p2p') { break; } } } } if (!_guifi_api_link_check_parameters($gapi, $parameters)) { return FALSE; } // Check if the link is allowed // Between Wan and wLan - wLan/Lan? if ($from_interface['interface_type'] == 'Wan') { /* client2ap link */ if (!empty($from_interface['ipv4'])) { $gapi->addError(404, "radio already has a link: {$from_radiodev_counter}"); return FALSE; } $ipv4 = _guifi_radio_add_link2ap($to_device['nid'], $to_device_id, $to_radiodev_counter, $parameters['ipv4'], -1); $gapi->addResponseField('ipv4', $ipv4); if ($ipv4 == -1) { $str = "radio is full or IPv4 parameters are wrong"; if ($parameters['ipv4']) { $str .= " (ipv4: {$parameters['ipv4']})"; } $gapi->addError(404, $str); return FALSE; } $ipv4['links'][-1]['flag'] = $parameters['flag']; $from_interface['ipv4'][] = $ipv4; guifi_device_save($from_device); $from_device = guifi_device_load($from_device['id']); $from_interface = array_pop($from_device['radios'][$from_radiodev_counter]['interfaces']); $link_id = array_pop(array_keys($from_interface['ipv4'][0]['links'])); $ipv4_return = array(); $ipv4_return['ipv4_type'] = $ipv4['ipv4_type']; $ipv4_return['ipv4'] = $ipv4['ipv4']; $ipv4_return['netmask'] = $ipv4['netmask']; $gapi->addResponseField('link_id', $link_id); $gapi->addResponseField('ipv4', $ipv4_return); return TRUE; } else { if ($from_interface['interface_type'] == 'wds/p2p') { /* WDS link */ $new_interface = array(); $new_interface[$from_interface_id]['ipv4'][] = _guifi_radio_add_wds_get_new_interface($from_device['nid']); $new_link =& $new_interface[$from_interface_id]['ipv4'][0]['links'][0]; $new_link['id'] = -1; $new_link['flag'] = $parameters['flag']; if (!empty($parameters['routing'])) { $new_link['routing'] = $parameters['routing']; } // getting remote interface $remote_interface = db_fetch_array(db_query("SELECT id FROM {guifi_interfaces} WHERE device_id = %d AND interface_type = 'wds/p2p' AND radiodev_counter = %d", $to_device['id'], $to_radiodev_counter)); $new_link['nid'] = $to_device['nid']; $new_link['device_id'] = $to_device['id']; $new_link['interface']['id'] = $remote_interface['id']; $new_link['interface']['device_id'] = $to_device['id']; $new_link['interface']['radiodev_counter'] = $to_radiodev_counter; $new_link['interface']['ipv4']['interface_id'] = $remote_interface['id']; foreach ($new_interface[$from_interface_id]['ipv4'] as $newInterface) { $from_device['radios'][$from_radiodev_counter]['interfaces'][$from_interface_id]['ipv4'][] = $newInterface; } guifi_device_save($from_device); $from_device = guifi_device_load($from_device['id']); $from_interface = array_pop($from_device['radios'][$from_radiodev_counter]['interfaces']); $ipv4 = array_pop($from_interface['ipv4']); $link_id = array_pop(array_keys($ipv4['links'])); $ipv4_return = array(); $ipv4_return['ipv4_type'] = $ipv4['ipv4_type']; $ipv4_return['ipv4'] = $ipv4['ipv4']; $ipv4_return['netmask'] = $ipv4['netmask']; $gapi->addResponseField('link_id', $link_id); $gapi->addResponseField('ipv4', $ipv4_return); return TRUE; } else { $gapi->addError(404, "interface doesn't allow to create the link. from_interface_type = {$from_interface['interface_type']}"); return FALSE; } } }