CSa32/Node.S
author hh
Thu, 21 Nov 2019 14:55:10 +0100
changeset 0 5c129dd80d4f
permissions -rw-r--r--
--
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
hh
parents:
diff changeset
     1
	.include "DS.S"
hh
parents:
diff changeset
     2
	.data
hh
parents:
diff changeset
     3
	.text
hh
parents:
diff changeset
     4
#-----------------------------------------------
hh
parents:
diff changeset
     5
#	N O D E   O P E R A T I O N S
hh
parents:
diff changeset
     6
#-----------------------------------------------
hh
parents:
diff changeset
     7
	ARGS
hh
parents:
diff changeset
     8
	DS	CnstlnP				# -->Constellation inst
hh
parents:
diff changeset
     9
	DS	port				# node's port#
hh
parents:
diff changeset
    10
# returns
hh
parents:
diff changeset
    11
#	nothing
hh
parents:
diff changeset
    12
# local vars
hh
parents:
diff changeset
    13
	PROLOC
hh
parents:
diff changeset
    14
	DL	this, NodeL			# this Node instance
hh
parents:
diff changeset
    15
	DL	thisP				# -->this Node
hh
parents:
diff changeset
    16
	DL	deP				# -->Debug inst for LOG macro
hh
parents:
diff changeset
    17
	DL	rc
hh
parents:
diff changeset
    18
	DL	tosignal			# switch
hh
parents:
diff changeset
    19
	DL	sigact, SigActionL
hh
parents:
diff changeset
    20
	DL	sigmask, 128
hh
parents:
diff changeset
    21
	DL	sigret
hh
parents:
diff changeset
    22
	EPILOC
hh
parents:
diff changeset
    23
#-----------------------------------------------
hh
parents:
diff changeset
    24
	.global Node
hh
parents:
diff changeset
    25
Node:
hh
parents:
diff changeset
    26
	PROLOG
hh
parents:
diff changeset
    27
	lea	this(bp), b			# -->this Node
hh
parents:
diff changeset
    28
	mov	b, thisP(bp)			# save -->this Node
hh
parents:
diff changeset
    29
	lea	N.debug(b), a
hh
parents:
diff changeset
    30
	mov	a, deP(bp)			# save -->Debug locally for LOG macro
hh
parents:
diff changeset
    31
# save parm values
hh
parents:
diff changeset
    32
	mov	CnstlnP(bp), c			# -->Constellation
hh
parents:
diff changeset
    33
	mov	c, N.cnstlnP(b)			# save -->Constellation
hh
parents:
diff changeset
    34
	mov	port(bp), a
hh
parents:
diff changeset
    35
	mov	a, N.locPort(b)			# save port#
hh
parents:
diff changeset
    36
# set Debug id
hh
parents:
diff changeset
    37
	push	a
hh
parents:
diff changeset
    38
	cmpl	$Cn.ring, Cn.topo(c)
hh
parents:
diff changeset
    39
	je	0f
hh
parents:
diff changeset
    40
	push	$8f
hh
parents:
diff changeset
    41
	jmp	1f
hh
parents:
diff changeset
    42
0:	push	$7f
hh
parents:
diff changeset
    43
1:	cmp	$0,Cn.ssl(c)
hh
parents:
diff changeset
    44
	je	2f
hh
parents:
diff changeset
    45
	push	$6f
hh
parents:
diff changeset
    46
	jmp	9f
hh
parents:
diff changeset
    47
2:	push	$5f
hh
parents:
diff changeset
    48
	jmp	9f
hh
parents:
diff changeset
    49
5:	.asciz	"non"
hh
parents:
diff changeset
    50
6:	.asciz	""
hh
parents:
diff changeset
    51
7:	.asciz	"RING"
hh
parents:
diff changeset
    52
8:	.asciz	"MASH"
hh
parents:
diff changeset
    53
9:	DEBID	"%sSSL %s node %d", 3		# N->ssl ? "" : "non", N.topo==mash ? "MASH" : "RING", locPort
hh
parents:
diff changeset
    54
	call	N.init				# initialize node
hh
parents:
diff changeset
    55
	call	N.bind				# bind node to local port
hh
parents:
diff changeset
    56
	push	N.kicker(b)			# kicker indicator
hh
parents:
diff changeset
    57
	LOG	5, "kicker=%d"
hh
parents:
diff changeset
    58
	cmpl	$0, N.kicker(b) 		# kicker ?
hh
parents:
diff changeset
    59
	je	0f				# no
hh
parents:
diff changeset
    60
	call	N.kickOff			# start transfer
hh
parents:
diff changeset
    61
0:
hh
parents:
diff changeset
    62
	call	N.mainLoop			# iterate on socket I/O select
hh
parents:
diff changeset
    63
	LOG	5, "closing ssc"
hh
parents:
diff changeset
    64
	push	N.ssc(b)
hh
parents:
diff changeset
    65
	SYS	close
hh
parents:
diff changeset
    66
	movl	$0, rc(bp)			# rc = OK
hh
parents:
diff changeset
    67
# wait on thread closing client side
hh
parents:
diff changeset
    68
	cmpl	$0, N.closing(b)		# closing client side ?
hh
parents:
diff changeset
    69
	je	N.chkData			# no
hh
parents:
diff changeset
    70
	push	$0
hh
parents:
diff changeset
    71
	push	N.ptid(b)			# thread id
hh
parents:
diff changeset
    72
	call	pthread_join
hh
parents:
diff changeset
    73
	test	a, a
hh
parents:
diff changeset
    74
	jz	1f
hh
parents:
diff changeset
    75
	push	a				# unique error handlig for pthread_join
hh
parents:
diff changeset
    76
	call	strerror
hh
parents:
diff changeset
    77
	push	a
hh
parents:
diff changeset
    78
	LOG	0, "pthread_join: %s"
hh
parents:
diff changeset
    79
	push	deP(bp)
hh
parents:
diff changeset
    80
	call	C.abend
hh
parents:
diff changeset
    81
1:
hh
parents:
diff changeset
    82
	mov	thisP(bp), b			# -->this Node
hh
parents:
diff changeset
    83
	push	N.pid(b)
hh
parents:
diff changeset
    84
	LOG	5, "task %u: closing thread returned"
hh
parents:
diff changeset
    85
# synchronize with all nodes in all constellations and then check received data
hh
parents:
diff changeset
    86
N.chkData:
hh
parents:
diff changeset
    87
	call	N.sync				# wait for others
hh
parents:
diff changeset
    88
	cmpl	$0, N.kicker(b) 		# kicker ?
hh
parents:
diff changeset
    89
	je	0f				# no
hh
parents:
diff changeset
    90
hh
parents:
diff changeset
    91
	push	N.dataP(b)			# -->Data
hh
parents:
diff changeset
    92
	call	Da.chk
hh
parents:
diff changeset
    93
	test	a, a				# data check OK ?
hh
parents:
diff changeset
    94
	jnz	0f				# yes
hh
parents:
diff changeset
    95
	movl	$1, rc(bp)			# rc = BAD
hh
parents:
diff changeset
    96
	LOG	0, "data on INPUT TO and OUTPUT FROM constellation DIFFER"
hh
parents:
diff changeset
    97
0:
hh
parents:
diff changeset
    98
	push	N.pid(b)
hh
parents:
diff changeset
    99
	push	rc(bp)
hh
parents:
diff changeset
   100
	LOG	2, "end of operations, rc=%d, process=%u"
hh
parents:
diff changeset
   101
	call	exit
hh
parents:
diff changeset
   102
#-----------------------------------------------
hh
parents:
diff changeset
   103
#	C O N S T R U C T O R
hh
parents:
diff changeset
   104
#-----------------------------------------------
hh
parents:
diff changeset
   105
	PROLOC
hh
parents:
diff changeset
   106
	DL	thisP				# -->this Node
hh
parents:
diff changeset
   107
	DL	deP				# -->Debug
hh
parents:
diff changeset
   108
#	DL	CnstlnP				# -->Constellation
hh
parents:
diff changeset
   109
	DL	len				# various lengths
hh
parents:
diff changeset
   110
	strL = 128
hh
parents:
diff changeset
   111
	DL	str, strL			# string buf
hh
parents:
diff changeset
   112
	EPILOC
hh
parents:
diff changeset
   113
#-----------------------------------------------
hh
parents:
diff changeset
   114
N.init:						# c: -->Cnstln
hh
parents:
diff changeset
   115
	PROLOG
hh
parents:
diff changeset
   116
	mov	b, thisP(bp)			# save -->this Node
hh
parents:
diff changeset
   117
	lea	N.debug(b), a
hh
parents:
diff changeset
   118
	mov	a, deP(bp)			# save local -->Debug
hh
parents:
diff changeset
   119
	LOG	4, "initializing..."
hh
parents:
diff changeset
   120
# initialize node's attributes
hh
parents:
diff changeset
   121
	call	getpid
hh
parents:
diff changeset
   122
	mov	a, N.pid(b)
hh
parents:
diff changeset
   123
	mov	N.cnstlnP(b), c			# -->Constellation
hh
parents:
diff changeset
   124
	push	deP(bp)				# -->caller Debug id
hh
parents:
diff changeset
   125
	lea	N.data(b), a
hh
parents:
diff changeset
   126
	mov	a, N.dataP(b)
hh
parents:
diff changeset
   127
	push	a				# -->Data
hh
parents:
diff changeset
   128
	call	Data				# initialize data item
hh
parents:
diff changeset
   129
	mov	Cn.topo(c), a
hh
parents:
diff changeset
   130
	mov	a, N.topo(b)			# save topology
hh
parents:
diff changeset
   131
	mov	Cn.ssl(c), a
hh
parents:
diff changeset
   132
	mov	a, N.ssl(b)			# SSL switch
hh
parents:
diff changeset
   133
	mov	Cn.first(c), a
hh
parents:
diff changeset
   134
	mov	a, N.first(b)			# save port# of first node in constellation
hh
parents:
diff changeset
   135
	movl	$0, N.kicker(b)			# clear kicker switch
hh
parents:
diff changeset
   136
	cmp	a, N.locPort(b)			# kicker ?	(locPort == first)
hh
parents:
diff changeset
   137
	sete	N.kicker(b)
hh
parents:
diff changeset
   138
1:	add	Cn.nodes(c), a
hh
parents:
diff changeset
   139
	dec	a
hh
parents:
diff changeset
   140
	mov	a, N.last(b)			# save port# of last node (last = first + nodes -1)
hh
parents:
diff changeset
   141
	mov	Cn.nodes(c), a
hh
parents:
diff changeset
   142
	mov	a, N.nodes(b)			# save num. of nodes in constellation
hh
parents:
diff changeset
   143
	mov	Cn.div(c), a
hh
parents:
diff changeset
   144
	mov	a, N.div(b)			# save divisor for random choice (MAX_INT / nodes)
hh
parents:
diff changeset
   145
	mov	Cn.topo(c), a
hh
parents:
diff changeset
   146
	mov	a, N.topo(b)
hh
parents:
diff changeset
   147
	mov	Cn.forwP(c), a
hh
parents:
diff changeset
   148
	mov	a, N.forwP(b)			# save -->shared "forward" indicator
hh
parents:
diff changeset
   149
	movl	$0, N.closing(b)		# unset closing indicator
hh
parents:
diff changeset
   150
# allocate and initialize server side and client side sockets
hh
parents:
diff changeset
   151
	mov	$SocketInfoL, a
hh
parents:
diff changeset
   152
	mull	N.nodes(b)			# SocketInfo array len
hh
parents:
diff changeset
   153
	mov	a, N.sockArrLen(b)		# save array len
hh
parents:
diff changeset
   154
	push	a
hh
parents:
diff changeset
   155
	call	malloc
hh
parents:
diff changeset
   156
	cmp	$0, a
hh
parents:
diff changeset
   157
	jnl	0f
hh
parents:
diff changeset
   158
	SYSERR	"malloc"
hh
parents:
diff changeset
   159
0:	mov	thisP(bp), b			# -->this Node
hh
parents:
diff changeset
   160
	mov	a, N.srvSideP(b)		# save -->array of server side sockets
hh
parents:
diff changeset
   161
	pushl	N.sockArrLen(b)
hh
parents:
diff changeset
   162
	call	malloc
hh
parents:
diff changeset
   163
	cmp	$0, a
hh
parents:
diff changeset
   164
	jnl	0f
hh
parents:
diff changeset
   165
	SYSERR	"malloc"
hh
parents:
diff changeset
   166
0:	mov	thisP(bp), b			# -->this Node
hh
parents:
diff changeset
   167
	mov	a, N.cliSideP(b)		# save -->array of client side sockets
hh
parents:
diff changeset
   168
# initialize allocated socket infos
hh
parents:
diff changeset
   169
	xor	c, c				# offset
hh
parents:
diff changeset
   170
0:	mov	N.srvSideP(b), a		# -->server side SocketInfo array
hh
parents:
diff changeset
   171
#	movl	$So.labelV, So.label(a, c)	# indicate SocketInfo block
hh
parents:
diff changeset
   172
	movl	$-1, So.sc(a, c)		# indicate server side socket is not in use
hh
parents:
diff changeset
   173
	mov	N.cliSideP(b), a		# -->client side SocketInfo array
hh
parents:
diff changeset
   174
#	movl	$So.labelV, So.label(a, c)	# indicate SocketInfo block
hh
parents:
diff changeset
   175
	movl	$-1, So.sc(a, c)		# indicate client side socket is not in use
hh
parents:
diff changeset
   176
	lea	SocketInfoL(c), c		# incr by SocketInfo len
hh
parents:
diff changeset
   177
	cmp	c, N.sockArrLen(b)
hh
parents:
diff changeset
   178
	ja	0b				# iterate
hh
parents:
diff changeset
   179
hh
parents:
diff changeset
   180
	cmpl	$0, N.ssl(b)			# node's ssl switch
hh
parents:
diff changeset
   181
	jz	N.initR				# no SSL
hh
parents:
diff changeset
   182
# prepare SSL context
hh
parents:
diff changeset
   183
#	call	SSL_load_error_strings
hh
parents:
diff changeset
   184
#	call	SSL_library_init
hh
parents:
diff changeset
   185
	call	OPENSSL_init_ssl
hh
parents:
diff changeset
   186
	LOG	4, "setting SSL contex...", 0
hh
parents:
diff changeset
   187
	call	TLS_method
hh
parents:
diff changeset
   188
	push	a
hh
parents:
diff changeset
   189
	call	SSL_CTX_new
hh
parents:
diff changeset
   190
	mov	thisP(bp), b			# -->this Node
hh
parents:
diff changeset
   191
	mov	a, N.ctxP(b)			# save -->new SSL context
hh
parents:
diff changeset
   192
	test	a, a
hh
parents:
diff changeset
   193
	jnz	0f
hh
parents:
diff changeset
   194
	SSLERR	"new SSL CTX"
hh
parents:
diff changeset
   195
# set SSL mode
hh
parents:
diff changeset
   196
0:	pushl	$0
hh
parents:
diff changeset
   197
	pushl	$4				# SSL_MODE_AUTO_RETRY
hh
parents:
diff changeset
   198
	pushl	$33				# SSL_CTRL_MODE
hh
parents:
diff changeset
   199
	pushl	N.ctxP(b)			# -->SSL context
hh
parents:
diff changeset
   200
	call	SSL_CTX_ctrl
hh
parents:
diff changeset
   201
	movl	$0, 8(sp)			# no callback
hh
parents:
diff changeset
   202
	movl	$2, 4(sp)			# mode = SSL_VERIFY_FAIL_IF_NO_PEER_CERT
hh
parents:
diff changeset
   203
	call	SSL_CTX_set_verify		# set peer certificate verification parameters
hh
parents:
diff changeset
   204
# set X509 key file name
hh
parents:
diff changeset
   205
	mov	thisP(bp), b			# -->this Node
hh
parents:
diff changeset
   206
	pushl	N.locPort(b)			# local TCP port#
hh
parents:
diff changeset
   207
	mov	C.csP, c
hh
parents:
diff changeset
   208
	pushl	C.cePathP(c)			# -->name of SSL path
hh
parents:
diff changeset
   209
	pushl	$0f				# -->format
hh
parents:
diff changeset
   210
	pushl	$strL				# buf len
hh
parents:
diff changeset
   211
	lea	str(bp), a
hh
parents:
diff changeset
   212
	push	a				# -->string buf
hh
parents:
diff changeset
   213
	call	snprintf
hh
parents:
diff changeset
   214
	jmp	1f
hh
parents:
diff changeset
   215
0:	.asciz	"%skeys/%u.key"
hh
parents:
diff changeset
   216
1:
hh
parents:
diff changeset
   217
	pushl	$1				# SSL_FILETYPE_PEM
hh
parents:
diff changeset
   218
	lea	str(bp), a			# filename string
hh
parents:
diff changeset
   219
	push	a
hh
parents:
diff changeset
   220
	LOG	5, "SSL private key used: %s", 1
hh
parents:
diff changeset
   221
	mov	thisP(bp), b			# -->this Node inst
hh
parents:
diff changeset
   222
	pushl	N.ctxP(b)			# -->SSL context
hh
parents:
diff changeset
   223
	call	SSL_CTX_use_PrivateKey_file
hh
parents:
diff changeset
   224
	cmp	$1, a
hh
parents:
diff changeset
   225
	je	0f
hh
parents:
diff changeset
   226
	SSLERR	"hh's key file"
hh
parents:
diff changeset
   227
# set X509 cert file name
hh
parents:
diff changeset
   228
0:	mov	thisP(bp), b			# -->this Node
hh
parents:
diff changeset
   229
	pushl	N.locPort(b)			# local TCP port #
hh
parents:
diff changeset
   230
	mov	C.csP, c
hh
parents:
diff changeset
   231
	pushl	C.cePathP(c)			# -->name of SSL path
hh
parents:
diff changeset
   232
	pushl	$0f
hh
parents:
diff changeset
   233
	pushl	$strL				# buf len
hh
parents:
diff changeset
   234
	lea	str(bp), a			# string buf
hh
parents:
diff changeset
   235
	push	a
hh
parents:
diff changeset
   236
	call	snprintf
hh
parents:
diff changeset
   237
	jmp	1f
hh
parents:
diff changeset
   238
0:	.asciz	"%scerts/%u.pem"
hh
parents:
diff changeset
   239
1:	mov	thisP(bp), b			# -->this Node
hh
parents:
diff changeset
   240
	LOG	5, "SSL certificate used: %s", 1
hh
parents:
diff changeset
   241
	pushl	$1				# SSL_FILETYPE_PEM
hh
parents:
diff changeset
   242
	lea	str(bp), a			# filename string
hh
parents:
diff changeset
   243
	push	a
hh
parents:
diff changeset
   244
	pushl	N.ctxP(b)			# -->SSL context
hh
parents:
diff changeset
   245
	call	SSL_CTX_use_certificate_file
hh
parents:
diff changeset
   246
	cmp	$1, a
hh
parents:
diff changeset
   247
	je	0f
hh
parents:
diff changeset
   248
	SSLERR	"hh's cert file"
hh
parents:
diff changeset
   249
# set path to CA
hh
parents:
diff changeset
   250
0:	mov	thisP(bp), b			# -->this Node
hh
parents:
diff changeset
   251
	mov	C.csP, c
hh
parents:
diff changeset
   252
	pushl	C.caPathP(c)			# -->name of SSL path
hh
parents:
diff changeset
   253
	pushl	$0f				# -->CApath
hh
parents:
diff changeset
   254
	LOG	5, "SSL: CA path: %s", 1
hh
parents:
diff changeset
   255
	pushl	$0				# -->CAfile not used
hh
parents:
diff changeset
   256
	pushl	N.ctxP(b)			# -->SSL context
hh
parents:
diff changeset
   257
	call	SSL_CTX_load_verify_locations	# set default locations for trusted CA certificates
hh
parents:
diff changeset
   258
	cmp	$1, a
hh
parents:
diff changeset
   259
	je	N.initR
hh
parents:
diff changeset
   260
	SSLERR	"hh's thrusted certs path"
hh
parents:
diff changeset
   261
0:	.asciz	"/home/local/etc/ssl/certs/"
hh
parents:
diff changeset
   262
N.initR:
hh
parents:
diff changeset
   263
	LOG	5, "initalized"
hh
parents:
diff changeset
   264
	EPILOG
hh
parents:
diff changeset
   265
#-----------------------------------------------
hh
parents:
diff changeset
   266
#	K I C K   O F F
hh
parents:
diff changeset
   267
#-----------------------------------------------
hh
parents:
diff changeset
   268
	PROLOC
hh
parents:
diff changeset
   269
	DL	thisP				# -->this Node
hh
parents:
diff changeset
   270
	DL	deP				# -->Debug
hh
parents:
diff changeset
   271
	DL	sci				# socket info rank
hh
parents:
diff changeset
   272
	DL	digest, 24
hh
parents:
diff changeset
   273
	EPILOC
hh
parents:
diff changeset
   274
N.kickOff:
hh
parents:
diff changeset
   275
	PROLOG
hh
parents:
diff changeset
   276
	mov	b, thisP(bp)			# save -->this Node
hh
parents:
diff changeset
   277
	lea	N.debug(b), a
hh
parents:
diff changeset
   278
	mov	a, deP(bp)			# save local -->Debug
hh
parents:
diff changeset
   279
# load payload data
hh
parents:
diff changeset
   280
	movl	C.csP, c			# -->CS
hh
parents:
diff changeset
   281
	push	C.txtP(c)			# -->initial payload text
hh
parents:
diff changeset
   282
	push	C.ttl(c)			# initial TTL
hh
parents:
diff changeset
   283
#	lea	N.data(b), a			# -->Data
hh
parents:
diff changeset
   284
#	push	a
hh
parents:
diff changeset
   285
	push	N.dataP(b)			# -->Data
hh
parents:
diff changeset
   286
	call	Da.load				# load data container
hh
parents:
diff changeset
   287
	call	N.nextNode
hh
parents:
diff changeset
   288
	mov	a, N.next(b)			# save next node#
hh
parents:
diff changeset
   289
	sub	N.first(b), a			# first - next = socketinfo rank
hh
parents:
diff changeset
   290
	mov	a, sci(bp)			# save socket info rank
hh
parents:
diff changeset
   291
	lea	digest(bp), a			# -->digest buf
hh
parents:
diff changeset
   292
	push	a
hh
parents:
diff changeset
   293
	push	N.dataP(b)			# -->Data
hh
parents:
diff changeset
   294
	call	Da.digest24
hh
parents:
diff changeset
   295
	call	Da.getDataLen
hh
parents:
diff changeset
   296
	push	N.next(b)			# next node#
hh
parents:
diff changeset
   297
	push	a				# data len
hh
parents:
diff changeset
   298
	lea	digest(bp), a			# -->digest
hh
parents:
diff changeset
   299
	push	a
hh
parents:
diff changeset
   300
	LOG	2, "kicker: ready to initial send %s, len=%u to node %u"
hh
parents:
diff changeset
   301
	push	N.next(b)
hh
parents:
diff changeset
   302
	push	sci(bp)
hh
parents:
diff changeset
   303
	call	N.conn				# connect to next node
hh
parents:
diff changeset
   304
	push	sci(bp)
hh
parents:
diff changeset
   305
	call	N.put				# send data to next node
hh
parents:
diff changeset
   306
	EPILOG
hh
parents:
diff changeset
   307
#-----------------------------------------------
hh
parents:
diff changeset
   308
#	M A I N   L O O P :   I T E R A T E   O N   S O C K E T   I / O
hh
parents:
diff changeset
   309
#-----------------------------------------------
hh
parents:
diff changeset
   310
	PROLOC
hh
parents:
diff changeset
   311
	DL	thisP				# -->this Node
hh
parents:
diff changeset
   312
	DL	deP				# -->Debug
hh
parents:
diff changeset
   313
	EPILOC
hh
parents:
diff changeset
   314
N.mainLoop:
hh
parents:
diff changeset
   315
	PROLOG
hh
parents:
diff changeset
   316
	mov	b, thisP(bp)			# save -->this Node
hh
parents:
diff changeset
   317
	lea	N.debug(b), a
hh
parents:
diff changeset
   318
	mov	a, deP(bp)			# save local -->Debug
hh
parents:
diff changeset
   319
# prepare
hh
parents:
diff changeset
   320
	LOG	5, "preparing for I/O select..."
hh
parents:
diff changeset
   321
	call	N.clearSocketMasks		# clear socket masks for select and zero nfds
hh
parents:
diff changeset
   322
	call	N.maskSsc			# mask ssc for select
hh
parents:
diff changeset
   323
# iterate while there are some sockets masked for select (nfds > 0)
hh
parents:
diff changeset
   324
0:	cmp	$0, N.nfds(b)			# any I/O in progress ?
hh
parents:
diff changeset
   325
	jz	0f				# no, end operations of node
hh
parents:
diff changeset
   326
	call	N.selectSocketIo		# select on server side sockets and forward data
hh
parents:
diff changeset
   327
	call	N.clearSocketMasks		# clear socket masks for select and zero nfds
hh
parents:
diff changeset
   328
	call	N.maskSsc			# mask ssc for select
hh
parents:
diff changeset
   329
	call	N.maskSrvSockets		# mask all connected server side sockets for select
hh
parents:
diff changeset
   330
	jmp	0b
hh
parents:
diff changeset
   331
0:	EPILOG
hh
parents:
diff changeset
   332
#-----------------------------------------------
hh
parents:
diff changeset
   333
#	S E L E C T   S O C K E T   I / O
hh
parents:
diff changeset
   334
#-----------------------------------------------
hh
parents:
diff changeset
   335
# select on masked sockets
hh
parents:
diff changeset
   336
# upon return from select
hh
parents:
diff changeset
   337
#	accept connections to ssc
hh
parents:
diff changeset
   338
#	forward data from posted sockets
hh
parents:
diff changeset
   339
#-----------------------------------------------
hh
parents:
diff changeset
   340
	PROLOC
hh
parents:
diff changeset
   341
	DL	thisP				# -->this Node
hh
parents:
diff changeset
   342
	DL	deP				# -->Debug
hh
parents:
diff changeset
   343
	EPILOC
hh
parents:
diff changeset
   344
N.selectSocketIo:
hh
parents:
diff changeset
   345
	PROLOG
hh
parents:
diff changeset
   346
	mov	b, thisP(bp)			# save -->this Node
hh
parents:
diff changeset
   347
	lea	N.debug(b), a
hh
parents:
diff changeset
   348
	mov	a, deP(bp)			# save local -->Debug
hh
parents:
diff changeset
   349
hh
parents:
diff changeset
   350
	push	N.nfds(b)
hh
parents:
diff changeset
   351
	lea	N.rs(b), a
hh
parents:
diff changeset
   352
	push	(a)
hh
parents:
diff changeset
   353
	push	4(a)
hh
parents:
diff changeset
   354
	push	N.ssc(b)
hh
parents:
diff changeset
   355
	LOG	5, "select ssc=%u, mask=%08x %08x, nfds=%u"
hh
parents:
diff changeset
   356
	lea	N.t(b), a			# -->timeval
hh
parents:
diff changeset
   357
	movl	$1, Ti.secs(a)
hh
parents:
diff changeset
   358
	movl	$0, Ti.usecs(a)
hh
parents:
diff changeset
   359
	push	a
hh
parents:
diff changeset
   360
	lea	N.es(b), a
hh
parents:
diff changeset
   361
	push	a				# -->es (exceptional mask is not used yet)
hh
parents:
diff changeset
   362
	pushl	$0
hh
parents:
diff changeset
   363
	lea	N.rs(b), a			# -->rs
hh
parents:
diff changeset
   364
	push	a
hh
parents:
diff changeset
   365
	push	N.nfds(b)
hh
parents:
diff changeset
   366
	SYS	select
hh
parents:
diff changeset
   367
	lea	N.rs(b), a
hh
parents:
diff changeset
   368
	push	(a)
hh
parents:
diff changeset
   369
	push	4(a)
hh
parents:
diff changeset
   370
	LOG	5, "return from select, mask of posted=%08x %08x"
hh
parents:
diff changeset
   371
# check ssc for incomming connect request, accept it and forward data
hh
parents:
diff changeset
   372
	lea	N.rs(b), a			# -->rs select mask
hh
parents:
diff changeset
   373
	push	a
hh
parents:
diff changeset
   374
	pushl	N.ssc(b)
hh
parents:
diff changeset
   375
	call	fd_isset
hh
parents:
diff changeset
   376
	test	a, a				# ssc I/O ?
hh
parents:
diff changeset
   377
	jz	N.checkAndForw			# no, check other sockets
hh
parents:
diff changeset
   378
# prepare for accept; find free srv socket info block for accept
hh
parents:
diff changeset
   379
	mov	N.srvSideP(b), a		# -->srv socket info array
hh
parents:
diff changeset
   380
	xor	c, c				# offet in socket info array
hh
parents:
diff changeset
   381
	xor	d, d				# socket info rank
hh
parents:
diff changeset
   382
0:	cmp	$-1, So.sc(a, c)		# socket allocated ?
hh
parents:
diff changeset
   383
	je	0f				# no, free socket found
hh
parents:
diff changeset
   384
	inc	d
hh
parents:
diff changeset
   385
	lea	SocketInfoL(c), c		# inc offset into array
hh
parents:
diff changeset
   386
	cmp	c, N.sockArrLen(b)
hh
parents:
diff changeset
   387
	ja	0b				# iterate on sockets
hh
parents:
diff changeset
   388
	ERR	"can't accept, all sockets in use"
hh
parents:
diff changeset
   389
# free socket found, accept connection on it and forward data
hh
parents:
diff changeset
   390
0:	push	d
hh
parents:
diff changeset
   391
	LOG	4, "slot for accept=%d"
hh
parents:
diff changeset
   392
	call	N.acc
hh
parents:
diff changeset
   393
	call	N.forw
hh
parents:
diff changeset
   394
# check all server side sockets for pending I/O and call forward on them
hh
parents:
diff changeset
   395
N.checkAndForw:
hh
parents:
diff changeset
   396
	xor	c, c				# offet into socket info array
hh
parents:
diff changeset
   397
	lea	N.rs(b), a			# -->rs select mask
hh
parents:
diff changeset
   398
	push	a
hh
parents:
diff changeset
   399
	lea	-4(sp), sp			# adjust stacker for iteration
hh
parents:
diff changeset
   400
	xor	c, c				# zero offset
hh
parents:
diff changeset
   401
	xor	d, d				# set counter
hh
parents:
diff changeset
   402
# iterate through server side sockets and forward from posted sockets
hh
parents:
diff changeset
   403
0:	mov	N.srvSideP(b), a		# -->srv socket info array
hh
parents:
diff changeset
   404
	cmp	$-1, So.sc(a, c)		# socket connected ?
hh
parents:
diff changeset
   405
	je	1f				# no, iterate
hh
parents:
diff changeset
   406
	mov	So.sc(a, c), a
hh
parents:
diff changeset
   407
	mov	a, (sp)				# stack socket#
hh
parents:
diff changeset
   408
#	LOG	0, "checking port %u"
hh
parents:
diff changeset
   409
	call	fd_isset			# socket I/O ?
hh
parents:
diff changeset
   410
	test	a, a
hh
parents:
diff changeset
   411
	jz	1f				# no, iterate
hh
parents:
diff changeset
   412
	mov	N.srvSideP(b), a
hh
parents:
diff changeset
   413
	mov	So.sc(a, c), a
hh
parents:
diff changeset
   414
	mov	d, (sp)				# stack socket rank
hh
parents:
diff changeset
   415
#	LOG	0, "port posted, rank=%u"
hh
parents:
diff changeset
   416
	call	N.forw				# forward data
hh
parents:
diff changeset
   417
1:	inc	d
hh
parents:
diff changeset
   418
	lea	SocketInfoL(c), c		# inc offset into array
hh
parents:
diff changeset
   419
	cmp	c, N.sockArrLen(b)
hh
parents:
diff changeset
   420
	ja	0b				# iterate on srv side sockets
hh
parents:
diff changeset
   421
	EPILOG
hh
parents:
diff changeset
   422
#-----------------------------------------------
hh
parents:
diff changeset
   423
#	M A S K   C O N N E C T E D   S O C K E T S   F O R   S E L E C T
hh
parents:
diff changeset
   424
#-----------------------------------------------
hh
parents:
diff changeset
   425
# mask all connected server side socketS for next select
hh
parents:
diff changeset
   426
	PROLOC
hh
parents:
diff changeset
   427
	DL	thisP				# -->this Node
hh
parents:
diff changeset
   428
	EPILOC
hh
parents:
diff changeset
   429
N.maskSrvSockets:
hh
parents:
diff changeset
   430
	PROLOG
hh
parents:
diff changeset
   431
	mov	b, thisP(bp)			# save -->this Node
hh
parents:
diff changeset
   432
hh
parents:
diff changeset
   433
	lea	N.rs(b), a			# -->rs select mask
hh
parents:
diff changeset
   434
	push	a
hh
parents:
diff changeset
   435
	lea	-4(sp), sp			# adjust stacker for iteration
hh
parents:
diff changeset
   436
	xor	c, c				# zero offet
hh
parents:
diff changeset
   437
0:	mov	N.srvSideP(b), a		# -->srv socket info array
hh
parents:
diff changeset
   438
	cmp	$-1, So.sc(a, c)		# socket connected ?
hh
parents:
diff changeset
   439
	je	1f				# no, iterate
hh
parents:
diff changeset
   440
	mov	So.sc(a, c), a
hh
parents:
diff changeset
   441
	mov	a, (sp)				# stack socket#
hh
parents:
diff changeset
   442
	call	N.maskSocket			# mask socket for select
hh
parents:
diff changeset
   443
1:	lea	SocketInfoL(c), c		# inc offset into array
hh
parents:
diff changeset
   444
	cmp	c, N.sockArrLen(b)
hh
parents:
diff changeset
   445
	ja	0b				# iterate on srv side sockets
hh
parents:
diff changeset
   446
	EPILOG
hh
parents:
diff changeset
   447
#-----------------------------------------------
hh
parents:
diff changeset
   448
#	M A S K   S S C   F O R   S E L E C T
hh
parents:
diff changeset
   449
#-----------------------------------------------
hh
parents:
diff changeset
   450
# mask ssc for select until forward is disabled
hh
parents:
diff changeset
   451
	PROLOC
hh
parents:
diff changeset
   452
	DL	thisP				# -->this Node
hh
parents:
diff changeset
   453
	EPILOC
hh
parents:
diff changeset
   454
N.maskSsc:
hh
parents:
diff changeset
   455
	PROLOG
hh
parents:
diff changeset
   456
	mov	b, thisP(bp)			# save -->this Node
hh
parents:
diff changeset
   457
hh
parents:
diff changeset
   458
	mov	N.forwP(b), a
hh
parents:
diff changeset
   459
	cmp	$1, (a)				# forwarding enabled ?
hh
parents:
diff changeset
   460
	jne	0f				# no, return
hh
parents:
diff changeset
   461
	push	N.ssc(b)
hh
parents:
diff changeset
   462
	call	N.maskSocket
hh
parents:
diff changeset
   463
0:	EPILOG
hh
parents:
diff changeset
   464
#-----------------------------------------------
hh
parents:
diff changeset
   465
#	C L E A R   S O C K E T   M A S K S
hh
parents:
diff changeset
   466
#-----------------------------------------------
hh
parents:
diff changeset
   467
	PROLOC
hh
parents:
diff changeset
   468
	DL	thisP				# -->this Node
hh
parents:
diff changeset
   469
	EPILOC
hh
parents:
diff changeset
   470
N.clearSocketMasks:
hh
parents:
diff changeset
   471
	PROLOG
hh
parents:
diff changeset
   472
	mov	b, thisP(bp)			# save -->this Node
hh
parents:
diff changeset
   473
hh
parents:
diff changeset
   474
	movl	$0, N.nfds(b)			# zero nfds
hh
parents:
diff changeset
   475
	lea	N.rs(b), a			# zero rs select mask
hh
parents:
diff changeset
   476
	push	a
hh
parents:
diff changeset
   477
	call	fd_zero
hh
parents:
diff changeset
   478
	lea	N.es(b), a			# zero es select masks
hh
parents:
diff changeset
   479
	push	a
hh
parents:
diff changeset
   480
	call	fd_zero
hh
parents:
diff changeset
   481
	EPILOG
hh
parents:
diff changeset
   482
#-----------------------------------------------
hh
parents:
diff changeset
   483
#	M A S K   S O C K E T   F O R   S E L E C T
hh
parents:
diff changeset
   484
#-----------------------------------------------
hh
parents:
diff changeset
   485
	ARGS
hh
parents:
diff changeset
   486
	DS	sc				# socket#
hh
parents:
diff changeset
   487
	PROLOC
hh
parents:
diff changeset
   488
	DL	thisP				# -->this Node
hh
parents:
diff changeset
   489
	EPILOC
hh
parents:
diff changeset
   490
N.maskSocket:
hh
parents:
diff changeset
   491
	PROLOG
hh
parents:
diff changeset
   492
	mov	b, thisP(bp)			# save -->this Node
hh
parents:
diff changeset
   493
hh
parents:
diff changeset
   494
	lea	N.rs(b), a			# -->rs select mask
hh
parents:
diff changeset
   495
	push	a
hh
parents:
diff changeset
   496
	pushl	sc(bp)
hh
parents:
diff changeset
   497
	call	fd_set
hh
parents:
diff changeset
   498
	mov	sc(bp), a			# socket#
hh
parents:
diff changeset
   499
	cmp	a, N.nfds(b)			# nfds > sc ?
hh
parents:
diff changeset
   500
	jg	0f				# yes
hh
parents:
diff changeset
   501
	inc	a
hh
parents:
diff changeset
   502
	mov	a, N.nfds(b)			# nfds = sc + 1
hh
parents:
diff changeset
   503
0:	EPILOG
hh
parents:
diff changeset
   504
#-----------------------------------------------
hh
parents:
diff changeset
   505
#	F D   S E T   O P E R A T I N O S
hh
parents:
diff changeset
   506
#-----------------------------------------------
hh
parents:
diff changeset
   507
	PROLOC					# local data frame def. is used by 4 following subrs
hh
parents:
diff changeset
   508
	DL	thisP				# -->this Node
hh
parents:
diff changeset
   509
	dL	deP
hh
parents:
diff changeset
   510
	EPILOC
hh
parents:
diff changeset
   511
fd_zero:
hh
parents:
diff changeset
   512
# zero FD mask
hh
parents:
diff changeset
   513
	ARGS
hh
parents:
diff changeset
   514
	DS	fdsetP				# -->FD mask
hh
parents:
diff changeset
   515
	PROLOG
hh
parents:
diff changeset
   516
	mov	fdsetP(bp), a
hh
parents:
diff changeset
   517
	xor	c, c
hh
parents:
diff changeset
   518
0:	movl	$0, (a, c, 4)
hh
parents:
diff changeset
   519
	inc	c
hh
parents:
diff changeset
   520
	cmp	$32, c				# size of FD mask is 32 int (1024 bits)
hh
parents:
diff changeset
   521
	jl	0b
hh
parents:
diff changeset
   522
	EPILOG
hh
parents:
diff changeset
   523
fd_set:
hh
parents:
diff changeset
   524
# mask socket in FD mask
hh
parents:
diff changeset
   525
	ARGS
hh
parents:
diff changeset
   526
	DS	sc
hh
parents:
diff changeset
   527
	DS	fdsetP				# -->FD mask
hh
parents:
diff changeset
   528
	PROLOG
hh
parents:
diff changeset
   529
	movl	sc(bp), a			# sc
hh
parents:
diff changeset
   530
	call	fd_mask				# a: integer offset, d: "1" bit in position according to sc
hh
parents:
diff changeset
   531
	mov	fdsetP(bp), c			# -->select mask
hh
parents:
diff changeset
   532
	or	d, (c, a)			# set sc mask
hh
parents:
diff changeset
   533
	EPILOG
hh
parents:
diff changeset
   534
fd_clear:
hh
parents:
diff changeset
   535
# clear socket from FD mask
hh
parents:
diff changeset
   536
	ARGS
hh
parents:
diff changeset
   537
	DS	sc
hh
parents:
diff changeset
   538
	DS	fdsetP				# -->FD mask
hh
parents:
diff changeset
   539
	PROLOG
hh
parents:
diff changeset
   540
	movl	sc(bp), a			# sc
hh
parents:
diff changeset
   541
	call	fd_mask				# a: integer offset, d: "1" bit in position according to sc
hh
parents:
diff changeset
   542
	mov	fdsetP(bp), c			# -->select mask
hh
parents:
diff changeset
   543
	not	d
hh
parents:
diff changeset
   544
	and	d, (c, a)			# clear sc mask
hh
parents:
diff changeset
   545
	EPILOG
hh
parents:
diff changeset
   546
fd_isset:
hh
parents:
diff changeset
   547
# test socket bit status in FD mask
hh
parents:
diff changeset
   548
	ARGS
hh
parents:
diff changeset
   549
	DS	sc
hh
parents:
diff changeset
   550
	DS	fdsetP				# -->FD mask
hh
parents:
diff changeset
   551
	PROLOG
hh
parents:
diff changeset
   552
	movl	sc(bp), a			# sc
hh
parents:
diff changeset
   553
	call	fd_mask				# a: integer offset, d: "1" bit in position according to sc
hh
parents:
diff changeset
   554
	mov	fdsetP(bp), c			# -->select mask
hh
parents:
diff changeset
   555
	and	(c, a), d			# sc selected ?
hh
parents:
diff changeset
   556
	mov	d, a
hh
parents:
diff changeset
   557
#	mov	$0, a
hh
parents:
diff changeset
   558
#	jz	0f				# not selected
hh
parents:
diff changeset
   559
#	mov	$1, a
hh
parents:
diff changeset
   560
0:	EPILOG_R
hh
parents:
diff changeset
   561
fd_mask:					# a: sc
hh
parents:
diff changeset
   562
# adjust offsets into FD mask
hh
parents:
diff changeset
   563
	xor	d, d
hh
parents:
diff changeset
   564
	movl	$32, c
hh
parents:
diff changeset
   565
	divl	c				# a: mask integer rank, c: bit offset
hh
parents:
diff changeset
   566
	shll	$2, a				# a: mask integer offset
hh
parents:
diff changeset
   567
	mov	d, c
hh
parents:
diff changeset
   568
	mov	$1, d
hh
parents:
diff changeset
   569
	shl	%cl, d				# d: "1" bit in position according to sc
hh
parents:
diff changeset
   570
	ret					# a: offset of mask integer
hh
parents:
diff changeset
   571
#-----------------------------------------------
hh
parents:
diff changeset
   572
#	F O R W A R D   D A T A   T O   O T H E R   N O D E
hh
parents:
diff changeset
   573
#-----------------------------------------------
hh
parents:
diff changeset
   574
	ARGS
hh
parents:
diff changeset
   575
	DS	sci				# SocketInfo rank
hh
parents:
diff changeset
   576
	PROLOC
hh
parents:
diff changeset
   577
	DL	thisP				# -->this Node
hh
parents:
diff changeset
   578
	DL	deP				# -->Debug inst
hh
parents:
diff changeset
   579
	DL	digest, 24
hh
parents:
diff changeset
   580
	EPILOC
hh
parents:
diff changeset
   581
#-----------------------------------------------
hh
parents:
diff changeset
   582
N.forw:
hh
parents:
diff changeset
   583
	PROLOG
hh
parents:
diff changeset
   584
	mov	b, thisP(bp)			# save -->this Node
hh
parents:
diff changeset
   585
	lea	N.debug(b), a
hh
parents:
diff changeset
   586
	mov	a, deP(bp)			# save local -->Debug
hh
parents:
diff changeset
   587
hh
parents:
diff changeset
   588
	push	sci(bp)				# socket info rank
hh
parents:
diff changeset
   589
	call	N.get
hh
parents:
diff changeset
   590
	test	a, a				# data read ?
hh
parents:
diff changeset
   591
	jz	N.forwCloseSock			# no, EOF, close this socket and start closing clients
hh
parents:
diff changeset
   592
# kicker checks TTL
hh
parents:
diff changeset
   593
	cmp	$1, N.kicker(b)			# kicker ?
hh
parents:
diff changeset
   594
	jne	1f				# no, continue forwarding
hh
parents:
diff changeset
   595
hh
parents:
diff changeset
   596
	lea	-4(sp), sp			# adjust stacker
hh
parents:
diff changeset
   597
	lea	digest(bp), a
hh
parents:
diff changeset
   598
	push	a				# -->digest buf
hh
parents:
diff changeset
   599
	push	N.dataP(b)			# -->Data
hh
parents:
diff changeset
   600
	call	Da.ttl
hh
parents:
diff changeset
   601
	mov	a, 8(sp)			# TTL from data header
hh
parents:
diff changeset
   602
	call	Da.digest24
hh
parents:
diff changeset
   603
	mov	a, 4(sp)			# -->text digest
hh
parents:
diff changeset
   604
	call	Da.getPort
hh
parents:
diff changeset
   605
	mov	a, (sp)				# remote listen port from data header
hh
parents:
diff changeset
   606
	LOG	5, "received from node %u: %s, ttl=%d"
hh
parents:
diff changeset
   607
	push	N.dataP(b)			# -->Data
hh
parents:
diff changeset
   608
	call	Da.dttl				# decrement TTL in data
hh
parents:
diff changeset
   609
	test	a, a				# TTl > 0 ?
hh
parents:
diff changeset
   610
	jz	N.forwKickerStop		# no, disable forwarding in constellation
hh
parents:
diff changeset
   611
# forward data
hh
parents:
diff changeset
   612
1:	call	N.nextNode			# calculate next node
hh
parents:
diff changeset
   613
	mov	a, N.next(b)
hh
parents:
diff changeset
   614
	push	a
hh
parents:
diff changeset
   615
	LOG	4, "next node %u"
hh
parents:
diff changeset
   616
	sub	N.first(b), a			# socket info rank (next - first)
hh
parents:
diff changeset
   617
	mov	a, sci(bp)			# save
hh
parents:
diff changeset
   618
# connect if not connected yet
hh
parents:
diff changeset
   619
	movl	$SocketInfoL, d
hh
parents:
diff changeset
   620
	mul	d				# a: offset into socket info array
hh
parents:
diff changeset
   621
	mov	N.cliSideP(b), c		# -->client side socket info array
hh
parents:
diff changeset
   622
	cmp	$-1, So.sc(c, a) 		# connected ?
hh
parents:
diff changeset
   623
	jne	0f				# yes
hh
parents:
diff changeset
   624
	push	N.next(b)
hh
parents:
diff changeset
   625
	push	sci(bp)
hh
parents:
diff changeset
   626
	call	N.conn
hh
parents:
diff changeset
   627
0:
hh
parents:
diff changeset
   628
	lea	-4(sp), sp
hh
parents:
diff changeset
   629
	push	N.dataP(b)			# -->Data
hh
parents:
diff changeset
   630
	call	Da.ttl
hh
parents:
diff changeset
   631
	mov	a, 4(sp)			# ttl
hh
parents:
diff changeset
   632
	call	Da.getDataLen
hh
parents:
diff changeset
   633
	mov	a, (sp)				# container len
hh
parents:
diff changeset
   634
	push	N.next(b)			# next node#
hh
parents:
diff changeset
   635
	LOG	5, "forwarding to %d, len=%d, ttl=%d --->"
hh
parents:
diff changeset
   636
# pacing
hh
parents:
diff changeset
   637
	mov	C.csP, c			# -->CS
hh
parents:
diff changeset
   638
	cmp	$0, C.pacing(c)			# pacing active ?
hh
parents:
diff changeset
   639
	je	0f				# no
hh
parents:
diff changeset
   640
	pushl	$0
hh
parents:
diff changeset
   641
	lea	C.pace.tv_sec(c), a
hh
parents:
diff changeset
   642
	push	a
hh
parents:
diff changeset
   643
	SYS	nanosleep			# pace
hh
parents:
diff changeset
   644
0:	push	sci(bp)
hh
parents:
diff changeset
   645
	call	N.put
hh
parents:
diff changeset
   646
	LOG	4, "leaving forward"
hh
parents:
diff changeset
   647
	jmp	N.forwR				# exit forwarding
hh
parents:
diff changeset
   648
N.forwKickerStop:				# ttl = 0
hh
parents:
diff changeset
   649
	lea	digest(bp), a
hh
parents:
diff changeset
   650
	push	a				# -->digest buf
hh
parents:
diff changeset
   651
	push	N.dataP(b)			# -->Data
hh
parents:
diff changeset
   652
	call	Da.digest24
hh
parents:
diff changeset
   653
	push	a
hh
parents:
diff changeset
   654
	LOG	1, "received after finally passing all: %s", 1
hh
parents:
diff changeset
   655
	mov	N.forwP(b), a			# -->shared forw indicator
hh
parents:
diff changeset
   656
	movl	$0, (a)				# disable forwarding for all nodes in constellation
hh
parents:
diff changeset
   657
	jmp	N.forwCloseCli
hh
parents:
diff changeset
   658
N.forwCloseSock:
hh
parents:
diff changeset
   659
	pushl	deP(bp)
hh
parents:
diff changeset
   660
	pushl	$1				# indicate "server side"
hh
parents:
diff changeset
   661
	push	sci(bp)				# socket info rank
hh
parents:
diff changeset
   662
	call	N.closeSocket			# close this server side socket
hh
parents:
diff changeset
   663
N.forwCloseCli:
hh
parents:
diff changeset
   664
	call	N.closeClients			# launch client side closing thread
hh
parents:
diff changeset
   665
	LOG	4, "leaving forward, closing"
hh
parents:
diff changeset
   666
N.forwR:
hh
parents:
diff changeset
   667
	EPILOG
hh
parents:
diff changeset
   668
#-----------------------------------------------
hh
parents:
diff changeset
   669
#	D E T E R M I N E   N E X T   N O D E
hh
parents:
diff changeset
   670
#-----------------------------------------------
hh
parents:
diff changeset
   671
	PROLOC
hh
parents:
diff changeset
   672
	DL	thisP				# -->this Node
hh
parents:
diff changeset
   673
	EPILOC
hh
parents:
diff changeset
   674
N.nextNode:
hh
parents:
diff changeset
   675
	PROLOG
hh
parents:
diff changeset
   676
	mov	b, thisP(bp)			# save -->this Node
hh
parents:
diff changeset
   677
hh
parents:
diff changeset
   678
	cmp	$Cn.ring, N.topo(b)		# ring ?
hh
parents:
diff changeset
   679
	jne	0f				# no
hh
parents:
diff changeset
   680
# ring
hh
parents:
diff changeset
   681
	mov	N.locPort(b), a
hh
parents:
diff changeset
   682
	inc	a				# next = locPort + 1
hh
parents:
diff changeset
   683
	cmp	a, N.last(b)			# next > last ?
hh
parents:
diff changeset
   684
	jnl	N.nextNodeR
hh
parents:
diff changeset
   685
	mov	N.first(b), a
hh
parents:
diff changeset
   686
	jmp	N.nextNodeR
hh
parents:
diff changeset
   687
# mash
hh
parents:
diff changeset
   688
0:	call	random
hh
parents:
diff changeset
   689
	xor     d, d
hh
parents:
diff changeset
   690
	mov	thisP(bp), b
hh
parents:
diff changeset
   691
        divl    N.div(b)			# 0 <= random < nodes
hh
parents:
diff changeset
   692
        add	N.first(b), a			# first + random
hh
parents:
diff changeset
   693
        cmp	a, N.locPort(b)
hh
parents:
diff changeset
   694
        je	0b				# iterate until other then local node is selected
hh
parents:
diff changeset
   695
N.nextNodeR:
hh
parents:
diff changeset
   696
	push	a
hh
parents:
diff changeset
   697
	EPILOG_R
hh
parents:
diff changeset
   698
hh
parents:
diff changeset
   699
#-----------------------------------------------
hh
parents:
diff changeset
   700
#	B I N D   T O   L O C A L   T C P   P O R T
hh
parents:
diff changeset
   701
#-----------------------------------------------
hh
parents:
diff changeset
   702
# returns
hh
parents:
diff changeset
   703
#	nothing
hh
parents:
diff changeset
   704
	PROLOC
hh
parents:
diff changeset
   705
	DL	thisP				# -->this Node
hh
parents:
diff changeset
   706
	DL	deP				# -->Debug
hh
parents:
diff changeset
   707
	DL	i
hh
parents:
diff changeset
   708
	DL	aiP				# -->IP addrinfo
hh
parents:
diff changeset
   709
	strL = 64
hh
parents:
diff changeset
   710
	DL	str, strL			# string buf
hh
parents:
diff changeset
   711
	EPILOC
hh
parents:
diff changeset
   712
#-----------------------------------------------
hh
parents:
diff changeset
   713
	.global N.bind
hh
parents:
diff changeset
   714
N.bind:
hh
parents:
diff changeset
   715
	PROLOG
hh
parents:
diff changeset
   716
	mov	b, thisP(bp)			# save -->this Node
hh
parents:
diff changeset
   717
	lea	N.debug(b), a
hh
parents:
diff changeset
   718
	mov	a, deP(bp)			# save local -->Debug
hh
parents:
diff changeset
   719
	LOG	4, "binding...", 0
hh
parents:
diff changeset
   720
# prepare IP addr
hh
parents:
diff changeset
   721
	pushl	$AddrInfoL
hh
parents:
diff changeset
   722
	call	malloc				# alloc addrinfo for hints
hh
parents:
diff changeset
   723
	mov	a, aiP(bp)
hh
parents:
diff changeset
   724
	pushl	$AddrInfoL
hh
parents:
diff changeset
   725
	pushl	$0
hh
parents:
diff changeset
   726
	push	a
hh
parents:
diff changeset
   727
	call	memset				# clear hints
hh
parents:
diff changeset
   728
hh
parents:
diff changeset
   729
	movl	$2, ai_family(a)		# AF_INET
hh
parents:
diff changeset
   730
	movl	$1, ai_flags(a)			# AI_PASSIVE for bind
hh
parents:
diff changeset
   731
	movl	$0, ai_protocol(a)		# any protocol
hh
parents:
diff changeset
   732
	movl	$1, ai_socktype(a)		# SOCK_STREAM, blocking type
hh
parents:
diff changeset
   733
hh
parents:
diff changeset
   734
	mov	thisP(bp), b			# -->this Node
hh
parents:
diff changeset
   735
	pushl	N.locPort(b)			# local port #
hh
parents:
diff changeset
   736
	push	$0f
hh
parents:
diff changeset
   737
	lea	str(bp), a
hh
parents:
diff changeset
   738
	push	a				# -->str buff
hh
parents:
diff changeset
   739
	call	sprintf
hh
parents:
diff changeset
   740
	jmp	1f
hh
parents:
diff changeset
   741
0:	.ascii	"%d\0"
hh
parents:
diff changeset
   742
1:
hh
parents:
diff changeset
   743
	lea	aiP(bp), a
hh
parents:
diff changeset
   744
	push	a				# -->-->addrinfo for new addrinfo
hh
parents:
diff changeset
   745
	pushl	aiP(bp)				# -->addrinfo hints
hh
parents:
diff changeset
   746
	lea	str(bp), a
hh
parents:
diff changeset
   747
	push	a				# -->loc port # string
hh
parents:
diff changeset
   748
	pushl	$0f
hh
parents:
diff changeset
   749
	call	getaddrinfo
hh
parents:
diff changeset
   750
	jmp	1f
hh
parents:
diff changeset
   751
0:	.ascii	"localhost\0"
hh
parents:
diff changeset
   752
# check IP addr
hh
parents:
diff changeset
   753
1:	cmp	$0, a				# getaddrinfo OK ?
hh
parents:
diff changeset
   754
	jz	0f				# yes
hh
parents:
diff changeset
   755
	push	a
hh
parents:
diff changeset
   756
	call	gai_strerror
hh
parents:
diff changeset
   757
	push	a
hh
parents:
diff changeset
   758
	LOG	0, "getaddrinfo error: %s, ABEND", 1
hh
parents:
diff changeset
   759
	push	$1
hh
parents:
diff changeset
   760
	call	exit
hh
parents:
diff changeset
   761
# log assigned IP addr
hh
parents:
diff changeset
   762
0:	pushl	deP(bp)
hh
parents:
diff changeset
   763
	mov	aiP(bp), a			# -->addrinfo
hh
parents:
diff changeset
   764
	pushl	ai_addrP(a)			# -->sockaddr
hh
parents:
diff changeset
   765
	lea	str(bp), a
hh
parents:
diff changeset
   766
	push	a				# -->string buf
hh
parents:
diff changeset
   767
	call	gai
hh
parents:
diff changeset
   768
hh
parents:
diff changeset
   769
	lea	str(bp), a
hh
parents:
diff changeset
   770
	push	a
hh
parents:
diff changeset
   771
	LOG	5, "getaddrinfo OK, %s", 1
hh
parents:
diff changeset
   772
# allocate socket
hh
parents:
diff changeset
   773
	mov	aiP(bp), a
hh
parents:
diff changeset
   774
	pushl	ai_protocol(a)
hh
parents:
diff changeset
   775
	pushl	ai_socktype(a)
hh
parents:
diff changeset
   776
	pushl	ai_family(a)
hh
parents:
diff changeset
   777
	SYS	socket
hh
parents:
diff changeset
   778
	mov	a, N.ssc(b)			# save ssc
hh
parents:
diff changeset
   779
# set socket option SO_REUSEADDR
hh
parents:
diff changeset
   780
	pushl	$4				# integer width
hh
parents:
diff changeset
   781
	lea		9f, a			# value 1
hh
parents:
diff changeset
   782
	push	a
hh
parents:
diff changeset
   783
	pushl	$2				# SO_REUSEADDR
hh
parents:
diff changeset
   784
	pushl	$1				# SOL_SOCKET
hh
parents:
diff changeset
   785
	push	N.ssc(b)			# ssc
hh
parents:
diff changeset
   786
	SYS setsockopt
hh
parents:
diff changeset
   787
	jmp		8f
hh
parents:
diff changeset
   788
9:	.long	1
hh
parents:
diff changeset
   789
8:
hh
parents:
diff changeset
   790
# bind
hh
parents:
diff changeset
   791
	mov	aiP(bp), a
hh
parents:
diff changeset
   792
	pushl	ai_addrlen(a)
hh
parents:
diff changeset
   793
	pushl	ai_addrP(a)
hh
parents:
diff changeset
   794
	push	N.ssc(b)			# ssc
hh
parents:
diff changeset
   795
	SYS	bind
hh
parents:
diff changeset
   796
# listen
hh
parents:
diff changeset
   797
	pushl	$1				# pend conns queue len
hh
parents:
diff changeset
   798
	pushl	N.ssc(b)			# ssc
hh
parents:
diff changeset
   799
	SYS	listen
hh
parents:
diff changeset
   800
	pushl	N.locPort(b)
hh
parents:
diff changeset
   801
	LOG	2, "bound to %d", 1
hh
parents:
diff changeset
   802
N.bindR:
hh
parents:
diff changeset
   803
	EPILOG
hh
parents:
diff changeset
   804
#-----------------------------------------------
hh
parents:
diff changeset
   805
#	C O N N E C T   T O   R E M O T E   N O D E
hh
parents:
diff changeset
   806
#-----------------------------------------------
hh
parents:
diff changeset
   807
# args
hh
parents:
diff changeset
   808
	ac = 40
hh
parents:
diff changeset
   809
	DS	i				# socket rank
hh
parents:
diff changeset
   810
	DS	remPort				# TCP port# on remote site
hh
parents:
diff changeset
   811
# returns
hh
parents:
diff changeset
   812
#	nothing
hh
parents:
diff changeset
   813
# local vars
hh
parents:
diff changeset
   814
	ac = 0
hh
parents:
diff changeset
   815
	DL	debug, DebugL			# Debug inst
hh
parents:
diff changeset
   816
	DL	deP				# -->Debug inst
hh
parents:
diff changeset
   817
	DL	retry				# retry counter
hh
parents:
diff changeset
   818
	DL	ai, AddrInfoL			# IP addrinfo
hh
parents:
diff changeset
   819
	DL	aiP				# -->IP addrinfo
hh
parents:
diff changeset
   820
	DL	str, 64				# string buf
hh
parents:
diff changeset
   821
	DL	currSockP			# -->SocketInfo save area
hh
parents:
diff changeset
   822
	locL = ac
hh
parents:
diff changeset
   823
#-----------------------------------------------
hh
parents:
diff changeset
   824
	.global N.conn
hh
parents:
diff changeset
   825
N.conn:
hh
parents:
diff changeset
   826
	PROLOG
hh
parents:
diff changeset
   827
	mov	b, thisP(bp)			# save -->this Node
hh
parents:
diff changeset
   828
	lea	debug(bp), a			# -->own local debug block
hh
parents:
diff changeset
   829
	mov	a, deP(bp)			# save -->local Debug
hh
parents:
diff changeset
   830
	pushl	remPort(bp)			# remote port
hh
parents:
diff changeset
   831
	lea	N.debug(b), d			# -->node's Debug
hh
parents:
diff changeset
   832
	lea	D.id(d), a			# -->node's debug ID
hh
parents:
diff changeset
   833
	push	a
hh
parents:
diff changeset
   834
	DEBID	"%s to %u", 2			# set local debug ID
hh
parents:
diff changeset
   835
	LOG	3, "connecting...", 0
hh
parents:
diff changeset
   836
hh
parents:
diff changeset
   837
	mov	N.cliSideP(b), c		# -->SocketInfo array
hh
parents:
diff changeset
   838
	mov	$SocketInfoL, a
hh
parents:
diff changeset
   839
	mull	i(bp)				# SocketInfo offset
hh
parents:
diff changeset
   840
	lea	(c, a), c			# -->curr SocketInfo
hh
parents:
diff changeset
   841
	mov	c, currSockP(bp)		# save -->curr SocketInfo
hh
parents:
diff changeset
   842
	mov	remPort(bp), a
hh
parents:
diff changeset
   843
	mov	a, So.remPort(c)		# put remote port # into curr SocketInfo
hh
parents:
diff changeset
   844
# prepare IP addrinfo hints
hh
parents:
diff changeset
   845
	pushl	$AddrInfoL			# IP addrinfo length
hh
parents:
diff changeset
   846
	pushl	$0
hh
parents:
diff changeset
   847
	lea	ai(bp), a
hh
parents:
diff changeset
   848
	mov	a, aiP(bp)			# -->IP addrinfo
hh
parents:
diff changeset
   849
	push	a
hh
parents:
diff changeset
   850
	call	memset				# clear addrinfo
hh
parents:
diff changeset
   851
	movl	$2, ai_family(a)		# AF_INET
hh
parents:
diff changeset
   852
	movl	$0, ai_flags(a)
hh
parents:
diff changeset
   853
	movl	$0, ai_protocol(a)		# any protocol
hh
parents:
diff changeset
   854
	movl	$1, ai_socktype(a)		# SOCK_STREAM
hh
parents:
diff changeset
   855
# set up port # string
hh
parents:
diff changeset
   856
	mov	currSockP(bp), a		# -->curr socket info
hh
parents:
diff changeset
   857
	pushl	So.remPort(a)			# remote port#
hh
parents:
diff changeset
   858
	pushl	$0f
hh
parents:
diff changeset
   859
	lea	str(bp), a
hh
parents:
diff changeset
   860
	push	a				# -->port# string
hh
parents:
diff changeset
   861
	call	sprintf
hh
parents:
diff changeset
   862
	jmp	1f
hh
parents:
diff changeset
   863
0:	.ascii	"%u\0"
hh
parents:
diff changeset
   864
# get IP addrinfo block chain
hh
parents:
diff changeset
   865
1:	lea	aiP(bp), a			# -->-->IP addrinfo
hh
parents:
diff changeset
   866
	push	a
hh
parents:
diff changeset
   867
	pushl	aiP(bp)				# -->IP addrinfo hints
hh
parents:
diff changeset
   868
	lea	str(bp), a			# -->remote port # string
hh
parents:
diff changeset
   869
	push	a
hh
parents:
diff changeset
   870
	pushl	$0f
hh
parents:
diff changeset
   871
	call	getaddrinfo
hh
parents:
diff changeset
   872
	jmp	1f
hh
parents:
diff changeset
   873
0:	.ascii	"localhost\0"
hh
parents:
diff changeset
   874
# check IP addr
hh
parents:
diff changeset
   875
1:	cmp	$0, a				# getaddrinfo OK ?
hh
parents:
diff changeset
   876
	jz	0f				# yes
hh
parents:
diff changeset
   877
	push	a
hh
parents:
diff changeset
   878
	call	gai_strerror
hh
parents:
diff changeset
   879
	push	a
hh
parents:
diff changeset
   880
	LOG	0, "getaddrinfo error: %s, ABEND", 1
hh
parents:
diff changeset
   881
	push	$1
hh
parents:
diff changeset
   882
	call	exit				# ABEND
hh
parents:
diff changeset
   883
# log assigned IP addr
hh
parents:
diff changeset
   884
0:	pushl	deP(bp)				# -->Debug inst
hh
parents:
diff changeset
   885
	mov	aiP(bp), a			# -->IP addrinfo
hh
parents:
diff changeset
   886
	pushl	ai_addrP(a)			# -->sockaddr
hh
parents:
diff changeset
   887
	lea	str(bp), a
hh
parents:
diff changeset
   888
	push	a				# -->string buf
hh
parents:
diff changeset
   889
	call	gai
hh
parents:
diff changeset
   890
	LOG	5, "getaddrinfo OK, %s", 1
hh
parents:
diff changeset
   891
# allocate comm socket
hh
parents:
diff changeset
   892
	mov	aiP(bp), a			# -->IP addrinfo
hh
parents:
diff changeset
   893
	pushl	ai_protocol(a)
hh
parents:
diff changeset
   894
	pushl	ai_socktype(a)
hh
parents:
diff changeset
   895
	pushl	ai_family(a)
hh
parents:
diff changeset
   896
#	call	socket				# allocate comm socket
hh
parents:
diff changeset
   897
#	cmp	$0, a
hh
parents:
diff changeset
   898
#	jg	0f
hh
parents:
diff changeset
   899
#	SYSERR	"socket alloc"
hh
parents:
diff changeset
   900
#0:
hh
parents:
diff changeset
   901
	SYS	socket
hh
parents:
diff changeset
   902
	mov	currSockP(bp), c		# -->curr SocketInfo
hh
parents:
diff changeset
   903
	mov	a, So.sc(c)			# put new socket # into SocketInfo
hh
parents:
diff changeset
   904
# connect to remote partner server side
hh
parents:
diff changeset
   905
	mov	C.csP, a
hh
parents:
diff changeset
   906
	mov	C.connTh(a), a			# conn retry threshold
hh
parents:
diff changeset
   907
	mov	a, retry(bp)			# initilize retry counter
hh
parents:
diff changeset
   908
	mov	aiP(bp), a			# -->IP addrinfo
hh
parents:
diff changeset
   909
	pushl	ai_addrlen(a)
hh
parents:
diff changeset
   910
	pushl	ai_addrP(a)
hh
parents:
diff changeset
   911
	pushl	So.sc(c)			# socket #
hh
parents:
diff changeset
   912
2:	call	connect
hh
parents:
diff changeset
   913
	cmp	$0, a
hh
parents:
diff changeset
   914
	jnl	0f				# connected
hh
parents:
diff changeset
   915
	call    __errno_location                # get --> sys errno
hh
parents:
diff changeset
   916
	cmp	$111, (a)			# ECONNREFUSED ?
hh
parents:
diff changeset
   917
	je	1f				# yes, wait to retry
hh
parents:
diff changeset
   918
	SYSERR	"connect"			# no, ABEND
hh
parents:
diff changeset
   919
1:	pushl	$22000				# 22 msecs
hh
parents:
diff changeset
   920
	call	usleep
hh
parents:
diff changeset
   921
	lea	4(sp), sp
hh
parents:
diff changeset
   922
	sub	$1, retry(bp)
hh
parents:
diff changeset
   923
	jnz	2b				# iterate
hh
parents:
diff changeset
   924
# conn retry threshold reached
hh
parents:
diff changeset
   925
	mov	C.csP, a
hh
parents:
diff changeset
   926
	pushl	C.connTh(a)
hh
parents:
diff changeset
   927
	LOG	0, "connection refused, threshold %d reached", 1
hh
parents:
diff changeset
   928
	pushl	$1
hh
parents:
diff changeset
   929
	call	exit				# ABEND
hh
parents:
diff changeset
   930
0:
hh
parents:
diff changeset
   931
# connected, account new connection
hh
parents:
diff changeset
   932
	mov	C.csP, c			# -->CS
hh
parents:
diff changeset
   933
	mov	C.shP(c), a			# -->shared mem
hh
parents:
diff changeset
   934
	lea	S.counter_sem(a), a		# -->overall counter semaphore
hh
parents:
diff changeset
   935
	push	a
hh
parents:
diff changeset
   936
	SYS	sem_wait
hh
parents:
diff changeset
   937
	mov	C.csP, c			# -->CS
hh
parents:
diff changeset
   938
	mov	C.shP(c), a			# -->shared mem
hh
parents:
diff changeset
   939
	incl	S.conns(a)			# incr conns counter
hh
parents:
diff changeset
   940
	lea	S.counter_sem(a), a		# -->overall msg counter semaphore
hh
parents:
diff changeset
   941
	push	a
hh
parents:
diff changeset
   942
	SYS	sem_post
hh
parents:
diff changeset
   943
# prepare SSL
hh
parents:
diff changeset
   944
	cmp	$1, N.ssl(b)			# node's ssl switch
hh
parents:
diff changeset
   945
	jne	N.connRet			# no SSL
hh
parents:
diff changeset
   946
hh
parents:
diff changeset
   947
	LOG	5, "prepare for SSL"
hh
parents:
diff changeset
   948
	pushl	N.ctxP(b)			# -->SSL context
hh
parents:
diff changeset
   949
	call	SSL_new				# create a SSL structure
hh
parents:
diff changeset
   950
hh
parents:
diff changeset
   951
	mov	currSockP(bp), c		# -->curr SocketInfo
hh
parents:
diff changeset
   952
	mov	a, So.sslP(c)			# put -->SSL struct into SocketInfo
hh
parents:
diff changeset
   953
	test	a, a
hh
parents:
diff changeset
   954
	jnz	0f
hh
parents:
diff changeset
   955
	SSLERR	"new SSL"
hh
parents:
diff changeset
   956
# connect on SSL
hh
parents:
diff changeset
   957
0:	call	ERR_clear_error
hh
parents:
diff changeset
   958
	mov	currSockP(bp), c		# -->curr SocketInfo
hh
parents:
diff changeset
   959
	pushl	So.sc(c)			# socket
hh
parents:
diff changeset
   960
	pushl	So.sslP(c)			# -->SSL struct
hh
parents:
diff changeset
   961
	call	SSL_set_fd			# connect the SSL object with a file descriptor
hh
parents:
diff changeset
   962
	test	a, a
hh
parents:
diff changeset
   963
	jnz	0f
hh
parents:
diff changeset
   964
	SSLERR	"client SSL set fd"
hh
parents:
diff changeset
   965
0:
hh
parents:
diff changeset
   966
	LOG	5, "SSL fd set"
hh
parents:
diff changeset
   967
	mov	currSockP(bp), c		# -->curr SocketInfo
hh
parents:
diff changeset
   968
	pushl	So.sslP(c)			# -->SSL struct
hh
parents:
diff changeset
   969
	call	SSL_connect
hh
parents:
diff changeset
   970
	test	a, a				# connected ?
hh
parents:
diff changeset
   971
	jns	1f				# yes
hh
parents:
diff changeset
   972
	push	a
hh
parents:
diff changeset
   973
	mov	currSockP(bp), c		# -->curr SocketInfo
hh
parents:
diff changeset
   974
	pushl	So.sslP(c)			# -->SSL struct
hh
parents:
diff changeset
   975
	call	SSL_get_error			# SSL_get_error(-->ssl, err)
hh
parents:
diff changeset
   976
	cmp	$5, a				# SSL_ERROR_SYSCALL ?
hh
parents:
diff changeset
   977
	jne	0f				# no, other SSL err
hh
parents:
diff changeset
   978
	SYSERR	"SSL connect"
hh
parents:
diff changeset
   979
0:	SSLERR	"SSL connect"
hh
parents:
diff changeset
   980
1:
hh
parents:
diff changeset
   981
	mov	C.csP, a
hh
parents:
diff changeset
   982
	mov	C.connTh(a), a
hh
parents:
diff changeset
   983
	sub	retry(bp), a			# # of retries = conn threshold - counter
hh
parents:
diff changeset
   984
	push	a
hh
parents:
diff changeset
   985
	mov	currSockP(bp), c		# -->curr SocketInfo
hh
parents:
diff changeset
   986
	pushl	So.sc(c)			# socket#
hh
parents:
diff changeset
   987
	LOG	2, "connected via sc=%d after %d retries", 2
hh
parents:
diff changeset
   988
N.connRet:
hh
parents:
diff changeset
   989
	EPILOG
hh
parents:
diff changeset
   990
#-----------------------------------------------
hh
parents:
diff changeset
   991
#	A C C E P T   C O N N E C T I O N
hh
parents:
diff changeset
   992
#-----------------------------------------------
hh
parents:
diff changeset
   993
	ARGS
hh
parents:
diff changeset
   994
	DS	i				# socket rank
hh
parents:
diff changeset
   995
# returns
hh
parents:
diff changeset
   996
#	nothing
hh
parents:
diff changeset
   997
# local vars
hh
parents:
diff changeset
   998
	PROLOC
hh
parents:
diff changeset
   999
	DL	thisP				# -->this Node
hh
parents:
diff changeset
  1000
	DL	deP				# -->Debug inst
hh
parents:
diff changeset
  1001
	DL	sa, SockAddrL			# sockaddr
hh
parents:
diff changeset
  1002
	DL	str, 64				# string buf
hh
parents:
diff changeset
  1003
	DL	currSockP			# -->curr SocketInfo save area
hh
parents:
diff changeset
  1004
	EPILOC
hh
parents:
diff changeset
  1005
#-----------------------------------------------
hh
parents:
diff changeset
  1006
	.global N.acc
hh
parents:
diff changeset
  1007
N.acc:
hh
parents:
diff changeset
  1008
	PROLOG
hh
parents:
diff changeset
  1009
	mov	b, thisP(bp)			# save -->this Node
hh
parents:
diff changeset
  1010
	lea	N.debug(b), a
hh
parents:
diff changeset
  1011
	mov	a, deP(bp)			# save local -->Debug
hh
parents:
diff changeset
  1012
	LOG	4, "accepting..."
hh
parents:
diff changeset
  1013
hh
parents:
diff changeset
  1014
	mov	N.srvSideP(b), c		# -->SocketInfo array
hh
parents:
diff changeset
  1015
	mov	$SocketInfoL, a
hh
parents:
diff changeset
  1016
	mull	i(bp)				# curr SocketInfo offset
hh
parents:
diff changeset
  1017
	lea	(c, a), a			# -->curr SocketInfo
hh
parents:
diff changeset
  1018
	mov	a, currSockP(bp)		# save -->curr SocketInfo
hh
parents:
diff changeset
  1019
# accept
hh
parents:
diff changeset
  1020
	pushl	$0
hh
parents:
diff changeset
  1021
	pushl	$0
hh
parents:
diff changeset
  1022
#	mov	thisP, b			# -->Node inst
hh
parents:
diff changeset
  1023
	pushl	N.ssc(b)			# listen socket
hh
parents:
diff changeset
  1024
#	call	accept
hh
parents:
diff changeset
  1025
#	cmp	$0, a
hh
parents:
diff changeset
  1026
#	jnl	0f
hh
parents:
diff changeset
  1027
#	SYSERR	"accept"
hh
parents:
diff changeset
  1028
#0:
hh
parents:
diff changeset
  1029
	SYS	accept
hh
parents:
diff changeset
  1030
	mov	currSockP(bp), c		# -->Node inst
hh
parents:
diff changeset
  1031
	mov	a, So.sc(c)			# save comm socket of accepted connection
hh
parents:
diff changeset
  1032
	pushl	$0f				# -->sa length
hh
parents:
diff changeset
  1033
	lea	sa(bp), a			# -->sockaddr
hh
parents:
diff changeset
  1034
	push	a
hh
parents:
diff changeset
  1035
	pushl	So.sc(c)			# comm socket
hh
parents:
diff changeset
  1036
	call	getpeername
hh
parents:
diff changeset
  1037
	jmp	1f
hh
parents:
diff changeset
  1038
0:	.int	SockAddrL
hh
parents:
diff changeset
  1039
1:	pushl	deP(bp)
hh
parents:
diff changeset
  1040
	lea	sa(bp), a			# -->sockaddr
hh
parents:
diff changeset
  1041
	push	a
hh
parents:
diff changeset
  1042
	lea	str(bp), a			# -->string buf
hh
parents:
diff changeset
  1043
	push	a
hh
parents:
diff changeset
  1044
	call	gai				# get string of addr/port
hh
parents:
diff changeset
  1045
	mov	currSockP(bp), c		# -->curr SocketInfo
hh
parents:
diff changeset
  1046
	pushl	So.sc(c)			# comm socket
hh
parents:
diff changeset
  1047
	LOG	3, "peer: sc=%d, %s", 2
hh
parents:
diff changeset
  1048
# prepare SSL
hh
parents:
diff changeset
  1049
	mov	thisP(bp), b			# -->this Node
hh
parents:
diff changeset
  1050
	cmp	$1, N.ssl(b)			# node's ssl switch
hh
parents:
diff changeset
  1051
	jne	1f				# no SSL
hh
parents:
diff changeset
  1052
hh
parents:
diff changeset
  1053
	pushl	N.ctxP(b)			# -->SSL context
hh
parents:
diff changeset
  1054
	call	SSL_new				# create a SSL structure
hh
parents:
diff changeset
  1055
	mov	currSockP(bp), c		# -->curr SocketInfo
hh
parents:
diff changeset
  1056
	mov	a, So.sslP(c)			# put -->SSL struct into SocketInfo
hh
parents:
diff changeset
  1057
	test	a, a
hh
parents:
diff changeset
  1058
	jnz	0f
hh
parents:
diff changeset
  1059
	SSLERR	"new SSL"
hh
parents:
diff changeset
  1060
# accept on SSL
hh
parents:
diff changeset
  1061
0:	call	ERR_clear_error
hh
parents:
diff changeset
  1062
	mov	currSockP(bp), c		# -->curr SocketInfo
hh
parents:
diff changeset
  1063
	pushl	So.sc(c)			# socket #
hh
parents:
diff changeset
  1064
	pushl	So.sslP(c)			# -->SSL struct
hh
parents:
diff changeset
  1065
	call	SSL_set_fd			# connect the SSL object with a file descriptor
hh
parents:
diff changeset
  1066
	test	a, a
hh
parents:
diff changeset
  1067
	jnz	0f
hh
parents:
diff changeset
  1068
	SSLERR	"client SSL set fd"
hh
parents:
diff changeset
  1069
0:
hh
parents:
diff changeset
  1070
	LOG	5, "SSL fd set"
hh
parents:
diff changeset
  1071
	call	SSL_accept
hh
parents:
diff changeset
  1072
	test	a, a
hh
parents:
diff changeset
  1073
	jns	1f
hh
parents:
diff changeset
  1074
	mov	a, 4(sp)
hh
parents:
diff changeset
  1075
	call	SSL_get_error			# SSL_get_error(-->ssl, err)
hh
parents:
diff changeset
  1076
	cmp	$5, a				# SSL_ERROR_SYSCALL ?
hh
parents:
diff changeset
  1077
	jne	0f				# no, other SSL err
hh
parents:
diff changeset
  1078
	SYSERR	"SSL accept"
hh
parents:
diff changeset
  1079
0:	SSLERR	"SSL accept"
hh
parents:
diff changeset
  1080
1:
hh
parents:
diff changeset
  1081
	LOG	2, "accepted"
hh
parents:
diff changeset
  1082
	EPILOG
hh
parents:
diff changeset
  1083
#-----------------------------------------------
hh
parents:
diff changeset
  1084
#	R E A D   F R O M   C O M M   S O C K E T
hh
parents:
diff changeset
  1085
#-----------------------------------------------
hh
parents:
diff changeset
  1086
	ARGS
hh
parents:
diff changeset
  1087
	DS	sci				# SocketInfo rank
hh
parents:
diff changeset
  1088
# returns	length read
hh
parents:
diff changeset
  1089
	PROLOC
hh
parents:
diff changeset
  1090
	DL	thisP				# -->this Node
hh
parents:
diff changeset
  1091
	DL	deP				# -->Debug inst
hh
parents:
diff changeset
  1092
	DL	shP				# -->shared mem
hh
parents:
diff changeset
  1093
	DL	currSockP			# -->curr SocketInfo
hh
parents:
diff changeset
  1094
	DL	n				# len read
hh
parents:
diff changeset
  1095
	DL	rest				# len to be read
hh
parents:
diff changeset
  1096
	DL	buf				# read dest
hh
parents:
diff changeset
  1097
	EPILOC
hh
parents:
diff changeset
  1098
#-----------------------------------------------
hh
parents:
diff changeset
  1099
	.global N.read
hh
parents:
diff changeset
  1100
N.read:
hh
parents:
diff changeset
  1101
	PROLOG
hh
parents:
diff changeset
  1102
	mov	b, thisP(bp)			# save -->this Node
hh
parents:
diff changeset
  1103
	lea	N.debug(b), a
hh
parents:
diff changeset
  1104
	mov	a, deP(bp)			# save local -->Debug
hh
parents:
diff changeset
  1105
hh
parents:
diff changeset
  1106
	mov	C.csP, a			# -->CS
hh
parents:
diff changeset
  1107
	mov	C.shP(a), a			# -->shared mem
hh
parents:
diff changeset
  1108
	mov	a, shP(bp)			# save -->shared mem
hh
parents:
diff changeset
  1109
	push	N.dataP(b)
hh
parents:
diff changeset
  1110
	call	Da.getDataLen
hh
parents:
diff changeset
  1111
	mov	a, rest(bp)			# init len to be read
hh
parents:
diff changeset
  1112
	call	Da.getContP
hh
parents:
diff changeset
  1113
	mov	a, buf(bp)			# init read dest
hh
parents:
diff changeset
  1114
	mov	N.srvSideP(b), c		# -->server side SocketInfo array
hh
parents:
diff changeset
  1115
	mov	$SocketInfoL, a
hh
parents:
diff changeset
  1116
	mull	sci(bp)				# curr SocketInfo offset
hh
parents:
diff changeset
  1117
	lea	(c, a), c			# -->curr SocketInfo
hh
parents:
diff changeset
  1118
	mov	c, currSockP(bp)		# save -->curr SocketInfo
hh
parents:
diff changeset
  1119
hh
parents:
diff changeset
  1120
	push	So.sc(c)			# comm socket
hh
parents:
diff changeset
  1121
	push	rest(bp)			# len to be read
hh
parents:
diff changeset
  1122
	LOG	5, "ready to read len=%d from sc=%d..."
hh
parents:
diff changeset
  1123
# iterate on reading until whole length is read
hh
parents:
diff changeset
  1124
N.readIterate:
hh
parents:
diff changeset
  1125
	cmp	$0, rest(bp)			# something to be read ?
hh
parents:
diff changeset
  1126
	jng	N.readAcc			# no, end reading
hh
parents:
diff changeset
  1127
	push	rest(bp)			# len to be read
hh
parents:
diff changeset
  1128
	push	buf(bp)				# read dest
hh
parents:
diff changeset
  1129
	mov	currSockP(bp), c		# curr SocketInfo
hh
parents:
diff changeset
  1130
	cmp	$1, N.ssl(b)			# SSL ?
hh
parents:
diff changeset
  1131
	jne	0f				# no
hh
parents:
diff changeset
  1132
# read w/ SSL
hh
parents:
diff changeset
  1133
	push	So.sslP(c)			# -->SSL struct
hh
parents:
diff changeset
  1134
	SYS	SSL_read
hh
parents:
diff changeset
  1135
	jmp	1f
hh
parents:
diff changeset
  1136
# read w/o SSL
hh
parents:
diff changeset
  1137
0:
hh
parents:
diff changeset
  1138
	push	So.sc(c)			# socket #
hh
parents:
diff changeset
  1139
	SYS	read
hh
parents:
diff changeset
  1140
# adjust read controls
hh
parents:
diff changeset
  1141
1:
hh
parents:
diff changeset
  1142
	jz	N.readEof			# EOF read
hh
parents:
diff changeset
  1143
	add	a, buf(bp)			# adjust -->read dest
hh
parents:
diff changeset
  1144
	sub	a, rest(bp)			# decrement rest to read
hh
parents:
diff changeset
  1145
	cmp	$0, rest(bp)			# everything read ?
hh
parents:
diff changeset
  1146
	jng	0f
hh
parents:
diff changeset
  1147
	push	a
hh
parents:
diff changeset
  1148
	LOG	5, "partly read %d bytes"
hh
parents:
diff changeset
  1149
0:	jmp	N.readIterate
hh
parents:
diff changeset
  1150
# account data just read
hh
parents:
diff changeset
  1151
N.readAcc:
hh
parents:
diff changeset
  1152
	mov	shP(bp), a			# -->shared mem
hh
parents:
diff changeset
  1153
	lea	S.counter_sem(a), a		# overall msg counter semaphore
hh
parents:
diff changeset
  1154
	push	a
hh
parents:
diff changeset
  1155
	SYS	sem_wait			# get semaphore
hh
parents:
diff changeset
  1156
	mov	shP(bp), a
hh
parents:
diff changeset
  1157
	incl	S.msgs(a)			# incr msgs counter
hh
parents:
diff changeset
  1158
	lea	S.counter_sem(a), a		# overall msg counter semaphore
hh
parents:
diff changeset
  1159
	push	a
hh
parents:
diff changeset
  1160
	SYS	sem_post			# post semaphore
hh
parents:
diff changeset
  1161
hh
parents:
diff changeset
  1162
	lea	-4(sp), sp			# adjust stacker
hh
parents:
diff changeset
  1163
	push	N.dataP(b)			# -->Data
hh
parents:
diff changeset
  1164
	call	Da.getPort
hh
parents:
diff changeset
  1165
	mov	a, 4(sp)			# remote listen port
hh
parents:
diff changeset
  1166
	call	Da.getDataLen
hh
parents:
diff changeset
  1167
	mov	a, (sp)				# data length
hh
parents:
diff changeset
  1168
	LOG	5, "%d read from node %u"
hh
parents:
diff changeset
  1169
	mov	(sp), a				# return len read
hh
parents:
diff changeset
  1170
	jmp	N.readRet
hh
parents:
diff changeset
  1171
# EOF read, finish
hh
parents:
diff changeset
  1172
N.readEof:
hh
parents:
diff changeset
  1173
	LOG	4, "EOF read"
hh
parents:
diff changeset
  1174
N.readRet:
hh
parents:
diff changeset
  1175
	EPILOG_R
hh
parents:
diff changeset
  1176
#-----------------------------------------------
hh
parents:
diff changeset
  1177
#	W R I T E   T O   C O M M   S O C K E T
hh
parents:
diff changeset
  1178
#-----------------------------------------------
hh
parents:
diff changeset
  1179
	ARGS
hh
parents:
diff changeset
  1180
	DS	sci				# SocketInfo rank
hh
parents:
diff changeset
  1181
# returns	length written
hh
parents:
diff changeset
  1182
	PROLOC
hh
parents:
diff changeset
  1183
	DL	thisP				# -->this Node
hh
parents:
diff changeset
  1184
	DL	deP				# -->Debug inst
hh
parents:
diff changeset
  1185
	DL	currSockP			# -->curr SocketInfo
hh
parents:
diff changeset
  1186
	DL	n				# len written
hh
parents:
diff changeset
  1187
	DL	rest				# len to be written
hh
parents:
diff changeset
  1188
	DL	buf				# write orig
hh
parents:
diff changeset
  1189
	EPILOC
hh
parents:
diff changeset
  1190
#-----------------------------------------------
hh
parents:
diff changeset
  1191
	.global N.write
hh
parents:
diff changeset
  1192
N.write:
hh
parents:
diff changeset
  1193
	PROLOG
hh
parents:
diff changeset
  1194
	mov	b, thisP(bp)			# save -->this Node
hh
parents:
diff changeset
  1195
	lea	N.debug(b), a
hh
parents:
diff changeset
  1196
	mov	a, deP(bp)			# save local -->Debug
hh
parents:
diff changeset
  1197
# init control values
hh
parents:
diff changeset
  1198
	mov	C.csP, a			# -->CS
hh
parents:
diff changeset
  1199
	mov	C.shP(a), a			# -->shared mem
hh
parents:
diff changeset
  1200
	mov	a, shP(bp)			# save -->shared mem
hh
parents:
diff changeset
  1201
	push	N.dataP(b)			# -->Data
hh
parents:
diff changeset
  1202
	call	Da.getDataLen
hh
parents:
diff changeset
  1203
	mov	a, rest(bp)			# init len to be written
hh
parents:
diff changeset
  1204
	call	Da.getContP
hh
parents:
diff changeset
  1205
	mov	a, buf(bp)			# init write orig
hh
parents:
diff changeset
  1206
	mov	N.cliSideP(b), c		# -->SocketInfo array
hh
parents:
diff changeset
  1207
	mov	$SocketInfoL, a
hh
parents:
diff changeset
  1208
	mull	sci(bp)				# curr SocketInfo offset
hh
parents:
diff changeset
  1209
	lea	(c, a), c			# -->curr SocketInfo
hh
parents:
diff changeset
  1210
	mov	c, currSockP(bp)		# save -->curr SocketInfo
hh
parents:
diff changeset
  1211
hh
parents:
diff changeset
  1212
	push	So.sc(c)			# comm socket
hh
parents:
diff changeset
  1213
	push	rest(bp)			# len to be written
hh
parents:
diff changeset
  1214
	LOG	5, "ready to write len=%d to sc=%d..."
hh
parents:
diff changeset
  1215
# iterate on writing until whole length is written
hh
parents:
diff changeset
  1216
N.writeIterate:
hh
parents:
diff changeset
  1217
	cmp	$0, rest(bp)			# something to be written ?
hh
parents:
diff changeset
  1218
	jng	N.writeEnd			# no, end writing
hh
parents:
diff changeset
  1219
	push	rest(bp)			# len to be written
hh
parents:
diff changeset
  1220
	push	buf(bp)				# write orig
hh
parents:
diff changeset
  1221
	cmp	$1, N.ssl(b)			# SSL ?
hh
parents:
diff changeset
  1222
	jne	0f				# no
hh
parents:
diff changeset
  1223
# SSL
hh
parents:
diff changeset
  1224
	pushl	So.sslP(c)			# -->SSL struct
hh
parents:
diff changeset
  1225
	SYS	SSL_write
hh
parents:
diff changeset
  1226
	jmp	1f
hh
parents:
diff changeset
  1227
# no SSL
hh
parents:
diff changeset
  1228
0:
hh
parents:
diff changeset
  1229
	pushl	So.sc(c)			# socket
hh
parents:
diff changeset
  1230
	SYS	write
hh
parents:
diff changeset
  1231
# adjust write controls
hh
parents:
diff changeset
  1232
1:
hh
parents:
diff changeset
  1233
	mov	a, n(bp)			# save len written
hh
parents:
diff changeset
  1234
	add	a, buf(bp)			# adjust write orig
hh
parents:
diff changeset
  1235
	sub	a, rest(bp)			# decrement rest to write
hh
parents:
diff changeset
  1236
	cmp	$0, rest(bp)			# everything written ?
hh
parents:
diff changeset
  1237
	jng	0f
hh
parents:
diff changeset
  1238
	push	a
hh
parents:
diff changeset
  1239
	LOG	5, "partly written %d bytes"
hh
parents:
diff changeset
  1240
0:	jmp	N.writeIterate
hh
parents:
diff changeset
  1241
# return datalen
hh
parents:
diff changeset
  1242
N.writeEnd:
hh
parents:
diff changeset
  1243
	mov	N.dataP(b), a
hh
parents:
diff changeset
  1244
	mov	Da.datalen(a), a
hh
parents:
diff changeset
  1245
	push	a
hh
parents:
diff changeset
  1246
	LOG	5, "%d written", 1
hh
parents:
diff changeset
  1247
	EPILOG_R
hh
parents:
diff changeset
  1248
#-----------------------------------------------
hh
parents:
diff changeset
  1249
#	G E T   D A T A   F R O M   C O M M   S O C K E T
hh
parents:
diff changeset
  1250
#-----------------------------------------------
hh
parents:
diff changeset
  1251
	ARGS
hh
parents:
diff changeset
  1252
	DS	sci				# SocketInfo rank
hh
parents:
diff changeset
  1253
# returns	boolean: 0 - EOF read, 1 - data read
hh
parents:
diff changeset
  1254
	PROLOC
hh
parents:
diff changeset
  1255
	DL	thisP				# -->this Node
hh
parents:
diff changeset
  1256
	DL	deP
hh
parents:
diff changeset
  1257
	EPILOC
hh
parents:
diff changeset
  1258
#-----------------------------------------------
hh
parents:
diff changeset
  1259
	.global N.get
hh
parents:
diff changeset
  1260
N.get:
hh
parents:
diff changeset
  1261
	PROLOG
hh
parents:
diff changeset
  1262
	mov	b, thisP(bp)			# save -->this Node
hh
parents:
diff changeset
  1263
	lea	N.debug(b), a
hh
parents:
diff changeset
  1264
	mov	a, deP(bp)			# save local -->Debug
hh
parents:
diff changeset
  1265
	push	sci(bp)				# SocketInfo rank
hh
parents:
diff changeset
  1266
	LOG	5, "get data from socket, rank=%u"
hh
parents:
diff changeset
  1267
	call	N.read
hh
parents:
diff changeset
  1268
	test	a, a
hh
parents:
diff changeset
  1269
	jz	0f
hh
parents:
diff changeset
  1270
	mov	$1, a
hh
parents:
diff changeset
  1271
0:	EPILOG_R
hh
parents:
diff changeset
  1272
#-----------------------------------------------
hh
parents:
diff changeset
  1273
#	P U T   D A T A   T O   C O M M   S O C K E T
hh
parents:
diff changeset
  1274
#-----------------------------------------------
hh
parents:
diff changeset
  1275
	ARGS
hh
parents:
diff changeset
  1276
	DS	sci				# SocketInfo rank
hh
parents:
diff changeset
  1277
# returns	boolean: 0 - nothing written, 1 - data written
hh
parents:
diff changeset
  1278
	PROLOC
hh
parents:
diff changeset
  1279
	DL	thisP				# -->this Node
hh
parents:
diff changeset
  1280
	DL	deP
hh
parents:
diff changeset
  1281
	EPILOC
hh
parents:
diff changeset
  1282
#-----------------------------------------------
hh
parents:
diff changeset
  1283
	.global N.put
hh
parents:
diff changeset
  1284
N.put:
hh
parents:
diff changeset
  1285
	PROLOG
hh
parents:
diff changeset
  1286
	mov	b, thisP(bp)			# save -->this Node
hh
parents:
diff changeset
  1287
	lea	N.debug(b), a
hh
parents:
diff changeset
  1288
	mov	a, deP(bp)			# save local -->Debug
hh
parents:
diff changeset
  1289
	LOG	5, "put data to socket"
hh
parents:
diff changeset
  1290
hh
parents:
diff changeset
  1291
	mov	N.dataP(b), d			# -->Data
hh
parents:
diff changeset
  1292
	mov	Da.contP(d), a			# -->container
hh
parents:
diff changeset
  1293
	lea	Co.hdr(a), a			# -->header
hh
parents:
diff changeset
  1294
	mov	N.locPort(b), c
hh
parents:
diff changeset
  1295
	mov	c, H.lport(a)			# listen port to header
hh
parents:
diff changeset
  1296
hh
parents:
diff changeset
  1297
	pushl	sci(bp)				# SocketInfo rank
hh
parents:
diff changeset
  1298
	call	N.write
hh
parents:
diff changeset
  1299
	test	a, a
hh
parents:
diff changeset
  1300
	jz	0f
hh
parents:
diff changeset
  1301
	mov	$1, a
hh
parents:
diff changeset
  1302
0:	EPILOG_R
hh
parents:
diff changeset
  1303
#-----------------------------------------------
hh
parents:
diff changeset
  1304
#	C L O S E   C O N N E C T I O N   S O C K E T
hh
parents:
diff changeset
  1305
#-----------------------------------------------
hh
parents:
diff changeset
  1306
	ARGS
hh
parents:
diff changeset
  1307
	DS	sci				# SocketInfo rank
hh
parents:
diff changeset
  1308
	DS	server				# indicate server or client
hh
parents:
diff changeset
  1309
	DS	deP				# -->Debug inst
hh
parents:
diff changeset
  1310
# returns:#	nothing
hh
parents:
diff changeset
  1311
	PROLOC
hh
parents:
diff changeset
  1312
	DL	thisP				# -->this Node
hh
parents:
diff changeset
  1313
	DL	currSockP			# -->curr SocketInfo
hh
parents:
diff changeset
  1314
	DL	tagP
hh
parents:
diff changeset
  1315
	DL	e
hh
parents:
diff changeset
  1316
	EPILOC
hh
parents:
diff changeset
  1317
N.srvSideTag:	.asciz	"server side"
hh
parents:
diff changeset
  1318
N.cliSideTag:	.asciz	"client side"
hh
parents:
diff changeset
  1319
#-----------------------------------------------
hh
parents:
diff changeset
  1320
	.global N.closeSocket
hh
parents:
diff changeset
  1321
N.closeSocket:
hh
parents:
diff changeset
  1322
	PROLOG
hh
parents:
diff changeset
  1323
	mov	b, thisP(bp)			# save -->this Node
hh
parents:
diff changeset
  1324
	mov	N.srvSideP(b), c		# -->SocketInfo array
hh
parents:
diff changeset
  1325
	movl	$N.srvSideTag, tagP(bp)
hh
parents:
diff changeset
  1326
	cmp	$1, server(bp)			# server side ?
hh
parents:
diff changeset
  1327
	je	0f
hh
parents:
diff changeset
  1328
	mov	N.cliSideP(b), c		# client side
hh
parents:
diff changeset
  1329
	movl	$N.cliSideTag, tagP(bp)
hh
parents:
diff changeset
  1330
0:	mov	$SocketInfoL, a
hh
parents:
diff changeset
  1331
	mull	sci(bp)				# curr SocketInfo offset
hh
parents:
diff changeset
  1332
	lea	(c, a), c
hh
parents:
diff changeset
  1333
	mov	c, currSockP(bp)		# save -->curr SocketInfo
hh
parents:
diff changeset
  1334
	push	So.sc(c)			# socket to close
hh
parents:
diff changeset
  1335
	push	tagP(bp)
hh
parents:
diff changeset
  1336
	LOG	5, "closing %s sc=%u...", 2
hh
parents:
diff changeset
  1337
hh
parents:
diff changeset
  1338
	cmp	$0, N.ssl(b)			# SSL ?
hh
parents:
diff changeset
  1339
	je	2f				# no
hh
parents:
diff changeset
  1340
# SSL shutdown
hh
parents:
diff changeset
  1341
	pushl	So.sslP(c)			# -->SSL structure
hh
parents:
diff changeset
  1342
	call 	SSL_shutdown
hh
parents:
diff changeset
  1343
	cmp	$0, a
hh
parents:
diff changeset
  1344
	jns	0f				# no err
hh
parents:
diff changeset
  1345
	SSLERR	"SSL shutdown (1)"
hh
parents:
diff changeset
  1346
0:	jnz	2f				# SSL shutdown finished
hh
parents:
diff changeset
  1347
	LOG	5, "SSL shutdown rc=0, retry"
hh
parents:
diff changeset
  1348
	mov	currSockP(bp), c		# -->curr SocketInfo
hh
parents:
diff changeset
  1349
	pushl	So.sslP(c)			# -->SSL structure
hh
parents:
diff changeset
  1350
	call 	SSL_shutdown
hh
parents:
diff changeset
  1351
	cmp	$0, a
hh
parents:
diff changeset
  1352
	jg	2f				# SSL shutdown finished
hh
parents:
diff changeset
  1353
	push	a				# SSL err
hh
parents:
diff changeset
  1354
	mov	currSockP(bp), c		# -->curr SocketInfo
hh
parents:
diff changeset
  1355
	pushl	So.sslP(c)			# -->SSL structure
hh
parents:
diff changeset
  1356
	call	SSL_get_error
hh
parents:
diff changeset
  1357
	cmp	$5, a				# SSL_ERROR_SYSCALL ?
hh
parents:
diff changeset
  1358
	jne	1f				# no, other SSL err
hh
parents:
diff changeset
  1359
# syscall err
hh
parents:
diff changeset
  1360
	call	ERR_get_error
hh
parents:
diff changeset
  1361
	test	a, a				# SSL err ?
hh
parents:
diff changeset
  1362
	jnz	2f				# yes, don't care
hh
parents:
diff changeset
  1363
	call	__errno_location		# sys err ?
hh
parents:
diff changeset
  1364
	test	a, a
hh
parents:
diff changeset
  1365
	jz	2f				# no
hh
parents:
diff changeset
  1366
	SYSERR	"SSL shutdown (2)"
hh
parents:
diff changeset
  1367
# other SSL err, print SSL err queue
hh
parents:
diff changeset
  1368
1:	SSLERR	"SSL shutdown (2)"
hh
parents:
diff changeset
  1369
# close socket
hh
parents:
diff changeset
  1370
2:	mov	currSockP(bp), c		# -->curr SocketInfo
hh
parents:
diff changeset
  1371
	pushl	So.sc(c)			# socket to close
hh
parents:
diff changeset
  1372
#	call	close
hh
parents:
diff changeset
  1373
#	test	a, a
hh
parents:
diff changeset
  1374
#	jz	0f
hh
parents:
diff changeset
  1375
#	SYSERR	"close"
hh
parents:
diff changeset
  1376
#0:
hh
parents:
diff changeset
  1377
	SYS	close
hh
parents:
diff changeset
  1378
	push	tagP(bp)
hh
parents:
diff changeset
  1379
	LOG	4, "%s sc=%u closed", 2
hh
parents:
diff changeset
  1380
	mov	currSockP(bp), c		# -->curr SocketInfo
hh
parents:
diff changeset
  1381
	movl	$-1, So.sc(c)			# indicate closed socket
hh
parents:
diff changeset
  1382
	EPILOG
hh
parents:
diff changeset
  1383
#-----------------------------------------------
hh
parents:
diff changeset
  1384
#	C R E A T E   T H R E A D   T O   C L O S E   C L I E N T   S I D E S
hh
parents:
diff changeset
  1385
#-----------------------------------------------
hh
parents:
diff changeset
  1386
	ARGS
hh
parents:
diff changeset
  1387
	PROLOC
hh
parents:
diff changeset
  1388
	DL	thisP				# -->this Node
hh
parents:
diff changeset
  1389
	DL	deP				# -->Debug inst
hh
parents:
diff changeset
  1390
	DL	pt				# pthread_t (int)
hh
parents:
diff changeset
  1391
	EPILOC
hh
parents:
diff changeset
  1392
#-----------------------------------------------
hh
parents:
diff changeset
  1393
N.closeClients:
hh
parents:
diff changeset
  1394
	PROLOG
hh
parents:
diff changeset
  1395
	mov	b, thisP(bp)			# save -->this Node
hh
parents:
diff changeset
  1396
	lea	N.debug(b), a
hh
parents:
diff changeset
  1397
	mov	a, deP(bp)			# save local -->Debug
hh
parents:
diff changeset
  1398
	cmp	$1, N.closing(b)
hh
parents:
diff changeset
  1399
	je	0f				# already closing, nothing to do
hh
parents:
diff changeset
  1400
	LOG	5, "spawning thread to close client side"
hh
parents:
diff changeset
  1401
	push	b				# -->this (param for thread)
hh
parents:
diff changeset
  1402
	pushl	$N.closeCliThread		# -->thread func
hh
parents:
diff changeset
  1403
	pushl	$0
hh
parents:
diff changeset
  1404
	lea	N.ptid(b), a			# -->thread ID
hh
parents:
diff changeset
  1405
	push	a
hh
parents:
diff changeset
  1406
	call	pthread_create
hh
parents:
diff changeset
  1407
	test	a, a
hh
parents:
diff changeset
  1408
	jz	1f
hh
parents:
diff changeset
  1409
	SYSERR	"create thread"
hh
parents:
diff changeset
  1410
1:	mov	thisP(bp), b			# -->this Node
hh
parents:
diff changeset
  1411
	movl	$1, N.closing(b)		# indicate "closing"
hh
parents:
diff changeset
  1412
	push	N.ptid(b)
hh
parents:
diff changeset
  1413
	LOG	5, "closing thread (%u) spawned"
hh
parents:
diff changeset
  1414
0:	EPILOG
hh
parents:
diff changeset
  1415
#-----------------------------------------------
hh
parents:
diff changeset
  1416
#	C L O S E   C L I E N T   S I D E S
hh
parents:
diff changeset
  1417
#-----------------------------------------------
hh
parents:
diff changeset
  1418
	ARGS
hh
parents:
diff changeset
  1419
	DS	thisP
hh
parents:
diff changeset
  1420
	PROLOC
hh
parents:
diff changeset
  1421
	DL	deP				# -->Debug inst
hh
parents:
diff changeset
  1422
	DL	debug, DebugL
hh
parents:
diff changeset
  1423
	EPILOC
hh
parents:
diff changeset
  1424
#-----------------------------------------------
hh
parents:
diff changeset
  1425
N.closeCliThread:
hh
parents:
diff changeset
  1426
	PROLOG
hh
parents:
diff changeset
  1427
	mov	thisP(bp), b			# -->this Node
hh
parents:
diff changeset
  1428
	lea	debug(bp), a
hh
parents:
diff changeset
  1429
	mov	a, deP(bp)			# save deP
hh
parents:
diff changeset
  1430
	lea	N.debug(b), a
hh
parents:
diff changeset
  1431
	lea	D.id(a), a			# -->caller debug id
hh
parents:
diff changeset
  1432
	push	a
hh
parents:
diff changeset
  1433
	DEBID	"%s CLOSE clients", 1
hh
parents:
diff changeset
  1434
	LOG	5, "start..."
hh
parents:
diff changeset
  1435
	mov	$0, c				# offet in socket info array
hh
parents:
diff changeset
  1436
	mov	$0, d				# socket info rank
hh
parents:
diff changeset
  1437
	mov	N.cliSideP(b), a		# -->client socket info array
hh
parents:
diff changeset
  1438
0:						# iterate on opened sockets
hh
parents:
diff changeset
  1439
	cmp	$-1, So.sc(a, c)		# sc allocated ?
hh
parents:
diff changeset
  1440
	je	1f				# no, iterate
hh
parents:
diff changeset
  1441
	push	So.sc(a, c)			# socket#
hh
parents:
diff changeset
  1442
	LOG	4, "sc=%u"
hh
parents:
diff changeset
  1443
	push	deP(bp)
hh
parents:
diff changeset
  1444
	pushl	$0				# indicate "client"
hh
parents:
diff changeset
  1445
	push	d				# socket info rank
hh
parents:
diff changeset
  1446
	call	N.closeSocket			# close socket
hh
parents:
diff changeset
  1447
1:	inc	d
hh
parents:
diff changeset
  1448
	cmp	N.nodes(b), d			# rank < nodes ?
hh
parents:
diff changeset
  1449
	je	0f				# no, end
hh
parents:
diff changeset
  1450
	lea	SocketInfoL(c), c		# incr offset
hh
parents:
diff changeset
  1451
	jmp	0b				# iterate
hh
parents:
diff changeset
  1452
0:	LOG	4, "finished, exiting thread"
hh
parents:
diff changeset
  1453
	pushl	$0
hh
parents:
diff changeset
  1454
	call	pthread_exit
hh
parents:
diff changeset
  1455
	EPILOG
hh
parents:
diff changeset
  1456
#-----------------------------------------------
hh
parents:
diff changeset
  1457
#	S Y N C H R O N I Z E   A L L   N O D E S
hh
parents:
diff changeset
  1458
#-----------------------------------------------
hh
parents:
diff changeset
  1459
	ARGS
hh
parents:
diff changeset
  1460
	PROLOC
hh
parents:
diff changeset
  1461
	DL	thisP
hh
parents:
diff changeset
  1462
	DL	deP
hh
parents:
diff changeset
  1463
	DL	shP
hh
parents:
diff changeset
  1464
	DL	tosignal
hh
parents:
diff changeset
  1465
	DL	sigmask, 128
hh
parents:
diff changeset
  1466
	DL	sigact, SigActionL
hh
parents:
diff changeset
  1467
	EPILOC
hh
parents:
diff changeset
  1468
N.sync:
hh
parents:
diff changeset
  1469
	PROLOG
hh
parents:
diff changeset
  1470
	mov	b, thisP(bp)			# save -->this Node
hh
parents:
diff changeset
  1471
	lea	N.debug(b), a
hh
parents:
diff changeset
  1472
	mov	a, deP(bp)			# save -->Debug locally for LOG macro
hh
parents:
diff changeset
  1473
hh
parents:
diff changeset
  1474
	movl	$0, tosignal(bp)
hh
parents:
diff changeset
  1475
	mov	C.csP, c			# -->CS
hh
parents:
diff changeset
  1476
	mov	C.shP(c), a			# -->shared mem
hh
parents:
diff changeset
  1477
	push	S.act(a)
hh
parents:
diff changeset
  1478
	mov	a, shP(bp)
hh
parents:
diff changeset
  1479
	push	N.pid(b)
hh
parents:
diff changeset
  1480
	LOG	5, "%u synchronizing: active=%u"
hh
parents:
diff changeset
  1481
# set signal handler block
hh
parents:
diff changeset
  1482
	lea	sigact(bp), a
hh
parents:
diff changeset
  1483
	movl	$N.sighandle, sa_handler(a)
hh
parents:
diff changeset
  1484
	movl	$0, sa_flags(a)
hh
parents:
diff changeset
  1485
	lea	sa_mask(a), a			# set handler mask
hh
parents:
diff changeset
  1486
	push	a
hh
parents:
diff changeset
  1487
	SYS	sigfillset
hh
parents:
diff changeset
  1488
	jmp	0f
hh
parents:
diff changeset
  1489
N.sighandle:
hh
parents:
diff changeset
  1490
	ret
hh
parents:
diff changeset
  1491
0:
hh
parents:
diff changeset
  1492
# activate signal handler
hh
parents:
diff changeset
  1493
	lea	sigmask(bp), a
hh
parents:
diff changeset
  1494
	push	a
hh
parents:
diff changeset
  1495
	SYS	sigemptyset
hh
parents:
diff changeset
  1496
	push	$SIGUSR2
hh
parents:
diff changeset
  1497
	lea	sigmask(bp), a
hh
parents:
diff changeset
  1498
	push	a
hh
parents:
diff changeset
  1499
	SYS	sigaddset
hh
parents:
diff changeset
  1500
	push	$0
hh
parents:
diff changeset
  1501
	lea	sigmask(bp), a
hh
parents:
diff changeset
  1502
	push	a
hh
parents:
diff changeset
  1503
	push	$SIG_UNBLOCK
hh
parents:
diff changeset
  1504
	SYS	sigprocmask
hh
parents:
diff changeset
  1505
	push	$0
hh
parents:
diff changeset
  1506
	lea	sigact(bp), a
hh
parents:
diff changeset
  1507
	push	a
hh
parents:
diff changeset
  1508
	push	$SIGUSR2
hh
parents:
diff changeset
  1509
	SYS	sigaction
hh
parents:
diff changeset
  1510
# update nodes counter
hh
parents:
diff changeset
  1511
	mov	shP(bp), a
hh
parents:
diff changeset
  1512
	lea	S.counter_sem(a), a
hh
parents:
diff changeset
  1513
	push	a
hh
parents:
diff changeset
  1514
	SYS	sem_wait			# get semaphore
hh
parents:
diff changeset
  1515
	mov	shP(bp), a
hh
parents:
diff changeset
  1516
	decl	S.act(a)			# decrement nodes counter
hh
parents:
diff changeset
  1517
	setz	tosignal(bp)
hh
parents:
diff changeset
  1518
	mov	shP(bp), a
hh
parents:
diff changeset
  1519
	lea	S.counter_sem(a), a
hh
parents:
diff changeset
  1520
	push	a
hh
parents:
diff changeset
  1521
	SYS	sem_post			# post semaphore
hh
parents:
diff changeset
  1522
	testl	$1, tosignal(bp)		# all finished?
hh
parents:
diff changeset
  1523
	jz	N.sigwait
hh
parents:
diff changeset
  1524
# signal all tasks
hh
parents:
diff changeset
  1525
	push	N.pid(b)
hh
parents:
diff changeset
  1526
	LOG	5, "%u signaling USR2"
hh
parents:
diff changeset
  1527
	push	$SIGUSR2
hh
parents:
diff changeset
  1528
	push	$0
hh
parents:
diff changeset
  1529
	SYS	kill
hh
parents:
diff changeset
  1530
	jmp	N.woken
hh
parents:
diff changeset
  1531
# wait for signal
hh
parents:
diff changeset
  1532
N.sigwait:
hh
parents:
diff changeset
  1533
#	call	pause
hh
parents:
diff changeset
  1534
	push	$5
hh
parents:
diff changeset
  1535
	call	sleep
hh
parents:
diff changeset
  1536
N.woken:
hh
parents:
diff changeset
  1537
	mov	thisP(bp), b			# -->this Node
hh
parents:
diff changeset
  1538
	push	N.pid(b)
hh
parents:
diff changeset
  1539
	LOG	5, "%u woken up"
hh
parents:
diff changeset
  1540
	EPILOG
hh
parents:
diff changeset
  1541
#-----------------------------------------------
hh
parents:
diff changeset
  1542
#	F O R M A T   A N D   P R I N T   S S L   E R R O R
hh
parents:
diff changeset
  1543
#-----------------------------------------------
hh
parents:
diff changeset
  1544
# args
hh
parents:
diff changeset
  1545
	ac = 8
hh
parents:
diff changeset
  1546
	DS	deP				# -->Debug
hh
parents:
diff changeset
  1547
	DS	msgP				# -->accompanying msg str
hh
parents:
diff changeset
  1548
# returns:	nothing
hh
parents:
diff changeset
  1549
	PROLOC
hh
parents:
diff changeset
  1550
	DL	str, 256			# generated string buf
hh
parents:
diff changeset
  1551
	EPILOC
hh
parents:
diff changeset
  1552
#-----------------------------------------------
hh
parents:
diff changeset
  1553
	.global N.sslErr
hh
parents:
diff changeset
  1554
N.sslErr:
hh
parents:
diff changeset
  1555
	enter	$locL, $0
hh
parents:
diff changeset
  1556
0:
hh
parents:
diff changeset
  1557
	call	ERR_get_error
hh
parents:
diff changeset
  1558
	push	a
hh
parents:
diff changeset
  1559
	LOG	5, "ssl err, e=%lu", 1
hh
parents:
diff changeset
  1560
	test	a, a				# end of msg queue ?
hh
parents:
diff changeset
  1561
	jz	0f				# yes
hh
parents:
diff changeset
  1562
	lea	str(bp), d
hh
parents:
diff changeset
  1563
	push	d				# -->err msg str buf
hh
parents:
diff changeset
  1564
	push	a				# err
hh
parents:
diff changeset
  1565
	call	ERR_error_string
hh
parents:
diff changeset
  1566
	push	a				# -->err msg str
hh
parents:
diff changeset
  1567
	pushl	msgP(bp)			# -->accompanying msg str
hh
parents:
diff changeset
  1568
	LOG	0, "%s: %s", 2
hh
parents:
diff changeset
  1569
	jmp	0b				# iterate on SSL err msg queue
hh
parents:
diff changeset
  1570
0:
hh
parents:
diff changeset
  1571
	pushl	$1
hh
parents:
diff changeset
  1572
	call	exit				# ABEND
hh
parents:
diff changeset
  1573
#-----------------------------------------------
hh
parents:
diff changeset
  1574
#	G E T   A S S I G N E D   I P   A D D R
hh
parents:
diff changeset
  1575
#-----------------------------------------------
hh
parents:
diff changeset
  1576
# puts assigned IP address:port in string
hh
parents:
diff changeset
  1577
	ARGS
hh
parents:
diff changeset
  1578
	DS	sP				# -->output string
hh
parents:
diff changeset
  1579
	DS	saP				# -->sockaddr
hh
parents:
diff changeset
  1580
	DS	deP				# -->Debug
hh
parents:
diff changeset
  1581
# returns:	nothing
hh
parents:
diff changeset
  1582
	PROLOC
hh
parents:
diff changeset
  1583
	EPILOC
hh
parents:
diff changeset
  1584
#-----------------------------------------------
hh
parents:
diff changeset
  1585
gai:	PROLOG
hh
parents:
diff changeset
  1586
hh
parents:
diff changeset
  1587
	mov	saP(bp), b			# -->sockaddr
hh
parents:
diff changeset
  1588
	xor	a, a
hh
parents:
diff changeset
  1589
	mov	sa_data(b), %ax			# port # in big endian order
hh
parents:
diff changeset
  1590
	push	a
hh
parents:
diff changeset
  1591
	call	ntohs
hh
parents:
diff changeset
  1592
	mov	a, d
hh
parents:
diff changeset
  1593
hh
parents:
diff changeset
  1594
	mov	saP(bp), b			# -->sockaddr
hh
parents:
diff changeset
  1595
	pushl	sa_data+2(b)			# IP addr in big endian order
hh
parents:
diff changeset
  1596
	call	ntohl
hh
parents:
diff changeset
  1597
hh
parents:
diff changeset
  1598
	push	d				# port # as int
hh
parents:
diff changeset
  1599
hh
parents:
diff changeset
  1600
        mov     $4, c				# iterate on 4 bytes of IP addr
hh
parents:
diff changeset
  1601
0:      mov     a, d
hh
parents:
diff changeset
  1602
        and     $0xff, d
hh
parents:
diff changeset
  1603
        push    d				# part of IP addr
hh
parents:
diff changeset
  1604
        shr     $8, a
hh
parents:
diff changeset
  1605
        dec     c
hh
parents:
diff changeset
  1606
        jnz     0b				# iterate
hh
parents:
diff changeset
  1607
hh
parents:
diff changeset
  1608
	push	$0f
hh
parents:
diff changeset
  1609
	pushl	sP(bp)				# -->output buf
hh
parents:
diff changeset
  1610
	call	sprintf
hh
parents:
diff changeset
  1611
	jmp	1f
hh
parents:
diff changeset
  1612
0:	.ascii	"%u.%u.%u.%u:%d\0"
hh
parents:
diff changeset
  1613
1:
hh
parents:
diff changeset
  1614
	EPILOG
hh
parents:
diff changeset
  1615
#-----------------------------------------------
hh
parents:
diff changeset
  1616
	.end