Further refine IPMI support, now pretty solid for 5,000 nodes at a time, still one more condition to recover from, erroneous bad auth code
git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@13590 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
parent
cc76a05db4
commit
7fce0d11b6
@ -16,7 +16,7 @@ use warnings "all";
|
||||
use Time::HiRes qw/time/;
|
||||
|
||||
use IO::Socket::INET qw/!AF_INET6 !PF_INET6/;
|
||||
my $initialtimeout=0.200;
|
||||
my $initialtimeout=0.100;
|
||||
|
||||
my $doipv6=eval {
|
||||
require Socket6;
|
||||
@ -106,7 +106,6 @@ sub new {
|
||||
my $rcvbuf = $socket->sockopt(SO_RCVBUF);
|
||||
$maxpending=$rcvbuf/1500; #probably could have maxpending go higher, but just go with typical MTU as a guess
|
||||
}
|
||||
$maxpending=128; #TODO: analysis to mitigate this hard limit
|
||||
$select->add($socket);
|
||||
}
|
||||
my $bmc_n;
|
||||
@ -131,14 +130,7 @@ sub new {
|
||||
} else {
|
||||
$self->{peeraddr} = sockaddr_in($self->{port},$bmc_n);
|
||||
}
|
||||
$self->{'sequencenumber'} = 0; #init sequence number
|
||||
$self->{'sequencenumberbytes'} = [0,0,0,0]; #init sequence number
|
||||
$self->{'sessionid'} = [0,0,0,0]; # init session id
|
||||
$self->{'authtype'}=0; # first messages will have auth type of 0
|
||||
$self->{'ipmiversion'}='1.5'; # send first packet as 1.5
|
||||
$self->{'timeout'}=1; #start at a quick timeout, increase on retry
|
||||
$self->{'seqlun'}=0; #the IPMB seqlun combo, increment by 4s
|
||||
$self->{'logged'}=0;
|
||||
$self->init();
|
||||
return $self;
|
||||
}
|
||||
sub login {
|
||||
@ -150,6 +142,7 @@ sub login {
|
||||
}
|
||||
$self->{onlogon} = $args{callback};
|
||||
$self->{onlogon_args} = $args{callback_args};
|
||||
$self->{logontries}=5;
|
||||
$self->get_channel_auth_cap();
|
||||
}
|
||||
|
||||
@ -629,6 +622,23 @@ sub send_rakp1 {
|
||||
push @payload,@user;
|
||||
$self->sendpayload(payload=>\@payload,type=>$payload_types{'rakp1'});
|
||||
}
|
||||
sub init {
|
||||
my $self = shift;
|
||||
$self->{'sequencenumber'} = 0; #init sequence number
|
||||
$self->{'sequencenumberbytes'} = [0,0,0,0]; #init sequence number
|
||||
$self->{'sessionid'} = [0,0,0,0]; # init session id
|
||||
$self->{'authtype'}=0; # first messages will have auth type of 0
|
||||
$self->{'ipmiversion'}='1.5'; # send first packet as 1.5
|
||||
$self->{'timeout'}=$initialtimeout; #start at a quick timeout, increase on retry
|
||||
$self->{'seqlun'}=0; #the IPMB seqlun combo, increment by 4s
|
||||
$self->{'logged'}=0;
|
||||
}
|
||||
sub relog {
|
||||
my $self=shift;
|
||||
$self->init();
|
||||
$self->{logontries} -= 1;
|
||||
$self->get_channel_auth_cap();
|
||||
}
|
||||
|
||||
sub got_rakp4 {
|
||||
my $self = shift;
|
||||
@ -642,6 +652,10 @@ sub got_rakp4 {
|
||||
}
|
||||
$byte = shift @data;
|
||||
unless ($byte == 0x00) {
|
||||
if ($byte == 0x02 and $self->{logontries}) { # 0x02 is 'invalid session id', seems that some ipmi implementations sometimes expire a temporary id before I can respond, start over in such a case
|
||||
$self->relog();
|
||||
return;
|
||||
}
|
||||
$self->{onlogon}->("ERROR: $byte code on opening RMCP+ session",$self->{onlogon_args}); #TODO: errors
|
||||
return 9;
|
||||
}
|
||||
@ -678,6 +692,10 @@ sub got_rakp2 {
|
||||
}
|
||||
$byte = shift @data;
|
||||
unless ($byte == 0x00) {
|
||||
if ($byte == 0x02 and $self->{logontries}) { # 0x02 is 'invalid session id', seems that some ipmi implementations sometimes expire a temporary id before I can respond, start over in such a case
|
||||
$self->relog();
|
||||
return;
|
||||
}
|
||||
$self->{onlogon}->("ERROR: $byte code on opening RMCP+ session",$self->{onlogon_args}); #TODO: errors
|
||||
return 9;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user