@@ -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,52 @@ 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
+ u8 * batch_msg , * final_msg , * final_msg_ptr ;
1276
+ struct tlv_start_batch_tlvs * tlvs ;
1277
+
1278
+ size = 0 ;
1279
+ for (u32 i = 0 ; i < tal_count (msgs ); i ++ )
1280
+ size += tal_bytelen (msgs [i ]);
1281
+
1282
+ /* Compiler mistakenly thinks batch_msg may be used uninitialized */
1283
+ batch_msg = NULL ;
1284
+
1285
+ /* Only append `start_batch` if batch is more than 1 */
1286
+ if (tal_count (msgs ) > 1 ) {
1287
+ tlvs = tlv_start_batch_tlvs_new (NULL );
1288
+ tlvs -> batch_info = tal (tlvs , u16 );
1289
+ * tlvs -> batch_info = WIRE_COMMITMENT_SIGNED ;
1290
+ batch_msg = towire_start_batch (NULL , & peer -> channel_id ,
1291
+ tal_count (msgs ), tlvs );
1292
+ tal_steal (batch_msg , tlvs );
1293
+ size += tal_bytelen (batch_msg );
1294
+ }
1295
+
1296
+ /* Now we know the size of our `final_msg` so we allocate. */
1297
+ final_msg = tal_arr (NULL , u8 , size );
1298
+ final_msg_ptr = final_msg ;
1299
+
1300
+ /* Append the `start_batch` here, again if batch is more than 1 */
1301
+ if (tal_count (msgs ) > 1 ) {
1302
+ memcpy (final_msg_ptr , batch_msg , tal_bytelen (batch_msg ));
1303
+ final_msg_ptr += tal_bytelen (batch_msg );
1304
+ tal_free (batch_msg );
1305
+ }
1306
+
1307
+ /* Now copy the bytes from all messages in `msgs` */
1308
+ for (u32 i = 0 ; i < tal_count (msgs ); i ++ ) {
1309
+ memcpy (final_msg_ptr , msgs [i ], tal_bytelen (msgs [i ]));
1310
+ final_msg_ptr += tal_bytelen (msgs [i ]);
1311
+ }
1312
+
1313
+ assert (final_msg + size == final_msg_ptr );
1314
+ peer_write (peer -> pps , final_msg );
1315
+ tal_free (final_msg );
1316
+ }
1317
+
1277
1318
static void send_commit (struct peer * peer )
1278
1319
{
1279
1320
const struct htlc * * changed_htlcs ;
@@ -1440,8 +1481,7 @@ static void send_commit(struct peer *peer)
1440
1481
1441
1482
peer -> next_index [REMOTE ]++ ;
1442
1483
1443
- for (u32 i = 0 ; i < tal_count (msgs ); i ++ )
1444
- peer_write (peer -> pps , take (msgs [i ]));
1484
+ send_message_batch (peer , msgs );
1445
1485
1446
1486
maybe_send_shutdown (peer );
1447
1487
@@ -1963,11 +2003,11 @@ static struct commitsig_info *handle_peer_commit_sig(struct peer *peer,
1963
2003
if (peer -> splice_state -> await_commitment_succcess
1964
2004
&& !tal_count (peer -> splice_state -> inflights ) && cs_tlv && cs_tlv -> splice_info ) {
1965
2005
if (!bitcoin_txid_eq (& peer -> channel -> funding .txid ,
1966
- & cs_tlv -> splice_info -> funding_txid )) {
2006
+ cs_tlv -> splice_info )) {
1967
2007
status_info ("Ignoring stale commit_sig for channel_id"
1968
2008
" %s, as %s is locked in now." ,
1969
2009
fmt_bitcoin_txid (tmpctx ,
1970
- & cs_tlv -> splice_info -> funding_txid ),
2010
+ cs_tlv -> splice_info ),
1971
2011
fmt_bitcoin_txid (tmpctx ,
1972
2012
& peer -> channel -> funding .txid ));
1973
2013
return NULL ;
@@ -2017,22 +2057,17 @@ static struct commitsig_info *handle_peer_commit_sig(struct peer *peer,
2017
2057
outpoint = peer -> splice_state -> inflights [commit_index - 1 ]-> outpoint ;
2018
2058
funding_sats = peer -> splice_state -> inflights [commit_index - 1 ]-> amnt ;
2019
2059
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
2060
status_debug ("handle_peer_commit_sig for inflight outpoint %s" ,
2026
2061
fmt_bitcoin_txid (tmpctx , & outpoint .txid ));
2027
2062
2028
2063
if (cs_tlv -> splice_info
2029
2064
&& !bitcoin_txid_eq (& outpoint .txid ,
2030
- & cs_tlv -> splice_info -> funding_txid ))
2065
+ cs_tlv -> splice_info ))
2031
2066
peer_failed_err (peer -> pps , & peer -> channel_id ,
2032
2067
"Expected commit sig message for %s but"
2033
2068
" got %s" ,
2034
2069
fmt_bitcoin_txid (tmpctx , & outpoint .txid ),
2035
- fmt_bitcoin_txid (tmpctx , & cs_tlv -> splice_info -> funding_txid ));
2070
+ fmt_bitcoin_txid (tmpctx , cs_tlv -> splice_info ));
2036
2071
}
2037
2072
else {
2038
2073
outpoint = peer -> channel -> funding ;
@@ -2089,7 +2124,7 @@ static struct commitsig_info *handle_peer_commit_sig(struct peer *peer,
2089
2124
fmt_amount_sat (tmpctx , funding_sats ),
2090
2125
cs_tlv && cs_tlv -> splice_info
2091
2126
? fmt_bitcoin_txid (tmpctx ,
2092
- & cs_tlv -> splice_info -> funding_txid )
2127
+ cs_tlv -> splice_info )
2093
2128
: "N/A" ,
2094
2129
peer -> splice_state -> await_commitment_succcess ? "yes"
2095
2130
: "no" ,
@@ -2253,7 +2288,7 @@ static int commit_index_from_msg(const u8 *msg, struct peer *peer)
2253
2288
if (!cs_tlv || !cs_tlv -> splice_info )
2254
2289
return -1 ;
2255
2290
2256
- funding_txid = cs_tlv -> splice_info -> funding_txid ;
2291
+ funding_txid = * cs_tlv -> splice_info ;
2257
2292
2258
2293
if (bitcoin_txid_eq (& funding_txid , & peer -> channel -> funding .txid ))
2259
2294
return 0 ;
@@ -2306,28 +2341,30 @@ static struct commitsig_info *handle_peer_commit_sig_batch(struct peer *peer,
2306
2341
s64 remote_splice_amnt ,
2307
2342
u64 local_index ,
2308
2343
const struct pubkey * local_per_commit ,
2309
- bool allow_empty_commit )
2344
+ bool allow_empty_commit ,
2345
+ u16 batch_size )
2310
2346
{
2311
2347
struct channel_id channel_id ;
2312
2348
struct bitcoin_signature commit_sig ;
2313
2349
secp256k1_ecdsa_signature * raw_sigs ;
2314
- u16 batch_size ;
2315
2350
const u8 * * msg_batch ;
2316
2351
enum peer_wire type ;
2317
2352
struct tlv_commitment_signed_tlvs * cs_tlv
2318
2353
= tlv_commitment_signed_tlvs_new (tmpctx );
2319
2354
status_debug ("fromwire_commitment_signed(%p) primary" , msg );
2355
+ check_tx_abort (peer , msg , NULL );
2356
+ type = fromwire_peektype (msg );
2357
+ if (type != WIRE_COMMITMENT_SIGNED )
2358
+ peer_failed_err (peer -> pps , & peer -> channel_id ,
2359
+ "Expected splice related "
2360
+ "WIRE_COMMITMENT_SIGNED but got %s." ,
2361
+ peer_wire_name (type ));
2320
2362
if (!fromwire_commitment_signed (tmpctx , msg ,
2321
2363
& channel_id , & commit_sig .s , & raw_sigs ,
2322
2364
& cs_tlv ))
2323
2365
peer_failed_warn (peer -> pps , & peer -> channel_id ,
2324
2366
"Bad commit_sig %s" , tal_hex (msg , msg ));
2325
2367
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
2368
msg_batch = tal_arr (tmpctx , const u8 * , batch_size );
2332
2369
msg_batch [0 ] = msg ;
2333
2370
status_debug ("msg_batch[0]: %p" , msg_batch [0 ]);
@@ -2363,14 +2400,6 @@ static struct commitsig_info *handle_peer_commit_sig_batch(struct peer *peer,
2363
2400
" splice_info" ,
2364
2401
tal_hex (sub_msg , sub_msg ), i , batch_size );
2365
2402
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
2403
msg_batch [i ] = sub_msg ;
2375
2404
status_debug ("msg_batch[%d]: %p" , (int )i , msg_batch [i ]);
2376
2405
}
@@ -2385,6 +2414,24 @@ static struct commitsig_info *handle_peer_commit_sig_batch(struct peer *peer,
2385
2414
allow_empty_commit , msg_batch );
2386
2415
}
2387
2416
2417
+ static void handle_peer_start_batch (struct peer * peer , const u8 * msg )
2418
+ {
2419
+ u16 batch_size ;
2420
+ struct channel_id channel_id ;
2421
+ if (!fromwire_start_batch (tmpctx , msg , & channel_id , & batch_size , NULL ))
2422
+ peer_failed_warn (peer -> pps , & peer -> channel_id ,
2423
+ "Bad start_batch %s" , tal_hex (msg , msg ));
2424
+
2425
+ handle_peer_commit_sig_batch (peer , peer_read (tmpctx , peer -> pps ), 0 ,
2426
+ peer -> channel -> funding_pubkey [REMOTE ],
2427
+ NULL , 0 , 0 ,
2428
+ peer -> next_index [LOCAL ],
2429
+ & peer -> next_local_per_commit ,
2430
+ false,
2431
+ batch_size );
2432
+ }
2433
+
2434
+
2388
2435
/* Pops the penalty base for the given commitnum from our internal list. There
2389
2436
* may not be one, in which case we return NULL and leave the list
2390
2437
* unmodified. */
@@ -4850,13 +4897,17 @@ static void peer_in(struct peer *peer, const u8 *msg)
4850
4897
case WIRE_UPDATE_ADD_HTLC :
4851
4898
handle_peer_add_htlc (peer , msg );
4852
4899
return ;
4900
+ case WIRE_START_BATCH :
4901
+ handle_peer_start_batch (peer , msg );
4902
+ return ;
4853
4903
case WIRE_COMMITMENT_SIGNED :
4854
4904
handle_peer_commit_sig_batch (peer , msg , 0 ,
4855
4905
peer -> channel -> funding_pubkey [REMOTE ],
4856
4906
NULL , 0 , 0 ,
4857
4907
peer -> next_index [LOCAL ],
4858
4908
& peer -> next_local_per_commit ,
4859
- false);
4909
+ false,
4910
+ 1 );
4860
4911
return ;
4861
4912
case WIRE_UPDATE_FEE :
4862
4913
handle_peer_feechange (peer , msg );
0 commit comments