[LON-CAPA-cvs] cvs: loncom / loncnew
foxr
lon-capa-cvs@mail.lon-capa.org
Mon, 09 Feb 2004 10:58:03 -0000
This is a MIME encoded message
--foxr1076324283
Content-Type: text/plain
foxr Mon Feb 9 05:58:03 2004 EDT
Modified files:
/loncom loncnew
Log:
Handle the additional states in LondConnection during connection setup.
Get and log the version of our peer.
--foxr1076324283
Content-Type: text/plain
Content-Disposition: attachment; filename="foxr-20040209055803.txt"
Index: loncom/loncnew
diff -u loncom/loncnew:1.39 loncom/loncnew:1.40
--- loncom/loncnew:1.39 Tue Jan 13 04:57:18 2004
+++ loncom/loncnew Mon Feb 9 05:58:03 2004
@@ -2,7 +2,7 @@
# The LearningOnline Network with CAPA
# lonc maintains the connections to remote computers
#
-# $Id: loncnew,v 1.39 2004/01/13 09:57:18 foxr Exp $
+# $Id: loncnew,v 1.40 2004/02/09 10:58:03 foxr Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -63,11 +63,6 @@
use LONCAPA::HashIterator;
-#
-# Disable all signals we might receive from outside for now.
-#
-
-
# Read the httpd configuration file to get perl variables
# normally set in apache modules:
@@ -107,6 +102,7 @@
my $RecentLogEntry = "";
my $ConnectionRetries=2; # Number of connection retries allowed.
my $ConnectionRetriesLeft=2; # Number of connection retries remaining.
+my $LondVersion = "unknown"; # Version of lond we talk with.
#
# The hash below gives the HTML format for log messages
@@ -695,6 +691,17 @@
The challenge has been replied to. The we are receiveing the
'ok' from the partner.
+=head3 State=ReadingVersionString
+
+We have requested the lond version and are reading the
+version back. Upon completion, we'll store the version away
+for future use(?).
+
+=head3 State=HostSet
+
+We have selected the domain name of our peer (multhomed hosts)
+and are getting the reply (presumably ok) back.
+
=head3 State=RequestingKey
The ok has been received and we need to send the request for
@@ -733,96 +740,119 @@
sub LondReadable {
- my $Event = shift;
- my $Watcher = $Event->w;
- my $Socket = $Watcher->data;
- my $client = undef;
-
- &Debug(6,"LondReadable called state = ".$Socket->GetState());
-
-
- my $State = $Socket->GetState(); # All action depends on the state.
-
- SocketDump(6, $Socket);
- my $status = $Socket->Readable();
+ my $Event = shift;
+ my $Watcher = $Event->w;
+ my $Socket = $Watcher->data;
+ my $client = undef;
+
+ &Debug(6,"LondReadable called state = ".$Socket->GetState());
+
+
+ my $State = $Socket->GetState(); # All action depends on the state.
+
+ SocketDump(6, $Socket);
+ my $status = $Socket->Readable();
+
+ &Debug(2, "Socket->Readable returned: $status");
+
+ if($status != 0) {
+ # bad return from socket read. Currently this means that
+ # The socket has become disconnected. We fail the transaction.
+
+ Log("WARNING",
+ "Lond connection lost.");
+ if(exists($ActiveTransactions{$Socket})) {
+ FailTransaction($ActiveTransactions{$Socket});
+ }
+ $Watcher->cancel();
+ KillSocket($Socket);
+ $ConnectionRetriesLeft--; # Counts as connection failure
+ return;
+ }
+ SocketDump(6,$Socket);
- &Debug(2, "Socket->Readable returned: $status");
-
- if($status != 0) {
- # bad return from socket read. Currently this means that
- # The socket has become disconnected. We fail the transaction.
-
- Log("WARNING",
- "Lond connection lost.");
- if(exists($ActiveTransactions{$Socket})) {
- FailTransaction($ActiveTransactions{$Socket});
- }
- $Watcher->cancel();
- KillSocket($Socket);
- $ConnectionRetriesLeft--; # Counts as connection failure
- return;
- }
- SocketDump(6,$Socket);
-
- $State = $Socket->GetState(); # Update in case of transition.
- &Debug(6, "After read, state is ".$State);
+ $State = $Socket->GetState(); # Update in case of transition.
+ &Debug(6, "After read, state is ".$State);
if($State eq "Initialized") {
- } elsif ($State eq "ChallengeReceived") {
+ } elsif ($State eq "ChallengeReceived") {
# The challenge must be echoed back; The state machine
# in the connection takes care of setting that up. Just
# need to transition to writable:
- $Watcher->cb(\&LondWritable);
- $Watcher->poll("w");
-
- } elsif ($State eq "ChallengeReplied") {
+ $Watcher->cb(\&LondWritable);
+ $Watcher->poll("w");
+ } elsif ($State eq "ChallengeReplied") {
- } elsif ($State eq "RequestingKey") {
+ } elsif ($State eq "RequestingVersion") {
+ # Need to ask for the version... that is writiability:
+
+ $Watcher->cb(\&LondWritable);
+ $Watcher->poll("w");
+
+ } elsif ($State eq "ReadingVersionString") {
+ # Read the rest of the version string...
+ } elsif ($State eq "SetHost") {
+ # Need to request the actual domain get set...
+
+ $Watcher->cb(\&LondWritable);
+ $Watcher->poll("w");
+ } elsif ($State eq "HostSet") {
+ # Reading the 'ok' from the peer.
+
+ } elsif ($State eq "RequestingKey") {
# The ok was received. Now we need to request the key
# That requires us to be writable:
- $Watcher->cb(\&LondWritable);
- $Watcher->poll("w");
+ $Watcher->cb(\&LondWritable);
+ $Watcher->poll("w");
- } elsif ($State eq "ReceivingKey") {
+ } elsif ($State eq "ReceivingKey") {
- } elsif ($State eq "Idle") {
+ } elsif ($State eq "Idle") {
+
+ # This is as good a spot as any to get the peer version
+ # string:
+
+ if($LondVersion eq "unknown") {
+ $LondVersion = $Socket->PeerVersion();
+ Log("INFO", "Connected to lond version: $LondVersion");
+ }
# If necessary, complete a transaction and then go into the
# idle queue.
# Note that a trasition to idle indicates a live lond
# on the other end so reset the connection retries.
#
- $ConnectionRetriesLeft = $ConnectionRetries; # success resets the count
- $Watcher->cancel();
- if(exists($ActiveTransactions{$Socket})) {
- Debug(5,"Completing transaction!!");
- CompleteTransaction($Socket,
- $ActiveTransactions{$Socket});
- } else {
- Log("SUCCESS", "Connection ".$ConnectionCount." to "
- .$RemoteHost." now ready for action");
- }
- ServerToIdle($Socket); # Next work unit or idle.
+ $ConnectionRetriesLeft = $ConnectionRetries; # success resets the count
+ $Watcher->cancel();
+ if(exists($ActiveTransactions{$Socket})) {
+ Debug(5,"Completing transaction!!");
+ CompleteTransaction($Socket,
+ $ActiveTransactions{$Socket});
+ } else {
+ Log("SUCCESS", "Connection ".$ConnectionCount." to "
+ .$RemoteHost." now ready for action");
+ }
+ ServerToIdle($Socket); # Next work unit or idle.
- } elsif ($State eq "SendingRequest") {
+ } elsif ($State eq "SendingRequest") {
# We need to be writable for this and probably don't belong
# here inthe first place.
- Deubg(6, "SendingRequest state encountered in readable");
- $Watcher->poll("w");
- $Watcher->cb(\&LondWritable);
+ Deubg(6, "SendingRequest state encountered in readable");
+ $Watcher->poll("w");
+ $Watcher->cb(\&LondWritable);
- } elsif ($State eq "ReceivingReply") {
+ } elsif ($State eq "ReceivingReply") {
- } else {
+ } else {
# Invalid state.
- Debug(4, "Invalid state in LondReadable");
- }
+ Debug(4, "Invalid state in LondReadable");
+ }
}
=pod
@@ -902,100 +932,131 @@
SocketDump(6,$Socket);
- if ($State eq "Connected") {
-
- if ($Socket->Writable() != 0) {
- # The write resulted in an error.
- # We'll treat this as if the socket got disconnected:
- Log("WARNING", "Connection to ".$RemoteHost.
- " has been disconnected");
- FailTransaction($ActiveTransactions{$Socket});
- $Watcher->cancel();
- KillSocket($Socket);
- return;
- }
- # "init" is being sent...
+ if ($State eq "Connected") {
-
- } elsif ($State eq "Initialized") {
+ if ($Socket->Writable() != 0) {
+ # The write resulted in an error.
+ # We'll treat this as if the socket got disconnected:
+ Log("WARNING", "Connection to ".$RemoteHost.
+ " has been disconnected");
+ FailTransaction($ActiveTransactions{$Socket});
+ $Watcher->cancel();
+ KillSocket($Socket);
+ return;
+ }
+
+ # "init" is being sent...
+
+ } elsif ($State eq "Initialized") {
- # Now that init was sent, we switch
- # to watching for readability:
+ # Now that init was sent, we switch
+ # to watching for readability:
- $Watcher->cb(\&LondReadable);
- $Watcher->poll("r");
+ $Watcher->cb(\&LondReadable);
+ $Watcher->poll("r");
- } elsif ($State eq "ChallengeReceived") {
- # We received the challenge, now we
- # are echoing it back. This is a no-op,
- # we're waiting for the state to change
+ } elsif ($State eq "ChallengeReceived") {
+ # We received the challenge, now we
+ # are echoing it back. This is a no-op,
+ # we're waiting for the state to change
- if($Socket->Writable() != 0) {
+ if($Socket->Writable() != 0) {
- $Watcher->cancel();
- KillSocket($Socket);
- return;
- }
+ $Watcher->cancel();
+ KillSocket($Socket);
+ return;
+ }
- } elsif ($State eq "ChallengeReplied") {
- # The echo was sent back, so we switch
- # to watching readability.
-
- $Watcher->cb(\&LondReadable);
- $Watcher->poll("r");
-
- } elsif ($State eq "RequestingKey") {
- # At this time we're requesting the key.
- # again, this is essentially a no-op.
- # we'll write the next chunk until the
- # state changes.
-
- if($Socket->Writable() != 0) {
- # Write resulted in an error.
+ } elsif ($State eq "ChallengeReplied") {
+ # The echo was sent back, so we switch
+ # to watching readability.
+
+ $Watcher->cb(\&LondReadable);
+ $Watcher->poll("r");
+ } elsif ($State eq "RequestingVersion") {
+ # Sending the peer a version request...
+
+ if($Socket->Writable() != 0) {
+ $Watcher->cancel();
+ KillSocket($Socket);
+ return;
+ }
+ } elsif ($State eq "ReadingVersionString") {
+ # Transition to read since we have sent the
+ # version command and now just need to read the
+ # version string from the peer:
+
+ $Watcher->cb(\&LondReadable);
+ $Watcher->poll("r");
+
+ } elsif ($State eq "SetHost") {
+ # Setting the remote domain...
+
+ if($Socket->Writable() != 0) {
+ $Watcher->cancel();
+ KillSocket($Socket);
+ return;
+ }
+ } elsif ($State eq "HostSet") {
+ # Back to readable to get the ok.
+
+ $Watcher->cb(\&LondReadable);
+ $Watcher->poll("r");
+
+
+ } elsif ($State eq "RequestingKey") {
+ # At this time we're requesting the key.
+ # again, this is essentially a no-op.
+ # we'll write the next chunk until the
+ # state changes.
+
+ if($Socket->Writable() != 0) {
+ # Write resulted in an error.
+
+ $Watcher->cancel();
+ KillSocket($Socket);
+ return;
+
+ }
+ } elsif ($State eq "ReceivingKey") {
+ # Now we need to wait for the key
+ # to come back from the peer:
- $Watcher->cancel();
- KillSocket($Socket);
- return;
-
- }
- } elsif ($State eq "ReceivingKey") {
- # Now we need to wait for the key
- # to come back from the peer:
+ $Watcher->cb(\&LondReadable);
+ $Watcher->poll("r");
- $Watcher->cb(\&LondReadable);
- $Watcher->poll("r");
-
- } elsif ($State eq "SendingRequest") {
- # At this time we are sending a request to the
+ } elsif ($State eq "SendingRequest") {
+
+ # At this time we are sending a request to the
# peer... write the next chunk:
- if($Socket->Writable() != 0) {
+ if($Socket->Writable() != 0) {
- if(exists($ActiveTransactions{$Socket})) {
- Debug(3, "Lond connection lost, failing transactions");
- FailTransaction($ActiveTransactions{$Socket});
- }
- $Watcher->cancel();
- KillSocket($Socket);
- return;
+ if(exists($ActiveTransactions{$Socket})) {
+ Debug(3, "Lond connection lost, failing transactions");
+ FailTransaction($ActiveTransactions{$Socket});
+ }
+ $Watcher->cancel();
+ KillSocket($Socket);
+ return;
- }
+ }
- } elsif ($State eq "ReceivingReply") {
- # The send has completed. Wait for the
- # data to come in for a reply.
- Debug(8,"Writable sent request/receiving reply");
- $Watcher->cb(\&LondReadable);
- $Watcher->poll("r");
+ } elsif ($State eq "ReceivingReply") {
+ # The send has completed. Wait for the
+ # data to come in for a reply.
+ Debug(8,"Writable sent request/receiving reply");
+ $Watcher->cb(\&LondReadable);
+ $Watcher->poll("r");
+
+ } else {
+ # Control only passes here on an error:
+ # the socket state does not match any
+ # of the known states... so an error
+ # must be logged.
- } else {
- # Control only passes here on an error:
- # the socket state does not match any
- # of the known states... so an error
- # must be logged.
-
- &Debug(4, "Invalid socket state ".$State."\n");
- }
+ &Debug(4, "Invalid socket state ".$State."\n");
+ }
}
=pod
--foxr1076324283--