diff options
author | Stephen Hemminger <stephen.hemminger@vyatta.com> | 2010-10-13 12:17:45 -0700 |
---|---|---|
committer | Stephen Hemminger <stephen.hemminger@vyatta.com> | 2010-10-13 12:17:45 -0700 |
commit | bba82193be7225c078e007c99a1537b68ba68bb1 (patch) | |
tree | 7aefebdcf0650c02355478fd4dc84e53815fa428 | |
parent | c5c35050fca8396968b64f5bffe070ed2b293c32 (diff) | |
parent | 6bbaacf5f0cc1880006a75084539d773eda662ff (diff) | |
download | vyatta-cfg-bba82193be7225c078e007c99a1537b68ba68bb1.tar.gz vyatta-cfg-bba82193be7225c078e007c99a1537b68ba68bb1.zip |
Merge branch 'mendocino' of suva.vyatta.com:/git/vyatta-cfg into mendocino
-rw-r--r-- | Makefile.am | 1 | ||||
-rw-r--r-- | debian/changelog | 76 | ||||
-rwxr-xr-x | etc/bash_completion.d/20vyatta-cfg | 21 | ||||
-rwxr-xr-x | lib/Vyatta/Config.pm | 10 | ||||
-rwxr-xr-x | lib/Vyatta/Zone.pm | 208 | ||||
-rwxr-xr-x | scripts/vyatta-auto-irqaffin.pl | 88 | ||||
-rwxr-xr-x | scripts/vyatta-cfg-cmd-wrapper | 4 | ||||
-rw-r--r-- | src/cli_path_utils.c | 2 | ||||
-rw-r--r-- | src/commit2.c | 15 | ||||
-rw-r--r-- | src/cstore/cstore.cpp | 2 |
10 files changed, 204 insertions, 223 deletions
diff --git a/Makefile.am b/Makefile.am index cef450f..c5d29b1 100644 --- a/Makefile.am +++ b/Makefile.am @@ -89,7 +89,6 @@ share_perl5_DATA += lib/Vyatta/TypeChecker.pm share_perl5_DATA += lib/Vyatta/ConfigOutput.pm share_perl5_DATA += lib/Vyatta/ConfigLoad.pm share_perl5_DATA += lib/Vyatta/Keepalived.pm -share_perl5_DATA += lib/Vyatta/Zone.pm enum_SCRIPTS = scripts/enumeration/existing-interfaces diff --git a/debian/changelog b/debian/changelog index 03b86a3..cb6f1be 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,79 @@ +vyatta-cfg (0.17.30) unstable; urgency=low + + * change location tag for error from reference: to errloc: + * change error location tag from commit process + + -- root <root@vyatta-build2> Mon, 11 Oct 2010 15:51:37 -0700 + +vyatta-cfg (0.17.29) unstable; urgency=low + + * reference error location method in config module. + + -- root <root@vyatta-build> Fri, 08 Oct 2010 12:03:25 -0700 + +vyatta-cfg (0.17.28) unstable; urgency=low + + * Bugfix 5830: Teach auto affinity script to use new queue naming + scheme. + + -- Bob Gilligan <gilligan@vyatta.com> Fri, 08 Oct 2010 11:02:14 -0700 + +vyatta-cfg (0.17.27) unstable; urgency=low + + * moved code for zones to vyatta-zone package + + -- Mohit Mehta <mohit@vyatta.com> Thu, 07 Oct 2010 19:15:07 -0700 + +vyatta-cfg (0.17.26) unstable; urgency=low + + * * don't allow adding an interface to a zone that has content- + inspection enabled + + -- Mohit Mehta <mohit@vyatta.com> Wed, 06 Oct 2010 16:23:51 -0700 + +vyatta-cfg (0.17.25) unstable; urgency=low + + * add commit wrapper hook that allows errors with location to be + written to stdout. + + -- root <root@vyatta-build> Fri, 01 Oct 2010 09:58:30 -0700 + +vyatta-cfg (0.17.24) unstable; urgency=low + + * Pass optional commit comment through commit to commit hooks. + + -- Stig Thormodsrud <stig@vyatta.com> Fri, 01 Oct 2010 11:38:50 -0700 + +vyatta-cfg (0.17.23) unstable; urgency=low + + * Fix Bug 6225 Unable to assign a pppoe interface to zone + + -- Mohit Mehta <mohit@vyatta.com> Fri, 01 Oct 2010 11:15:14 -0700 + +vyatta-cfg (0.17.22) unstable; urgency=low + + * cleanup + + -- An-Cheng Huang <ancheng@vyatta.com> Fri, 24 Sep 2010 11:32:21 -0700 + +vyatta-cfg (0.17.21) unstable; urgency=low + + * fix for bug 6213. + + -- root <root@vyatta-build2> Fri, 24 Sep 2010 10:49:35 -0700 + +vyatta-cfg (0.17.20) unstable; urgency=low + + * * move count_iptables_rules to Iptables::Mgr module + + -- Mohit Mehta <mohit@vyatta.com> Tue, 21 Sep 2010 21:13:55 -0700 + +vyatta-cfg (0.17.19) unstable; urgency=low + + * * move count_iptables_rule to MISC module + + -- Mohit Mehta <mohit@vyatta.com> Tue, 21 Sep 2010 17:36:22 -0700 + vyatta-cfg (0.17.18) unstable; urgency=low * fix for bug 6195 diff --git a/etc/bash_completion.d/20vyatta-cfg b/etc/bash_completion.d/20vyatta-cfg index 98f26f8..fe21835 100755 --- a/etc/bash_completion.d/20vyatta-cfg +++ b/etc/bash_completion.d/20vyatta-cfg @@ -97,7 +97,22 @@ show () commit () { - if /opt/vyatta/sbin/my_commit "$@"; then + local comment="commit" + local next=0 + local -a args=() + for arg in "$@"; do + if [ "$next" == "1" ]; then + comment=$arg + next=0; + elif [ "$arg" == "comment" ]; then + next=1 + else + args[${#args[@]}]="$arg" + fi + done + args+=("-C '$comment'") + + if /opt/vyatta/sbin/my_commit "${args[@]}"; then vyatta_cli_shell_api markSessionUnsaved fi } @@ -683,11 +698,11 @@ vyatta_config_complete () if ! vyatta_cli_shell_api setupSession; then echo 'Failed to set up config session' - exit 1 + builtin exit 1 fi # disallow 'Ctrl-D' exit, since we need special actions on 'exit' -set -o ignoreeof 1 +builtin set -o ignoreeof 1 reset_edit_level alias set=/opt/vyatta/sbin/my_set diff --git a/lib/Vyatta/Config.pm b/lib/Vyatta/Config.pm index 6dfcc46..1488c3d 100755 --- a/lib/Vyatta/Config.pm +++ b/lib/Vyatta/Config.pm @@ -676,6 +676,16 @@ sub compareValueLists { return %comp_hash; } +sub outputError { + my ($self, $location, $msg) = @_; + print STDERR $msg . "\n"; + if (defined($ENV{VYATTA_OUTPUT_ERROR_LOCATION})) { + foreach my $elem (@$location) { + print STDERR "errloc:[" . $elem . "]\n"; + } + } +} + ############################################################ # API functions that have not been converted ############################################################ diff --git a/lib/Vyatta/Zone.pm b/lib/Vyatta/Zone.pm deleted file mode 100755 index 4b169b5..0000000 --- a/lib/Vyatta/Zone.pm +++ /dev/null @@ -1,208 +0,0 @@ -# Module: Zone.pm -# -# **** License **** -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 2 as -# published by the Free Software Foundation. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# This code was originally developed by Vyatta, Inc. -# Portions created by Vyatta are Copyright (C) 2009 Vyatta, Inc. -# All Rights Reserved. -# -# Author: Mohit Mehta -# Date: 2009 -# Description: vyatta zone management -# -# **** End License **** -# - -package Vyatta::Zone; - -use Vyatta::Config; -use Vyatta::Misc; -use Vyatta::Interface; - -use strict; -use warnings; - -my $debug="false"; -my $syslog="false"; -my $logger = 'sudo logger -t zone.pm -p local0.warn --'; - -sub run_cmd { - my $cmd = shift; - my $error = system("$cmd"); - - if ($syslog eq "true") { - my $func = (caller(1))[3]; - system("$logger [$func] [$cmd] = [$error]"); - } - if ($debug eq "true") { - my $func = (caller(1))[3]; - print "[$func] [$cmd] = [$error]\n"; - } - return $error; -} - -sub is_fwruleset_active { - my ($value_func, $ruleset_type, $fw_ruleset) = @_; - my $config = new Vyatta::Config; - return $config->$value_func("firewall $ruleset_type $fw_ruleset"); -} - -sub get_all_zones { - my $value_func = shift; - my $config = new Vyatta::Config; - return $config->$value_func("zone-policy zone"); -} - -sub get_zone_interfaces { - my ($value_func, $zone_name) = @_; - my $config = new Vyatta::Config; - return $config->$value_func("zone-policy zone $zone_name interface"); -} - -sub get_from_zones { - my ($value_func, $zone_name) = @_; - my $config = new Vyatta::Config; - return $config->$value_func("zone-policy zone $zone_name from"); -} - -sub get_firewall_ruleset { - my ($value_func, $zone_name, $from_zone, $firewall_type) = @_; - my $config = new Vyatta::Config; - return $config->$value_func("zone-policy zone $zone_name from $from_zone - firewall $firewall_type"); -} - -sub is_local_zone { - my ($value_func, $zone_name) = @_; - my $config = new Vyatta::Config; - return $config->$value_func("zone-policy zone $zone_name local-zone"); -} - -sub get_zone_default_policy { - my ($value_func, $zone_name) = @_; - my $config = new Vyatta::Config; - return $config->$value_func("zone-policy zone $zone_name default-action"); -} - -sub rule_exists { - my ($command, $table, $chain_name, $target, $interface) = @_; - my $cmd = - "sudo $command -t $table -L " . - "$chain_name -v 2>/dev/null | grep \" $target \" "; - if (defined $interface) { - $cmd .= "| grep \" $interface \" "; - } - $cmd .= "| wc -l"; - my $result = `$cmd`; - return $result; -} - -sub get_zone_chain { - my ($value_func, $zone, $localout) = @_; - my $chain = "VZONE_$zone"; - if (defined(is_local_zone($value_func, $zone))) { - # local zone - if (defined $localout) { - # local zone out chain - $chain .= "_OUT"; - } else { - # local zone in chain - $chain .= "_IN"; - } - } - return $chain; -} - -sub count_iptables_rules { - my ($command, $table, $chain) = @_; - my @lines = `sudo $command -t $table -L $chain -n --line`; - my $cnt = 0; - foreach my $line (@lines) { - $cnt++ if $line =~ /^\d/; - } - return $cnt; -} - -sub validity_checks { - my @all_zones = get_all_zones("listNodes"); - my @all_interfaces = (); - my $num_local_zones = 0; - my $returnstring; - foreach my $zone (@all_zones) { - # get all from zones, see if they exist in config, if not display error - my @from_zones = get_from_zones("listNodes", $zone); - foreach my $from_zone (@from_zones) { - if (scalar(grep(/^$from_zone$/, @all_zones)) == 0) { - $returnstring = "$from_zone is a from zone under zone $zone\n" . - "It is either not defined or deleted from config"; - return ($returnstring, ); - } - } - my @zone_intfs = get_zone_interfaces("returnValues", $zone); - if (scalar(@zone_intfs) == 0) { - # no interfaces defined for this zone - if (!defined(is_local_zone("exists", $zone))) { - $returnstring = "Zone $zone has no interfaces defined " . - "and it's not a local-zone"; - return($returnstring, ); - } - # zone defined as a local-zone - my @zone_intfs_orig = get_zone_interfaces("returnOrigValues", $zone); - if (scalar(@zone_intfs_orig) != 0) { - # can't change change transit zone to local-zone on the fly - $returnstring = "Zone $zone is a transit zone. " . - "Cannot convert it to local-zone.\n" . - "Please define another zone to create local-zone"; - return($returnstring, ); - } - $num_local_zones++; - # make sure only one zone is a local-zone - if ($num_local_zones > 1) { - return ("Only one zone can be defined as a local-zone", ); - } - } else { - # zone has interfaces, make sure it is not set as a local-zone - if (defined(is_local_zone("exists", $zone))) { - $returnstring = "local-zone cannot have interfaces defined"; - return($returnstring, ); - } - # make sure you're not converting local-zone to transit zone either - if (defined(is_local_zone("existsOrig", $zone))) { - $returnstring = "Cannot convert local-zone $zone to transit zone" . - "\nPlease define another zone for it"; - return($returnstring, ); - } - foreach my $interface (@zone_intfs) { - # make sure firewall is not applied to this interface - my $intf = new Vyatta::Interface($interface); - if ($intf) { - my $config = new Vyatta::Config; - $config->setLevel($intf->path()); - if ($config->exists("firewall")) { - $returnstring = - "interface $interface has firewall configured, " . - "cannot be defined under a zone"; - return($returnstring, ); - } - } - # make sure an interface is not defined under two zones - if (scalar(grep(/^$interface$/, @all_interfaces)) > 0) { - return ("$interface defined under two zones", ); - } else { - push(@all_interfaces, $interface); - } - } - } - } - return; -} - -1; diff --git a/scripts/vyatta-auto-irqaffin.pl b/scripts/vyatta-auto-irqaffin.pl index 43a6eb8..be29443 100755 --- a/scripts/vyatta-auto-irqaffin.pl +++ b/scripts/vyatta-auto-irqaffin.pl @@ -13,7 +13,7 @@ # General Public License for more details. # # This code was originally developed by Vyatta, Inc. -# Portions created by Vyatta are Copyright (C) 2009 Vyatta, Inc. +# Portions created by Vyatta are Copyright (C) 2009,2010 Vyatta, Inc. # All Rights Reserved. # # Author: Bob Gilligan (gilligan@vyatta.com) @@ -170,6 +170,75 @@ sub intel_func{ } }; + +# Affinity setting function for NICs using new intel queue scheme +# that provides one IRQ for each pair of TX and RX queues +sub intel_new_func{ + my ($ifname, $numcpus, $numcores) = @_; + my $txrx_queues; # number of rx/rx queue pairs + my $ht_factor; # 2 if HT enabled, 1 if not + + log_msg("intel_new_func was called.\n"); + + if ($numcpus > $numcores) { + $ht_factor = 2; + } else { + $ht_factor = 1; + } + + log_msg("ht_factor is $ht_factor.\n"); + + # Figure out how many queues we have + + $txrx_queues=`grep "$ifname-TxRx-" /proc/interrupts | wc -l`; + $txrx_queues =~ s/\n//; + + log_msg("txrx_queues is $txrx_queues.\n"); + + if ($txrx_queues <= 0) { + printf("Error: No TxRx queues found for new intel driver.\n"); + exit 1; + } + + # For i = 0 to number of queues: + # Affinity of TX/RX queue $i gets CPU ($i * (2 if HT, 1 if no HT)) + # % number_of_cpus + for (my $queue = 0, my $cpu = 0; ($queue < $txrx_queues) ; $queue++) { + # Generate the hex string for the bitmask representing this CPU + my $cpu_bit = 1 << $cpu; + my $cpu_hex = sprintf("%x", $cpu_bit); + log_msg ("queue=$queue cpu=$cpu cpu_bit=$cpu_bit cpu_hex=$cpu_hex\n"); + + # Get the IRQ number for RX queue + my $txrx_irq=`grep "$ifname-TxRx-$queue\$" /proc/interrupts | awk -F: '{print \$1}'`; + $txrx_irq =~ s/\n//; + $txrx_irq =~ s/ //g; + + log_msg("txrx_irq = $txrx_irq.\n"); + + # Assign CPU affinity for this IRQs + system "echo $cpu_hex > /proc/irq/$txrx_irq/smp_affinity"; + + $cpu += $ht_factor; + + if ($cpu >= $numcpus) { + # Must "wrap" + $cpu %= $numcpus; + + if ($ht_factor > 1) { + # Next time through, select the other CPU in a hyperthreaded + # pair. + if ($cpu == 0) { + $cpu++; + } else { + $cpu--; + } + } + } + } +}; + + # Affinity assignment function for Broadcom NICs using the bnx2 driver # or other multi-queue NICs that follow their queue naming convention. # This strategy is similar to that for Intel drivers. But since @@ -287,6 +356,7 @@ sub single_func { # Mapping from driver type to function that handles it. my %driver_hash = ( 'intel' => \&intel_func, + 'intel_new' => \&intel_new_func, 'broadcom' => \&broadcom_func, 'single' => \&single_func); @@ -335,12 +405,20 @@ if (defined $setup_ifname) { my $rx_queues=`grep "$ifname-rx-" /proc/interrupts | wc -l`; $rx_queues =~ s/\n//; if ($rx_queues > 0) { - # Driver is following the Intel queue naming style + # Driver is following the original Intel queue naming style $driver_style="intel"; } else { - # The only other queue naming style that we have seen is the - # one used by Broadcom NICs. - $driver_style="broadcom"; + my $rx_queues=`grep "$ifname-TxRx-" /proc/interrupts | wc -l`; + if ($rx_queues > 0) { + # Driver is following the new Intel queue naming + # style where on IRQ is used for each pair of + # TX and RX queues + $driver_style="intel_new"; + } else { + # The only other queue naming style that we have seen is the + # one used by Broadcom NICs. + $driver_style="broadcom"; + } } } elsif ($numints == 1) { # It is a single queue NIC. diff --git a/scripts/vyatta-cfg-cmd-wrapper b/scripts/vyatta-cfg-cmd-wrapper index 2d22235..6eeff99 100755 --- a/scripts/vyatta-cfg-cmd-wrapper +++ b/scripts/vyatta-cfg-cmd-wrapper @@ -85,6 +85,10 @@ case "$1" in /opt/vyatta/sbin/my_commit -e -d >> /tmp/bar RET_STATUS=$? ;; + commit_with_error) + /opt/vyatta/sbin/my_commit -e + RET_STATUS=$? + ;; save) /opt/vyatta/sbin/vyatta-save-config.pl "${@:2}" RET_STATUS=$? diff --git a/src/cli_path_utils.c b/src/cli_path_utils.c index 4111568..2874aeb 100644 --- a/src/cli_path_utils.c +++ b/src/cli_path_utils.c @@ -472,7 +472,7 @@ char *clind_unescape(const char *name) { const char *cp; char *rcp, *ret; - char len; + unsigned long len; for(cp=name, len=0;*cp;++cp, ++len) if(*cp=='%') diff --git a/src/commit2.c b/src/commit2.c index 884d2fe..0eb75f0 100644 --- a/src/commit2.c +++ b/src/commit2.c @@ -133,12 +133,13 @@ main(int argc, char** argv) boolean full_commit_check = FALSE; boolean break_priority = FALSE; boolean disable_hook = FALSE; + char *commit_comment = NULL; /* this is needed before calling certain glib functions */ g_type_init(); //grab inputs - while ((ch = getopt(argc, argv, "dpthsecoafbr")) != -1) { + while ((ch = getopt(argc, argv, "dpthsecoafbrC:")) != -1) { switch (ch) { case 'd': g_debug = TRUE; @@ -177,6 +178,9 @@ main(int argc, char** argv) case 'r': disable_hook = TRUE; break; + case 'C': + commit_comment = strdup(optarg); + break; default: usage(); exit(0); @@ -374,7 +378,10 @@ main(int argc, char** argv) if (strcmp(dirp->d_name, ".") != 0 && strcmp(dirp->d_name, "..") != 0) { char buf[MAX_LENGTH_DIR_PATH*sizeof(char)]; - sprintf(buf,"%s/%s",COMMIT_HOOK_DIR,dirp->d_name); + if (commit_comment == NULL) { + commit_comment="commit"; + } + sprintf(buf,"%s/%s %s",COMMIT_HOOK_DIR,dirp->d_name, commit_comment); syslog(LOG_DEBUG,"Starting commit hook: %s",buf); if (system(buf) == -1) { syslog(LOG_WARNING,"Error on call to hook: %s", buf); @@ -583,7 +590,7 @@ process_func(GNode *node, gpointer data) if (!status) { //EXECUTE_LIST RETURNS FALSE ON FAILURE.... syslog(LOG_ERR,"commit error for %s:[%s]\n",ActionNames[result->_action],d->_path); if (g_display_error_node) { - fprintf(out_stream,"%s:[%s]\n",ActionNames[result->_action],d->_path); + fprintf(out_stream,"%s@errloc:[%s]\n",ActionNames[result->_action],d->_path); } result->_err_code = 1; if (g_debug) { @@ -1397,7 +1404,7 @@ validate_func(GNode *node, gpointer data) } syslog(LOG_ERR,"commit error for %s:[%s]\n",ActionNames[result->_action],d->_path); if (g_display_error_node) { - fprintf(out_stream,"%s:[%s]\n",ActionNames[result->_action],d->_path); + fprintf(out_stream,"%s@errloc:[%s]\n",ActionNames[result->_action],d->_path); } result->_err_code = 1; if (g_debug) { diff --git a/src/cstore/cstore.cpp b/src/cstore/cstore.cpp index 8afa3ee..11cdb30 100644 --- a/src/cstore/cstore.cpp +++ b/src/cstore/cstore.cpp @@ -600,7 +600,7 @@ Cstore::getCompletionEnv(const vector<string>& comps, string& env) pair<string, string> hpair(comp_vals[i], ""); push_tmpl_path(hpair.first); vtw_def cdef; - if (tmpl_parse(cdef)) { + if (tmpl_parse(cdef) && cdef.def_node_help) { hpair.second = cdef.def_node_help; } else { hpair.second = "<No help text available>"; |