Project

General

Profile

« Previous | Next » 

Revision 2d46e1e4

Added by Jean Cyr about 12 years ago

Allow IPV6 bandwidth limiter mask

View differences:

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 .= "&nbsp; mask bits (1-32)<br/>";
3390
		$form .= "&nbsp; IPV4 mask bits (1-32)<br/>";
3391
                if ($this->IPV6Enabled()) {
3392
                        $form .= "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/&nbsp;<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 .= "&nbsp; 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 .= "&nbsp; mask bits (1-32)<br/>";
3668
		$form .= "&nbsp; IPV4 mask bits (1-32)<br/>";
3669
                if ($this->IPV6Enabled()) {
3670
                        $form .= "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/&nbsp;<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 .= "&nbsp; 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