Revision 2d46e1e4
Added by Jean Cyr about 12 years ago
etc/inc/shaper.inc | ||
---|---|---|
2781 | 2781 |
/* mask parameters */ |
2782 | 2782 |
var $mask; |
2783 | 2783 |
var $noerror; |
2784 |
|
|
2785 |
var $ipv6allow; |
|
2786 |
|
|
2787 |
/* constructor */ |
|
2788 |
|
|
2789 |
function __construct() { |
|
2790 |
global $config; |
|
2791 |
if (isset($config['system']['ipv6allow'])) |
|
2792 |
$this->ipv6allow = True; |
|
2793 |
else |
|
2794 |
$this->ipv6allow = False; |
|
2795 |
|
|
2796 |
} |
|
2784 | 2797 |
|
2785 | 2798 |
/* Accessor functions */ |
2799 |
function IPV6Enabled() { |
|
2800 |
return $this->ipv6allow; |
|
2801 |
} |
|
2802 |
|
|
2786 | 2803 |
function SetLink($link) { |
2787 | 2804 |
$this->link = $link; |
2788 | 2805 |
} |
... | ... | |
2859 | 2876 |
} |
2860 | 2877 |
|
2861 | 2878 |
function build_javascript() { |
2862 |
$javascript .= "<script type=\"text/javascript\"> \n";
|
|
2879 |
$javascript .= "<script type=\"text/javascript\">\n"; |
|
2863 | 2880 |
$javascript .= "//<![CDATA[\n"; |
2864 |
$javascript .= "function enable_maskbits(enable_over) { \n";
|
|
2865 |
$javascript .= "var e = document.getElementById(\"mask\"); \n";
|
|
2866 |
$javascript .= "if ((e.options[e.selectedIndex].text == \"none\") || enable_over) { \n";
|
|
2881 |
$javascript .= "function enable_maskbits(enable_over) {\n"; |
|
2882 |
$javascript .= "var e = document.getElementById(\"mask\");\n"; |
|
2883 |
$javascript .= "if ((e.options[e.selectedIndex].text == \"none\") || enable_over) {\n"; |
|
2867 | 2884 |
$javascript .= "document.iform.maskbits.disabled = 1;\n"; |
2868 | 2885 |
$javascript .= "document.iform.maskbits.value = \"\";\n"; |
2869 |
$javascript .= "} else \n"; |
|
2886 |
if ($this->IPV6Enabled()) { |
|
2887 |
$javascript .= "document.iform.maskbitsv6.disabled = 1;\n"; |
|
2888 |
$javascript .= "document.iform.maskbitsv6.value = \"\";\n"; |
|
2889 |
} |
|
2890 |
$javascript .= "} else {\n"; |
|
2870 | 2891 |
$javascript .= "document.iform.maskbits.disabled = 0;\n"; |
2871 |
$javascript .= "} \n"; |
|
2892 |
if ($this->IPV6Enabled()) |
|
2893 |
$javascript .= "document.iform.maskbitsv6.disabled = 0;\n"; |
|
2894 |
$javascript .= "}}\n"; |
|
2872 | 2895 |
$javascript .= "//]]>\n"; |
2873 |
$javascript .= "</script>"; |
|
2896 |
$javascript .= "</script>\n";
|
|
2874 | 2897 |
return $javascript; |
2875 | 2898 |
} |
2876 | 2899 |
|
... | ... | |
2896 | 2919 |
$input_errors[] = gettext("Queue names must be alphanumeric and _ or - only."); |
2897 | 2920 |
if (!empty($data['name']) && !preg_match("/^[a-zA-Z0-9_-]+$/", $data['name'])) |
2898 | 2921 |
$input_errors[] = gettext("Queue names must be alphanumeric and _ or - only."); |
2899 |
if (isset($data['maskbits']) && ($data['maskbits'] <> "")) {
|
|
2922 |
if (isset($data['maskbits']) && ($data['maskbits'] <> "")) |
|
2900 | 2923 |
if ((!is_numeric($data['maskbits'])) || ($data['maskbits'] <= 0) || ($data['maskbits'] > 32)) |
2901 |
$input_errors[] = gettext("Bit mask must be blank or numeric value between 1 and 32."); |
|
2902 |
} |
|
2924 |
$input_errors[] = gettext("IPV4 bit mask must be blank or numeric value between 1 and 32."); |
|
2925 |
if ($this->IPV6Enabled()) |
|
2926 |
if (isset($data['maskbitsv6']) && ($data['maskbitsv6'] <> "")) { |
|
2927 |
if ((!is_numeric($data['maskbitsv6'])) || ($data['maskbitsv6'] <= 0) || ($data['maskbitsv6'] > 128)) |
|
2928 |
$input_errors[] = gettext("IPV6 bit mask must be blank or numeric value between 1 and 128."); |
|
2929 |
} |
|
2930 |
} |
|
2931 |
|
|
2932 |
function build_mask_rules(&$pfq_rule) { |
|
2933 |
$mask = $this->GetMask(); |
|
2934 |
if (!empty($mask['type'])) { |
|
2935 |
if ($mask['type'] <> 'none') |
|
2936 |
$pfq_rule .= " mask"; |
|
2937 |
switch ($mask['type']) { |
|
2938 |
case 'srcaddress': |
|
2939 |
if ($this->IPV6Enabled()) { |
|
2940 |
if (!empty($mask['bitsv6']) && ($mask['bitsv6'] <> "")) |
|
2941 |
$pfq_rule .= " src-ip6 /" . $mask['bitsv6']; |
|
2942 |
else |
|
2943 |
$pfq_rule .= " src-ip6 /128"; |
|
2944 |
} |
|
2945 |
if (!empty($mask['bits']) && ($mask['bits'] <> "")) |
|
2946 |
$pfq_rule .= sprintf(" src-ip 0x%x", gen_subnet_mask_long($mask['bits'])); |
|
2947 |
else |
|
2948 |
$pfq_rule .= " src-ip 0xffffffff"; |
|
2949 |
break; |
|
2950 |
case 'dstaddress': |
|
2951 |
if ($this->IPV6Enabled()) { |
|
2952 |
if (!empty($mask['bitsv6']) && ($mask['bitsv6'] <> "")) |
|
2953 |
$pfq_rule .= " dst-ip6 /" . $mask['bitsv6']; |
|
2954 |
else |
|
2955 |
$pfq_rule .= " dst-ip6 /128"; |
|
2956 |
} |
|
2957 |
if (!empty($mask['bits']) && ($mask['bits'] <> "")) |
|
2958 |
$pfq_rule .= sprintf(" dst-ip 0x%x", gen_subnet_mask_long($mask['bits'])); |
|
2959 |
else |
|
2960 |
$pfq_rule .= " dst-ip 0xffffffff"; |
|
2961 |
break; |
|
2962 |
default: |
|
2963 |
break; |
|
2964 |
} |
|
2965 |
} |
|
2903 | 2966 |
} |
2967 |
|
|
2904 | 2968 |
} |
2905 | 2969 |
|
2906 | 2970 |
class dnpipe_class extends dummynet_class { |
... | ... | |
3055 | 3119 |
$maskbits = $q['maskbits']; |
3056 | 3120 |
else |
3057 | 3121 |
$maskbits = ""; |
3058 |
$this->SetMask(array("type" => $masktype, "bits" => $maskbits)); |
|
3122 |
if (isset($q['maskbitsv6']) && $q['maskbitsv6'] <> "") |
|
3123 |
$maskbitsv6 = $q['maskbitsv6']; |
|
3124 |
else |
|
3125 |
$maskbitsv6 = ""; |
|
3126 |
$this->SetMask(array("type" => $masktype, "bits" => $maskbits, "bitsv6" => $maskbitsv6)); |
|
3059 | 3127 |
if (isset($q['buckets']) && $q['buckets'] <> "") |
3060 | 3128 |
$this->SetBuckets($q['buckets']); |
3061 | 3129 |
else |
... | ... | |
3138 | 3206 |
$pfq_rule .= " buckets " . $this->GetBuckets(); |
3139 | 3207 |
if ($this->GetDelay()) |
3140 | 3208 |
$pfq_rule .= " delay " . $this->GetDelay(); |
3209 |
$this->build_mask_rules($pfq_rule); |
|
3141 | 3210 |
|
3142 |
$mask = $this->GetMask(); |
|
3143 |
if (!empty($mask['type'])) { |
|
3144 |
switch ($mask['type']) { |
|
3145 |
case 'srcaddress': |
|
3146 |
$pfq_rule .= " mask src-ip 0x"; |
|
3147 |
if (!empty($mask['bits']) && ($mask['bits'] <> "")) |
|
3148 |
$pfq_rule .= sprintf("%x", gen_subnet_mask_long($mask['bits'])); |
|
3149 |
else |
|
3150 |
$pfq_rule .= "ffffffff"; |
|
3151 |
break; |
|
3152 |
case 'dstaddress': |
|
3153 |
$pfq_rule .= " mask dst-ip 0x"; |
|
3154 |
if (!empty($mask['bits']) && ($mask['bits'] <> "")) |
|
3155 |
$pfq_rule .= sprintf("%x", gen_subnet_mask_long($mask['bits'])); |
|
3156 |
else |
|
3157 |
$pfq_rule .= "ffffffff"; |
|
3158 |
break; |
|
3159 |
default: |
|
3160 |
break; |
|
3161 |
} |
|
3162 |
} |
|
3163 | 3211 |
$pfq_rule .= "\n"; |
3164 | 3212 |
|
3165 | 3213 |
if (!empty($this->subqueues) && count($this->subqueues) > 0) { |
... | ... | |
3339 | 3387 |
if ($mask['type'] == "none") |
3340 | 3388 |
$form .= " disabled"; |
3341 | 3389 |
$form .= " />"; |
3342 |
$form .= " mask bits (1-32)<br/>"; |
|
3390 |
$form .= " IPV4 mask bits (1-32)<br/>"; |
|
3391 |
if ($this->IPV6Enabled()) { |
|
3392 |
$form .= "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/ <input type=\"text\" class=\"formfld unknown\" size=\"2\" id=\"maskbitsv6\" name=\"maskbitsv6\" value=\""; |
|
3393 |
if ($mask['type'] <> "none") |
|
3394 |
$form .= $mask['bitsv6']; |
|
3395 |
$form .= "\""; |
|
3396 |
if ($mask['type'] == "none") |
|
3397 |
$form .= " disabled"; |
|
3398 |
$form .= " />"; |
|
3399 |
$form .= " IPV6 mask bits (1-128)<br/>"; |
|
3400 |
} |
|
3343 | 3401 |
$form .= "<span class=\"vexpl\">" . gettext("If 'source' or 'destination' slots is chosen, \n" |
3344 | 3402 |
. "leaving the mask bits blank will create one pipe per host. Otherwise specify \n" |
3345 | 3403 |
. "the number of 'one' bits in the subnet mask used to group multiple hosts \n" |
... | ... | |
3425 | 3483 |
$mask = $this->GetMask(); |
3426 | 3484 |
$cflink['mask'] = $mask['type']; |
3427 | 3485 |
$cflink['maskbits'] = $mask['bits']; |
3486 |
if ($this->IPV6Enabled()) |
|
3487 |
$cflink['maskbitsv6'] = $mask['bitsv6']; |
|
3488 |
else |
|
3489 |
$cflink['maskbitsv6'] = ""; |
|
3428 | 3490 |
$cflink['delay'] = $this->GetDelay(); |
3429 | 3491 |
} |
3430 | 3492 |
|
... | ... | |
3505 | 3567 |
$maskbits = $q['maskbits']; |
3506 | 3568 |
else |
3507 | 3569 |
$maskbits = ""; |
3508 |
$this->SetMask(array("type" => $masktype, "bits" => $maskbits)); |
|
3570 |
if (isset($q['maskbitsv6']) && $q['maskbitsv6'] <> "") |
|
3571 |
$maskbitsv6 = $q['maskbitsv6']; |
|
3572 |
else |
|
3573 |
$maskbitsv6 = ""; |
|
3574 |
$this->SetMask(array("type" => $masktype, "bits" => $maskbits, "bitsv6" => $maskbitsv6)); |
|
3509 | 3575 |
if (isset($q['weight']) && $q['weight'] <> "") |
3510 | 3576 |
$this->SetWeight($q['weight']); |
3511 | 3577 |
else |
... | ... | |
3538 | 3604 |
$pfq_rule .= " weight " . $this->GetWeight(); |
3539 | 3605 |
if ($this->GetBuckets()) |
3540 | 3606 |
$pfq_rule .= " buckets " . $this->GetBuckets(); |
3541 |
$mask = $this->GetMask(); |
|
3542 |
if (!empty($mask['type'])) { |
|
3543 |
switch ($mask['type']) { |
|
3544 |
case 'srcaddress': |
|
3545 |
$pfq_rule .= " mask src-ip 0x"; |
|
3546 |
if (!empty($mask['bits']) && ($mask['bits'] <> "")) |
|
3547 |
$pfq_rule .= sprintf("%x", gen_subnet_mask_long($mask['bits'])); |
|
3548 |
else |
|
3549 |
$pfq_rule .= "ffffffff"; |
|
3550 |
break; |
|
3551 |
case 'dstaddress': |
|
3552 |
$pfq_rule .= " mask dst-ip 0x"; |
|
3553 |
if (!empty($mask['bits']) && ($mask['bits'] <> "")) |
|
3554 |
$pfq_rule .= sprintf("%x", gen_subnet_mask_long($mask['bits'])); |
|
3555 |
else |
|
3556 |
$pfq_rule .= "ffffffff"; |
|
3557 |
break; |
|
3558 |
default: |
|
3559 |
break; |
|
3560 |
} |
|
3561 |
} |
|
3607 |
$this->build_mask_rules($pfq_rule); |
|
3562 | 3608 |
$pfq_rule .= "\n"; |
3563 | 3609 |
|
3564 | 3610 |
return $pfq_rule; |
... | ... | |
3619 | 3665 |
if ($mask['type'] == "none") |
3620 | 3666 |
$form .= " disabled"; |
3621 | 3667 |
$form .= " />"; |
3622 |
$form .= " mask bits (1-32)<br/>"; |
|
3668 |
$form .= " IPV4 mask bits (1-32)<br/>"; |
|
3669 |
if ($this->IPV6Enabled()) { |
|
3670 |
$form .= "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/ <input type=\"text\" class=\"formfld unknown\" size=\"2\" id=\"maskbitsv6\" name=\"maskbitsv6\" value=\""; |
|
3671 |
if ($mask['type'] <> "none") |
|
3672 |
$form .= $mask['bitsv6']; |
|
3673 |
$form .= "\""; |
|
3674 |
if ($mask['type'] == "none") |
|
3675 |
$form .= " disabled"; |
|
3676 |
$form .= " />"; |
|
3677 |
$form .= " IPV6 mask bits (1-128)<br/>"; |
|
3678 |
} |
|
3623 | 3679 |
$form .= "<span class=\"vexpl\">" . gettext("If 'source' or 'destination' slots is chosen, \n" |
3624 | 3680 |
. "leaving the mask bits blank will create one pipe per host. Otherwise specify \n" |
3625 | 3681 |
. "the number of 'one' bits in the subnet mask used to group multiple hosts \n" |
... | ... | |
3702 | 3758 |
$mask = $this->GetMask(); |
3703 | 3759 |
$cflink['mask'] = $mask['type']; |
3704 | 3760 |
$cflink['maskbits'] = $mask['bits']; |
3761 |
if ($this->IPV6Enabled()) |
|
3762 |
$cflink['maskbitsv6'] = $mask['bitsv6']; |
|
3763 |
else |
|
3764 |
$cflink['maskbitsv6'] = ""; |
|
3705 | 3765 |
} |
3706 | 3766 |
} |
3707 | 3767 |
|
Also available in: Unified diff
Allow IPV6 bandwidth limiter mask