@@ -1197,12 +1197,7 @@ static u8 *send_commit_part(const tal_t *ctx,
1197
1197
(int )splice_amnt , (int )remote_splice_amnt ,
1198
1198
remote_index );
1199
1199
1200
- if (batch_size > 1 ) {
1201
- cs_tlv -> splice_info = tal (cs_tlv , struct tlv_commitment_signed_tlvs_splice_info );
1202
-
1203
- cs_tlv -> splice_info -> batch_size = batch_size ;
1204
- cs_tlv -> splice_info -> funding_txid = funding -> txid ;
1205
- }
1200
+ cs_tlv -> splice_info = tal_dup (cs_tlv , struct bitcoin_txid , & funding -> txid );
1206
1201
}
1207
1202
1208
1203
txs = channel_txs (tmpctx , funding , funding_sats , & htlc_map ,
@@ -1274,6 +1269,72 @@ static s64 sats_diff(struct amount_sat a, struct amount_sat b)
1274
1269
return (s64 )a .satoshis - (s64 )b .satoshis ; /* Raw: splicing numbers can wrap! */
1275
1270
}
1276
1271
1272
+ static void send_message_batch (struct peer * peer , u8 * * msgs )
1273
+ {
1274
+ size_t size ;
1275
+ size_t hdr_size = tal_bytelen (towire_protocol_batch_element (tmpctx ,
1276
+ & peer -> channel_id ,
1277
+ 0 ));
1278
+ u8 * batch_msg , * final_msg , * final_msg_ptr ;
1279
+ struct tlv_start_batch_tlvs * tlvs ;
1280
+
1281
+ assert (tal_count (msgs ) > 0 );
1282
+
1283
+ if (tal_count (msgs ) == 1 ) {
1284
+ peer_write (peer -> pps , msgs [0 ]);
1285
+ return ;
1286
+ }
1287
+
1288
+ /* We prefix each message with an interal wire type,
1289
+ * protocol_batch_element. connectd will eat each message so they don't
1290
+ * actually go out to the peer. It's just so connectd can chop up the
1291
+ * message batch back out into individual messages. */
1292
+
1293
+ size = 0 ;
1294
+ for (u32 i = 0 ; i < tal_count (msgs ); i ++ )
1295
+ size += tal_bytelen (msgs [i ]) + hdr_size ;
1296
+
1297
+ tlvs = tlv_start_batch_tlvs_new (tmpctx );
1298
+ tlvs -> batch_info = tal (tlvs , u16 );
1299
+ * tlvs -> batch_info = WIRE_COMMITMENT_SIGNED ;
1300
+ batch_msg = towire_start_batch (tmpctx , & peer -> channel_id ,
1301
+ tal_count (msgs ), tlvs );
1302
+ size += tal_bytelen (batch_msg ) + hdr_size ;
1303
+
1304
+ /* Now we know the size of our `final_msg` so we allocate. */
1305
+ final_msg = tal_arr (tmpctx , u8 , size );
1306
+ final_msg_ptr = final_msg ;
1307
+
1308
+ status_debug ("proto_batch Building batch with %zu bytes, msgs: %zu" ,
1309
+ size , tal_count (msgs ));
1310
+
1311
+ memcpy (final_msg_ptr ,
1312
+ towire_protocol_batch_element (tmpctx ,
1313
+ & peer -> channel_id ,
1314
+ tal_bytelen (batch_msg )),
1315
+ hdr_size );
1316
+ final_msg_ptr += hdr_size ;
1317
+
1318
+ memcpy (final_msg_ptr , batch_msg , tal_bytelen (batch_msg ));
1319
+ final_msg_ptr += tal_bytelen (batch_msg );
1320
+
1321
+ /* Now copy the bytes from all messages in `msgs` */
1322
+ for (u32 i = 0 ; i < tal_count (msgs ); i ++ ) {
1323
+ memcpy (final_msg_ptr ,
1324
+ towire_protocol_batch_element (tmpctx ,
1325
+ & peer -> channel_id ,
1326
+ tal_bytelen (msgs [i ])),
1327
+ hdr_size );
1328
+ final_msg_ptr += hdr_size ;
1329
+
1330
+ memcpy (final_msg_ptr , msgs [i ], tal_bytelen (msgs [i ]));
1331
+ final_msg_ptr += tal_bytelen (msgs [i ]);
1332
+ }
1333
+
1334
+ assert (final_msg + size == final_msg_ptr );
1335
+ peer_write (peer -> pps , take (final_msg ));
1336
+ }
1337
+
1277
1338
static void send_commit (struct peer * peer )
1278
1339
{
1279
1340
const struct htlc * * changed_htlcs ;
@@ -1440,8 +1501,7 @@ static void send_commit(struct peer *peer)
1440
1501
1441
1502
peer -> next_index [REMOTE ]++ ;
1442
1503
1443
- for (u32 i = 0 ; i < tal_count (msgs ); i ++ )
1444
- peer_write (peer -> pps , take (msgs [i ]));
1504
+ send_message_batch (peer , msgs );
1445
1505
1446
1506
maybe_send_shutdown (peer );
1447
1507
@@ -1963,11 +2023,11 @@ static struct commitsig_info *handle_peer_commit_sig(struct peer *peer,
1963
2023
if (peer -> splice_state -> await_commitment_succcess
1964
2024
&& !tal_count (peer -> splice_state -> inflights ) && cs_tlv && cs_tlv -> splice_info ) {
1965
2025
if (!bitcoin_txid_eq (& peer -> channel -> funding .txid ,
1966
- & cs_tlv -> splice_info -> funding_txid )) {
2026
+ cs_tlv -> splice_info )) {
1967
2027
status_info ("Ignoring stale commit_sig for channel_id"
1968
2028
" %s, as %s is locked in now." ,
1969
2029
fmt_bitcoin_txid (tmpctx ,
1970
- & cs_tlv -> splice_info -> funding_txid ),
2030
+ cs_tlv -> splice_info ),
1971
2031
fmt_bitcoin_txid (tmpctx ,
1972
2032
& peer -> channel -> funding .txid ));
1973
2033
return NULL ;
@@ -2017,22 +2077,17 @@ static struct commitsig_info *handle_peer_commit_sig(struct peer *peer,
2017
2077
outpoint = peer -> splice_state -> inflights [commit_index - 1 ]-> outpoint ;
2018
2078
funding_sats = peer -> splice_state -> inflights [commit_index - 1 ]-> amnt ;
2019
2079
2020
- if (cs_tlv && cs_tlv -> splice_info
2021
- && cs_tlv -> splice_info -> batch_size == 1 )
2022
- peer_failed_err (peer -> pps , & peer -> channel_id ,
2023
- "batch_size can never be 1" );
2024
-
2025
2080
status_debug ("handle_peer_commit_sig for inflight outpoint %s" ,
2026
2081
fmt_bitcoin_txid (tmpctx , & outpoint .txid ));
2027
2082
2028
2083
if (cs_tlv -> splice_info
2029
2084
&& !bitcoin_txid_eq (& outpoint .txid ,
2030
- & cs_tlv -> splice_info -> funding_txid ))
2085
+ cs_tlv -> splice_info ))
2031
2086
peer_failed_err (peer -> pps , & peer -> channel_id ,
2032
2087
"Expected commit sig message for %s but"
2033
2088
" got %s" ,
2034
2089
fmt_bitcoin_txid (tmpctx , & outpoint .txid ),
2035
- fmt_bitcoin_txid (tmpctx , & cs_tlv -> splice_info -> funding_txid ));
2090
+ fmt_bitcoin_txid (tmpctx , cs_tlv -> splice_info ));
2036
2091
}
2037
2092
else {
2038
2093
outpoint = peer -> channel -> funding ;
@@ -2089,7 +2144,7 @@ static struct commitsig_info *handle_peer_commit_sig(struct peer *peer,
2089
2144
fmt_amount_sat (tmpctx , funding_sats ),
2090
2145
cs_tlv && cs_tlv -> splice_info
2091
2146
? fmt_bitcoin_txid (tmpctx ,
2092
- & cs_tlv -> splice_info -> funding_txid )
2147
+ cs_tlv -> splice_info )
2093
2148
: "N/A" ,
2094
2149
peer -> splice_state -> await_commitment_succcess ? "yes"
2095
2150
: "no" ,
@@ -2253,7 +2308,7 @@ static int commit_index_from_msg(const u8 *msg, struct peer *peer)
2253
2308
if (!cs_tlv || !cs_tlv -> splice_info )
2254
2309
return -1 ;
2255
2310
2256
- funding_txid = cs_tlv -> splice_info -> funding_txid ;
2311
+ funding_txid = * cs_tlv -> splice_info ;
2257
2312
2258
2313
if (bitcoin_txid_eq (& funding_txid , & peer -> channel -> funding .txid ))
2259
2314
return 0 ;
@@ -2306,28 +2361,29 @@ static struct commitsig_info *handle_peer_commit_sig_batch(struct peer *peer,
2306
2361
s64 remote_splice_amnt ,
2307
2362
u64 local_index ,
2308
2363
const struct pubkey * local_per_commit ,
2309
- bool allow_empty_commit )
2364
+ bool allow_empty_commit ,
2365
+ u16 batch_size )
2310
2366
{
2311
2367
struct channel_id channel_id ;
2312
2368
struct bitcoin_signature commit_sig ;
2313
2369
secp256k1_ecdsa_signature * raw_sigs ;
2314
- u16 batch_size ;
2315
2370
const u8 * * msg_batch ;
2316
2371
enum peer_wire type ;
2317
2372
struct tlv_commitment_signed_tlvs * cs_tlv
2318
2373
= tlv_commitment_signed_tlvs_new (tmpctx );
2319
2374
status_debug ("fromwire_commitment_signed(%p) primary" , msg );
2375
+ check_tx_abort (peer , msg , NULL );
2376
+ type = fromwire_peektype (msg );
2377
+ if (type != WIRE_COMMITMENT_SIGNED )
2378
+ peer_failed_err (peer -> pps , & peer -> channel_id ,
2379
+ "Expected WIRE_COMMITMENT_SIGNED but got %s." ,
2380
+ peer_wire_name (type ));
2320
2381
if (!fromwire_commitment_signed (tmpctx , msg ,
2321
2382
& channel_id , & commit_sig .s , & raw_sigs ,
2322
2383
& cs_tlv ))
2323
2384
peer_failed_warn (peer -> pps , & peer -> channel_id ,
2324
2385
"Bad commit_sig %s" , tal_hex (msg , msg ));
2325
2386
2326
- /* Default batch_size is 1 */
2327
- batch_size = 1 ;
2328
- if (cs_tlv -> splice_info && cs_tlv -> splice_info -> batch_size )
2329
- batch_size = cs_tlv -> splice_info -> batch_size ;
2330
-
2331
2387
msg_batch = tal_arr (tmpctx , const u8 * , batch_size );
2332
2388
msg_batch [0 ] = msg ;
2333
2389
status_debug ("msg_batch[0]: %p" , msg_batch [0 ]);
@@ -2363,14 +2419,6 @@ static struct commitsig_info *handle_peer_commit_sig_batch(struct peer *peer,
2363
2419
" splice_info" ,
2364
2420
tal_hex (sub_msg , sub_msg ), i , batch_size );
2365
2421
2366
- if (!sub_cs_tlv -> splice_info
2367
- || sub_cs_tlv -> splice_info -> batch_size != batch_size )
2368
- peer_failed_err (peer -> pps , & peer -> channel_id ,
2369
- "batch_size value mismatch in"
2370
- " commit_sig bundle, item [%" PRIu16
2371
- "/%" PRIu16 "] %s" , i , batch_size ,
2372
- tal_hex (sub_msg , sub_msg ));
2373
-
2374
2422
msg_batch [i ] = sub_msg ;
2375
2423
status_debug ("msg_batch[%d]: %p" , (int )i , msg_batch [i ]);
2376
2424
}
@@ -2385,6 +2433,35 @@ static struct commitsig_info *handle_peer_commit_sig_batch(struct peer *peer,
2385
2433
allow_empty_commit , msg_batch );
2386
2434
}
2387
2435
2436
+ static void handle_peer_start_batch (struct peer * peer , const u8 * msg )
2437
+ {
2438
+ u16 batch_size ;
2439
+ struct channel_id channel_id ;
2440
+ struct tlv_start_batch_tlvs * tlvs ;
2441
+ if (!fromwire_start_batch (tmpctx , msg , & channel_id , & batch_size , & tlvs ))
2442
+ peer_failed_warn (peer -> pps , & peer -> channel_id ,
2443
+ "Bad start_batch %s" , tal_hex (msg , msg ));
2444
+
2445
+ if (!tlvs || !tlvs -> batch_info
2446
+ || * tlvs -> batch_info != WIRE_COMMITMENT_SIGNED ) {
2447
+ status_unusual ("Ignoring Unrecognized start_batch message type"
2448
+ " %s, expected WIRE_COMMITMENT_SIGNED." ,
2449
+ tlvs && tlvs -> batch_info
2450
+ ? peer_wire_name (* tlvs -> batch_info )
2451
+ : "N/A" );
2452
+ return ;
2453
+ }
2454
+
2455
+ handle_peer_commit_sig_batch (peer , peer_read (tmpctx , peer -> pps ), 0 ,
2456
+ peer -> channel -> funding_pubkey [REMOTE ],
2457
+ NULL , 0 , 0 ,
2458
+ peer -> next_index [LOCAL ],
2459
+ & peer -> next_local_per_commit ,
2460
+ false,
2461
+ batch_size );
2462
+ }
2463
+
2464
+
2388
2465
/* Pops the penalty base for the given commitnum from our internal list. There
2389
2466
* may not be one, in which case we return NULL and leave the list
2390
2467
* unmodified. */
@@ -4850,13 +4927,17 @@ static void peer_in(struct peer *peer, const u8 *msg)
4850
4927
case WIRE_UPDATE_ADD_HTLC :
4851
4928
handle_peer_add_htlc (peer , msg );
4852
4929
return ;
4930
+ case WIRE_START_BATCH :
4931
+ handle_peer_start_batch (peer , msg );
4932
+ return ;
4853
4933
case WIRE_COMMITMENT_SIGNED :
4854
4934
handle_peer_commit_sig_batch (peer , msg , 0 ,
4855
4935
peer -> channel -> funding_pubkey [REMOTE ],
4856
4936
NULL , 0 , 0 ,
4857
4937
peer -> next_index [LOCAL ],
4858
4938
& peer -> next_local_per_commit ,
4859
- false);
4939
+ false,
4940
+ 1 );
4860
4941
return ;
4861
4942
case WIRE_UPDATE_FEE :
4862
4943
handle_peer_feechange (peer , msg );
@@ -4920,6 +5001,7 @@ static void peer_in(struct peer *peer, const u8 *msg)
4920
5001
return ;
4921
5002
4922
5003
/* These are all swallowed by connectd */
5004
+ case WIRE_PROTOCOL_BATCH_ELEMENT :
4923
5005
case WIRE_CHANNEL_ANNOUNCEMENT :
4924
5006
case WIRE_CHANNEL_UPDATE :
4925
5007
case WIRE_NODE_ANNOUNCEMENT :
@@ -5122,8 +5204,7 @@ static void resend_commitment(struct peer *peer, struct changed_htlc *last)
5122
5204
peer -> splice_state -> inflights [i ]-> remote_funding ));
5123
5205
}
5124
5206
5125
- for (i = 0 ; i < tal_count (msgs ); i ++ )
5126
- peer_write (peer -> pps , take (msgs [i ]));
5207
+ send_message_batch (peer , msgs );
5127
5208
5128
5209
/* If we have already received the revocation for the previous, the
5129
5210
* other side shouldn't be asking for a retransmit! */
0 commit comments