示例#1
0
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;
}
示例#2
0
/**
 *
 * @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;
        }
    }
}