]> Cypherpunks.ru repositories - nncp.git/commitdiff
Generate list of created ACKs
authorSergey Matveev <stargrave@stargrave.org>
Fri, 4 Mar 2022 13:34:28 +0000 (16:34 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Fri, 4 Mar 2022 13:49:33 +0000 (16:49 +0300)
doc/cmd/nncp-ack.texi
doc/news.ru.texi
doc/news.texi
src/cmd/nncp-ack/main.go
src/cmd/nncp-trns/main.go
src/toss.go
src/tx.go
src/tx_test.go

index 5635cc15c27158f9e15677165b2ff1626650dcbb..a3b374da2c6f65bcc297c24161d5279dadef579e 100644 (file)
@@ -7,6 +7,8 @@
 $ nncp-ack [options] -all
 $ nncp-ack [options] -node NODE[,@dots{}]
 $ nncp-ack [options] -node NODE -pkt PKT
+
+$ nncp-ack [@dots{}] 4>&1 >&2 | nncp-rm [@dots{}] -pkt
 @end example
 
 Send acknowledgement of successful @option{PKT} (Base32-encoded hash)
@@ -14,6 +16,11 @@ packet receipt from @option{NODE} node. If no @option{-pkt} is
 specified, then acknowledge all packet in node's @code{rx} outbound
 spool. If @option{-all} is specified, then do that for all nodes.
 
+That commands outputs list of created encrypted ACK packets
+(@code{NODE/PKT}) to @strong{4}th file descriptor. That output can be
+passed for example to @command{@ref{nncp-rm}} to remove them after
+transmission to not wait for acknowledgement and retransmission.
+
 General workflow with acknowledgement is following, assuming that
 Alice has some outbound packets for Bob:
 
@@ -33,16 +40,24 @@ bob$ nncp-xfer -rx /mnt/shared
 
 That will also check if copied packets checksum is not mismatched.
 
-@item Create ACK packets of received ones:
+@item Create ACK packets of received ones, saving the list of encrypted
+    ACK packets:
 
 @example
-bob$ nncp-ack -node alice
+bob$ nncp-ack -node alice 4>acks
 @end example
 
 @item Send those newly created packets back to Alice:
 
 @example
-bob$ nncp-xfer -tx /mnt/shared
+bob$ nncp-xfer [-keep] -tx /mnt/shared
+@end example
+
+@item Remove them from outbound spool, because we expect no
+    acknowledgement for them:
+
+@example
+bob$ nncp-rm -node alice -pkt <acks
 @end example
 
 @item Get those acknowledgement packets and @ref{nncp-toss, toss} them:
index 2570db19631487085387befa5e822093862ad5dc..28ce8a0f72ac9568de0f03940b8f7025ea683404 100644 (file)
 @command{nncp-rm} теперь берёт список пакетов из @code{stdin}, при
 использовании @option{-pkt} опции.
 
+@item
+@command{nncp-ack} теперь генерирует список ACK пакетов, которые были
+созданы, что может использоваться в качестве ввода для @command{nncp-rm}
+команды, чтобы удалить исходящие ACK пакеты.
+
 @end itemize
 
 @node Релиз 8.6.0
index 393f160e1b90daabffa3dc2f751f1712e3a213f1..e18445adaa0e7deca5a1e2119b5a83d5b79954d3 100644 (file)
@@ -19,6 +19,11 @@ endless loop of ACKs.
 @command{nncp-rm} now takes list of packet from @code{stdin} when
 @option{-pkt} option is used.
 
+@item
+@command{nncp-ack} now generates list of ACK packets it created, that
+could be used as an input to @command{nncp-rm} to remove outbound ACK
+packets.
+
 @end itemize
 
 @node Release 8_6_0
index 370026f377fe95ff3fcad179e2525be9af483b74..d7e8f0185697ba364298f1d5aba10535c46ac6cc 100644 (file)
@@ -119,15 +119,22 @@ func main() {
                os.Exit(1)
        }
 
+       acksCreated := os.NewFile(uintptr(4), "ACKsCreated")
+       if acksCreated == nil {
+               log.Fatalln("can not open FD:4")
+       }
+
        if *pktRaw != "" {
                if len(nodes) != 1 {
                        usage()
                        os.Exit(1)
                }
                nncp.ViaOverride(*viaOverride, ctx, nodes[0])
-               if err = ctx.TxACK(nodes[0], nice, *pktRaw, minSize); err != nil {
+               pktName, err := ctx.TxACK(nodes[0], nice, *pktRaw, minSize)
+               if err != nil {
                        log.Fatalln(err)
                }
+               acksCreated.WriteString(nodes[0].Id.String() + "/" + pktName + "\n")
                return
        }
 
@@ -217,9 +224,11 @@ func main() {
                                })
                                continue
                        }
-                       if err = ctx.TxACK(node, nice, pktName, minSize); err != nil {
+                       newPktName, err := ctx.TxACK(node, nice, pktName, minSize)
+                       if err != nil {
                                log.Fatalln(err)
                        }
+                       acksCreated.WriteString(node.Id.String() + "/" + newPktName + "\n")
                }
        }
        if isBad {
index 27d9d6b9f6c58a610609ed0fd5b8396d90e89575..bd822d1a3c22309b9621933056988d27dcb92508 100644 (file)
@@ -137,7 +137,7 @@ func main() {
        if err != nil {
                panic(err)
        }
-       if _, _, err = ctx.Tx(
+       if _, _, _, err = ctx.Tx(
                node,
                pktTrns,
                nice,
index 4cc4392a6f2404478b5893ecf34193d6b0149e5d..79cc50f496982c96b976c532fc47f327dfcdaf6c 100644 (file)
@@ -621,7 +621,7 @@ func jobProcess(
                                if err != nil {
                                        panic(err)
                                }
-                               if _, _, err = ctx.Tx(
+                               if _, _, _, err = ctx.Tx(
                                        node,
                                        pktTrns,
                                        nice,
@@ -752,7 +752,7 @@ func jobProcess(
                                }
                                if nodeId != sender.Id && nodeId != pktEnc.Sender {
                                        ctx.LogI("rx-area-echo", lesEcho, logMsgNode)
-                                       if _, _, err = ctx.Tx(
+                                       if _, _, _, err = ctx.Tx(
                                                node,
                                                &pkt,
                                                nice,
index 6e13f2ef3fbeb9e4f97fe61b99d1897f6a8f6c09..e38084e1a7a3c01390987af3da42c8667d2ee4ab 100644 (file)
--- a/src/tx.go
+++ b/src/tx.go
@@ -57,12 +57,12 @@ func (ctx *Ctx) Tx(
        src io.Reader,
        pktName string,
        areaId *AreaId,
-) (*Node, int64, error) {
+) (*Node, int64, string, error) {
        var area *Area
        if areaId != nil {
                area = ctx.AreaId2Area[*areaId]
                if area.Prv == nil {
-                       return nil, 0, errors.New("area has no encryption keys")
+                       return nil, 0, "", errors.New("area has no encryption keys")
                }
        }
        hops := make([]*Node, 0, 1+len(node.Via))
@@ -82,15 +82,15 @@ func (ctx *Ctx) Tx(
                expectedSize += sizePadCalc(expectedSize, minSize, wrappers)
                expectedSize = PktEncOverhead + sizeWithTags(expectedSize)
                if maxSize != 0 && expectedSize > maxSize {
-                       return nil, 0, TooBig
+                       return nil, 0, "", TooBig
                }
                if !ctx.IsEnoughSpace(expectedSize) {
-                       return nil, 0, errors.New("is not enough space")
+                       return nil, 0, "", errors.New("is not enough space")
                }
        }
        tmp, err := ctx.NewTmpFileWHash()
        if err != nil {
-               return nil, 0, err
+               return nil, 0, "", err
        }
 
        results := make(chan PktEncWriteResult)
@@ -211,7 +211,7 @@ func (ctx *Ctx) Tx(
                r := <-results
                if r.err != nil {
                        tmp.Fd.Close()
-                       return nil, 0, r.err
+                       return nil, 0, "", r.err
                }
                if r.pktEncRaw != nil {
                        pktEncRaw = r.pktEncRaw
@@ -224,7 +224,7 @@ func (ctx *Ctx) Tx(
        err = tmp.Commit(filepath.Join(nodePath, string(TTx)))
        os.Symlink(nodePath, filepath.Join(ctx.Spool, lastNode.Name))
        if err != nil {
-               return lastNode, 0, err
+               return lastNode, 0, "", err
        }
        if ctx.HdrUsage {
                ctx.HdrWrite(pktEncRaw, filepath.Join(nodePath, string(TTx), tmp.Checksum()))
@@ -255,18 +255,18 @@ func (ctx *Ctx) Tx(
                }
                if err = ensureDir(seenDir); err != nil {
                        ctx.LogE("tx-mkdir", les, err, logMsg)
-                       return lastNode, 0, err
+                       return lastNode, 0, "", err
                }
                if fd, err := os.Create(seenPath); err == nil {
                        fd.Close()
                        if err = DirSync(seenDir); err != nil {
                                ctx.LogE("tx-dirsync", les, err, logMsg)
-                               return lastNode, 0, err
+                               return lastNode, 0, "", err
                        }
                }
                ctx.LogI("tx-area", les, logMsg)
        }
-       return lastNode, payloadSize, err
+       return lastNode, payloadSize, tmp.Checksum(), err
 }
 
 type DummyCloser struct{}
@@ -438,7 +438,7 @@ func (ctx *Ctx) TxFile(
                if err != nil {
                        return err
                }
-               _, finalSize, err := ctx.Tx(
+               _, finalSize, pktName, err := ctx.Tx(
                        node, pkt, nice,
                        srcSize, minSize, maxSize,
                        bufio.NewReader(reader), dstPath, areaId,
@@ -450,6 +450,7 @@ func (ctx *Ctx) TxFile(
                        {"Src", srcPath},
                        {"Dst", dstPath},
                        {"Size", finalSize},
+                       {"Pkt", pktName},
                }
                logMsg := func(les LEs) string {
                        return fmt.Sprintf(
@@ -480,7 +481,7 @@ func (ctx *Ctx) TxFile(
                        return err
                }
                hsh := MTHNew(0, 0)
-               _, size, err := ctx.Tx(
+               _, size, pktName, err := ctx.Tx(
                        node, pkt, nice,
                        0, minSize, maxSize,
                        io.TeeReader(lr, hsh),
@@ -494,6 +495,7 @@ func (ctx *Ctx) TxFile(
                        {"Src", srcPath},
                        {"Dst", path},
                        {"Size", size},
+                       {"Pkt", pktName},
                }
                logMsg := func(les LEs) string {
                        return fmt.Sprintf(
@@ -541,7 +543,7 @@ func (ctx *Ctx) TxFile(
                return err
        }
        metaPktSize := int64(buf.Len())
-       _, _, err = ctx.Tx(
+       _, _, pktName, err := ctx.Tx(
                node,
                pkt,
                nice,
@@ -555,6 +557,7 @@ func (ctx *Ctx) TxFile(
                {"Src", srcPath},
                {"Dst", path},
                {"Size", metaPktSize},
+               {"Pkt", pktName},
        }
        logMsg := func(les LEs) string {
                return fmt.Sprintf(
@@ -593,7 +596,9 @@ func (ctx *Ctx) TxFreq(
        }
        src := strings.NewReader(dstPath)
        size := int64(src.Len())
-       _, _, err = ctx.Tx(node, pkt, nice, size, minSize, MaxFileSize, src, srcPath, nil)
+       _, _, pktName, err := ctx.Tx(
+               node, pkt, nice, size, minSize, MaxFileSize, src, srcPath, nil,
+       )
        les := LEs{
                {"Type", "freq"},
                {"Node", node.Id},
@@ -601,6 +606,7 @@ func (ctx *Ctx) TxFreq(
                {"ReplyNice", int(replyNice)},
                {"Src", srcPath},
                {"Dst", dstPath},
+               {"Pkt", pktName},
        }
        logMsg := func(les LEs) string {
                return fmt.Sprintf(
@@ -657,7 +663,9 @@ func (ctx *Ctx) TxExec(
                }(in)
                in = pr
        }
-       _, size, err := ctx.Tx(node, pkt, nice, 0, minSize, maxSize, in, handle, areaId)
+       _, size, pktName, err := ctx.Tx(
+               node, pkt, nice, 0, minSize, maxSize, in, handle, areaId,
+       )
        if !noCompress {
                e := <-compressErr
                if err == nil {
@@ -672,6 +680,7 @@ func (ctx *Ctx) TxExec(
                {"ReplyNice", int(replyNice)},
                {"Dst", dst},
                {"Size", size},
+               {"Pkt", pktName},
        }
        logMsg := func(les LEs) string {
                return fmt.Sprintf(
@@ -735,25 +744,28 @@ func (ctx *Ctx) TxACK(
        nice uint8,
        hsh string,
        minSize int64,
-) error {
+) (pktName string, err error) {
        hshRaw, err := Base32Codec.DecodeString(hsh)
        if err != nil {
-               return err
+               return "", err
        }
        if len(hshRaw) != MTHSize {
-               return errors.New("Invalid packet id size")
+               return "", errors.New("Invalid packet id size")
        }
        pkt, err := NewPkt(PktTypeACK, nice, []byte(hshRaw))
        if err != nil {
-               return err
+               return "", err
        }
        src := bytes.NewReader([]byte{})
-       _, _, err = ctx.Tx(node, pkt, nice, 0, minSize, MaxFileSize, src, hsh, nil)
+       _, _, pktName, err = ctx.Tx(
+               node, pkt, nice, 0, minSize, MaxFileSize, src, hsh, nil,
+       )
        les := LEs{
                {"Type", "ack"},
                {"Node", node.Id},
                {"Nice", int(nice)},
                {"Pkt", hsh},
+               {"NewPkt", pktName},
        }
        logMsg := func(les LEs) string {
                return fmt.Sprintf("ACK to %s of %s is sent", ctx.NodeName(node.Id), hsh)
@@ -763,5 +775,5 @@ func (ctx *Ctx) TxACK(
        } else {
                ctx.LogE("tx", les, err, logMsg)
        }
-       return err
+       return
 }
index 507bc8b94e7b5ba848b39e19aeb1ebcb7fb5dd37..9f8d7506b652ee04d25dd739d8a573e0a64ca079 100644 (file)
@@ -87,7 +87,7 @@ func TestTx(t *testing.T) {
                }
                pkt, err := NewPkt(PktTypeExec, replyNice, []byte(pathSrc))
                src := bytes.NewReader(data)
-               dstNode, _, err := ctx.Tx(
+               dstNode, _, _, err := ctx.Tx(
                        nodeTgt,
                        pkt,
                        123,