Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
N
neoppod
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Levin Zimmermann
neoppod
Commits
ba788667
Commit
ba788667
authored
May 15, 2018
by
Kirill Smelkov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
.
parent
bbad4198
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
56 additions
and
23 deletions
+56
-23
go/xcommon/xnet/lonet/lonet.go
go/xcommon/xnet/lonet/lonet.go
+48
-21
go/xcommon/xnet/lonet/lonet_test.go
go/xcommon/xnet/lonet/lonet_test.go
+6
-0
go/xcommon/xnet/lonet/registry.go
go/xcommon/xnet/lonet/registry.go
+2
-2
No files found.
go/xcommon/xnet/lonet/lonet.go
View file @
ba788667
...
@@ -41,21 +41,18 @@
...
@@ -41,21 +41,18 @@
// to 127.0.0.1:4567 and 127.0.0.1:8765, and once lonet connection is
// to 127.0.0.1:4567 and 127.0.0.1:8765, and once lonet connection is
// established it becomes served by OS-level TCP connection over loopback.
// established it becomes served by OS-level TCP connection over loopback.
//
//
// XXX several networks = possible. (or document in New?)
// Example:
//
// Example: TODO adjust
//
//
// net, err := lonet.Join(ctx, "mynet")
// net, err := lonet.Join(ctx, "mynet")
// h
1, err := net.NewHost("abc
")
// h
α, err := net.NewHost(ctx, "α
")
// h
2, err := net.NewHost("def") // ...
// h
β, err := net.NewHost(ctx, "β")
//
//
// // XXX inject 127.0.0.1 to example...
// // starts listening on address "α:10"
// // starts listening on address "abc:10" (which gets mapped to "127.0.0.1:xxx")
// l, err := hα.Listen(":10")
// l, err := h1.Listen(":10")
// go func() {
// go func() {
// csrv, err := l.Accept()
// csrv will have LocalAddr "abc:10
"
// csrv, err := l.Accept()
// csrv will have LocalAddr "α:11
"
// }()
// }()
// ccli, err := h
2.Dial("abc:10") // ccli will have RemoteAddr "def:10
"
// ccli, err := h
β.Dial(ctx, "α:10") // ccli will be connection between "β:1" - "α:11
"
//
//
// Once again lonet is similar to pipenet, but since it works via OS TCP stack
// Once again lonet is similar to pipenet, but since it works via OS TCP stack
// it could be handy for testing networked application when there are several
// it could be handy for testing networked application when there are several
...
@@ -64,17 +61,47 @@
...
@@ -64,17 +61,47 @@
// See also shipped lonet.py for accessing lonet networks from Python.
// See also shipped lonet.py for accessing lonet networks from Python.
package
lonet
package
lonet
// XXX document lonet organization, protocol
// lonet organization
//
// > lonet "network" dial <src> <dst>
// For every lonet network there is a registry with information about hosts
// < lonet "network" connected <dst'>
// available on the network, and for each host its OS-level listening address.
// E connrefused
// The registry is kept as SQLite database under
//
// /<tmp>/lonet/<network>/registry.db
//
// Whenever host α needs to establish connection to address on host β, it
// queries the registry for β and further talks to β on that address.
// Correspondingly when a host joins the network, it announces itself to the
// registry so that other hosts could see it.
//
//
// handshake protocol
//
// After α establishes OS-level connection to β via main β port, it sends
// request to further establish lonet connection on top of that:
//
// > lonet "<network>" dial <α:portα> <β:portβ> \n
//
// β checks whether portβ is listening, and if yes, accepts the connection on
// corresponding on-β listener with giving feedback to α that connection was
// accepted:
//
// < lonet "<network>" connected <β:portβ'> \n
//
// After that connection is considered to be lonet-established and all further
// exchange on it is directly controlled by corresponding lonet-level
// Read/Write on α and β.
//
// If, on the other hand, lonet-level connection cannot be established, β replies:
//
// < lonet "<networkβ>" E "<error>" \n
//
//
//
E wrong network|op|...
//
where <error> could be:
//
//
// - protocol error
// - connrefused if <β:portβ> is not listening
// - wrong network
// - network mismatch if β thinks it works on different lonet network than α
// - wrong op
// - protocol error if β thinks that α send incorrect dial request
// - ...
import
(
import
(
"context"
"context"
...
@@ -298,7 +325,7 @@ func (n *SubNetwork) serve() { // XXX error?
...
@@ -298,7 +325,7 @@ func (n *SubNetwork) serve() { // XXX error?
// loaccept handles incoming OS-level connection.
// loaccept handles incoming OS-level connection.
//
//
// it performs lonet protocol handshake and if successful
l
further conveys
// it performs lonet protocol handshake and if successful further conveys
// accepted connection to lonet-level Accept.
// accepted connection to lonet-level Accept.
func
(
n
*
SubNetwork
)
loaccept
(
osconn
net
.
Conn
)
(
err
error
)
{
func
(
n
*
SubNetwork
)
loaccept
(
osconn
net
.
Conn
)
(
err
error
)
{
defer
xerr
.
Contextf
(
&
err
,
"lonet %q: handshake"
,
n
.
network
)
defer
xerr
.
Contextf
(
&
err
,
"lonet %q: handshake"
,
n
.
network
)
...
@@ -311,7 +338,7 @@ func (n *SubNetwork) loaccept(osconn net.Conn) (err error) {
...
@@ -311,7 +338,7 @@ func (n *SubNetwork) loaccept(osconn net.Conn) (err error) {
}
}
var
network
,
src
,
dst
string
var
network
,
src
,
dst
string
_
,
err
=
fmt
.
Sscanf
(
line
,
"lonet %q dial %s %s
\n
"
,
&
network
,
&
src
,
&
dst
)
_
,
err
=
fmt
.
Sscanf
(
line
,
"
>
lonet %q dial %s %s
\n
"
,
&
network
,
&
src
,
&
dst
)
if
err
!=
nil
{
if
err
!=
nil
{
ereply
(
"protocol error"
)
ereply
(
"protocol error"
)
return
err
return
err
...
...
go/xcommon/xnet/lonet/lonet_test.go
View file @
ba788667
...
@@ -21,3 +21,9 @@ package lonet
...
@@ -21,3 +21,9 @@ package lonet
// TODO test go-go
// TODO test go-go
// TODO test go-py
// TODO test go-py
// XXX handshake:
// - ok,
// - econnrefused (no such host, port not listening)
// - network mismatch
// - invalid request
go/xcommon/xnet/lonet/registry.go
View file @
ba788667
...
@@ -28,8 +28,8 @@ import (
...
@@ -28,8 +28,8 @@ import (
// registry represents access to lonet network registry.
// registry represents access to lonet network registry.
//
//
// The registry holds information about hosts available on the network and
// The registry holds information about hosts available on the network
,
and
// for each host its OS listening address. Whenever host α needs to establish
// for each host its OS listening address. Whenever host α needs to establish
XXX dup with lonet.go
// connection to address on host β, it queries the registry for β and further
// connection to address on host β, it queries the registry for β and further
// talks to β on that address. Correspondingly when a host joins the network,
// talks to β on that address. Correspondingly when a host joins the network,
// it announces itself to the registry so that other hosts could see it.
// it announces itself to the registry so that other hosts could see it.
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment