summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephen Hemminger <stephen.hemminger@vyatta.com>2010-10-13 12:17:45 -0700
committerStephen Hemminger <stephen.hemminger@vyatta.com>2010-10-13 12:17:45 -0700
commitbba82193be7225c078e007c99a1537b68ba68bb1 (patch)
tree7aefebdcf0650c02355478fd4dc84e53815fa428
parentc5c35050fca8396968b64f5bffe070ed2b293c32 (diff)
parent6bbaacf5f0cc1880006a75084539d773eda662ff (diff)
downloadvyatta-cfg-bba82193be7225c078e007c99a1537b68ba68bb1.tar.gz
vyatta-cfg-bba82193be7225c078e007c99a1537b68ba68bb1.zip
Merge branch 'mendocino' of suva.vyatta.com:/git/vyatta-cfg into mendocino
-rw-r--r--Makefile.am1
-rw-r--r--debian/changelog76
-rwxr-xr-xetc/bash_completion.d/20vyatta-cfg21
-rwxr-xr-xlib/Vyatta/Config.pm10
-rwxr-xr-xlib/Vyatta/Zone.pm208
-rwxr-xr-xscripts/vyatta-auto-irqaffin.pl88
-rwxr-xr-xscripts/vyatta-cfg-cmd-wrapper4
-rw-r--r--src/cli_path_utils.c2
-rw-r--r--src/commit2.c15
-rw-r--r--src/cstore/cstore.cpp2
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>";