Changeset 9f625a0


Ignore:
Timestamp:
Nov 27, 2015 3:59:42 PM (5 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
ed1567e
Parents:
e77c5bd
Message:

Fix protocol for V3 datagram and raw sessions
Add V3 datagram and raw sessions to send client
minor cleanups

Location:
apps/sam/java/src/net/i2p/sam
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • apps/sam/java/src/net/i2p/sam/SAMDatagramSession.java

    re77c5bd r9f625a0  
    1313import java.util.Properties;
    1414
     15import net.i2p.client.I2PSession;
    1516import net.i2p.client.I2PSessionException;
    1617import net.i2p.client.datagram.I2PDatagramDissector;
     
    7879     * @param dest Destination
    7980     * @param data Bytes to be sent
     81     * @param proto ignored, will always use PROTO_DATAGRAM (17)
    8082     *
    8183     * @return True if the data was sent, false otherwise
     
    9193                dgram = dgramMaker.makeI2PDatagram(data);
    9294        }
    93         return sendBytesThroughMessageSession(dest, dgram, proto, fromPort, toPort);
     95        return sendBytesThroughMessageSession(dest, dgram, I2PSession.PROTO_DATAGRAM, fromPort, toPort);
    9496    }
    9597
  • apps/sam/java/src/net/i2p/sam/SAMMessageSession.java

    re77c5bd r9f625a0  
    2323import net.i2p.data.DataFormatException;
    2424import net.i2p.data.Destination;
    25 import net.i2p.util.HexDump;
     25//import net.i2p.util.HexDump;
    2626import net.i2p.util.I2PAppThread;
    2727import net.i2p.util.Log;
     
    262262                if (msg == null)
    263263                    return;
    264                 if (_log.shouldLog(Log.DEBUG)) {
    265                     _log.debug("Content of message " + msgId + ":\n"
    266                                + HexDump.dump(msg));
    267                 }
     264                //if (_log.shouldLog(Log.DEBUG)) {
     265                //    _log.debug("Content of message " + msgId + ":\n"
     266                //               + HexDump.dump(msg));
     267                //}
    268268               
    269269                messageReceived(msg, proto, fromPort, toPort);
  • apps/sam/java/src/net/i2p/sam/SAMRawSession.java

    re77c5bd r9f625a0  
    1313import java.util.Properties;
    1414
     15import net.i2p.client.I2PSession;
    1516import net.i2p.client.I2PSessionException;
    1617import net.i2p.data.DataFormatException;
     
    6768     *
    6869     * @param data Bytes to be sent
     70     * @param proto if 0, will use PROTO_DATAGRAM_RAW (18)
    6971     *
    7072     * @return True if the data was sent, false otherwise
     
    7678        if (data.length > RAW_SIZE_MAX)
    7779            throw new DataFormatException("Data size limit exceeded (" + data.length + ")");
     80        if (proto == I2PSession.PROTO_UNSPECIFIED)
     81            proto = I2PSession.PROTO_DATAGRAM_RAW;
    7882        return sendBytesThroughMessageSession(dest, data, proto, fromPort, toPort);
    7983    }
  • apps/sam/java/src/net/i2p/sam/SAMv3DatagramServer.java

    re77c5bd r9f625a0  
    165165                                                        tp = t.substring("TO_PORT=".length());
    166166                                        }
     167
    167168                                        int proto = I2PSession.PROTO_UNSPECIFIED;
    168169                                        int fromPort = I2PSession.PORT_UNSPECIFIED;
     
    197198                                        SAMv3Handler.Session sess = rec.getHandler().getSession();
    198199                                        if (sess != null)
    199                                                 rec.getHandler().getSession().sendBytes(dest,data, proto, fromPort, toPort);
     200                                                sess.sendBytes(dest, data, proto, fromPort, toPort);
    200201                                        else
    201202                                                warn("Dropping datagram, no session for " + nick);
  • apps/sam/java/src/net/i2p/sam/client/SAMStreamSend.java

    re77c5bd r9f625a0  
    11package net.i2p.sam.client;
    22
     3import java.io.ByteArrayOutputStream;
    34import java.io.File;
    45import java.io.FileInputStream;
     
    67import java.io.InputStream;
    78import java.io.OutputStream;
     9import java.net.DatagramPacket;
     10import java.net.DatagramSocket;
     11import java.net.InetSocketAddress;
    812import java.net.Socket;
    913import java.security.GeneralSecurityException;
     
    3842    private SAMReader _reader, _reader2;
    3943    private boolean _isV3;
     44    private boolean _isV32;
    4045    private String _v3ID;
    4146    //private boolean _dead;
     
    156161            if (_log.shouldLog(Log.DEBUG))
    157162                _log.debug("Handshake complete.  we are " + ourDest);
    158             if (_isV3 && mode != V1DG && mode != V1RAW) {
     163            if (_isV3 && mode == STREAM) {
    159164                Socket sock2 = connect(isSSL);
    160165                eventHandler = new SendEventHandler(_context);
     
    170175                    _log.debug("Handshake2 complete.");
    171176            }
    172             if (ourDest != null) {
    173                 send(out, eventHandler, mode);
    174             }
     177            if (mode == DG || mode == RAW)
     178                out = null;
     179            send(out, eventHandler, mode);
    175180        } catch (IOException e) {
    176181            _log.error("Unable to connect to SAM at " + _samHost + ":" + _samPort, e);
     
    242247                _isV3 = VersionComparator.comp(hisVersion, "3") >= 0;
    243248                if (_isV3) {
     249                    _isV32 = VersionComparator.comp(hisVersion, "3.2") >= 0;
    244250                    byte[] id = new byte[5];
    245251                    _context.random().nextBytes(id);
     
    308314        private final SAMEventHandler _eventHandler;
    309315        private final int _mode;
     316        private final DatagramSocket _dgSock;
     317        private final InetSocketAddress _dgSAM;
    310318       
    311         public Sender(OutputStream samOut, SAMEventHandler eventHandler, int mode) {
     319        public Sender(OutputStream samOut, SAMEventHandler eventHandler, int mode) throws IOException {
    312320            _samOut = samOut;
    313321            _eventHandler = eventHandler;
    314322            _mode = mode;
     323            if (mode == DG || mode == RAW) {
     324                // samOut will be null
     325                _dgSock = new DatagramSocket();
     326                _dgSAM = new InetSocketAddress(_samHost, 7655);
     327            } else {
     328                _dgSock = null;
     329                _dgSAM = null;
     330            }
    315331            synchronized (_remotePeers) {
    316332                if (_v3ID != null)
     
    397413                        lastSend = now;
    398414                       
    399                         synchronized (_samOut) {
    400                             if (!_isV3 || _mode == V1DG || _mode == V1RAW) {
    401                                 String m;
    402                                 if (_mode == STREAM)
    403                                     m = "STREAM SEND ID=" + _connectionId + " SIZE=" + read + "\n";
    404                                 else if (_mode == V1DG)
    405                                     m = "DATAGRAM SEND DESTINATION=" + _remoteDestination + " SIZE=" + read + "\n";
    406                                 else if (_mode == V1RAW)
    407                                     m = "RAW SEND DESTINATION=" + _remoteDestination + " SIZE=" + read + "\n";
    408                                 else
    409                                     throw new IOException("unsupported mode " + _mode);
    410                                 byte msg[] = DataHelper.getASCII(m);
    411                                 _samOut.write(msg);
     415                        if (_samOut != null) {
     416                            synchronized (_samOut) {
     417                                if (!_isV3 || _mode == V1DG || _mode == V1RAW) {
     418                                    String m;
     419                                    if (_mode == STREAM) {
     420                                        m = "STREAM SEND ID=" + _connectionId + " SIZE=" + read + "\n";
     421                                    } else if (_mode == V1DG) {
     422                                        m = "DATAGRAM SEND DESTINATION=" + _remoteDestination + " SIZE=" + read + "\n";
     423                                    } else if (_mode == V1RAW) {
     424                                        m = "RAW SEND DESTINATION=" + _remoteDestination + " SIZE=" + read + "\n";
     425                                    } else {
     426                                        throw new IOException("unsupported mode " + _mode);
     427                                    }
     428                                    byte msg[] = DataHelper.getASCII(m);
     429                                    _samOut.write(msg);
     430                                }
     431                                _samOut.write(data, 0, read);
     432                                _samOut.flush();
    412433                            }
    413                             _samOut.write(data, 0, read);
    414                             _samOut.flush();
     434                        } else {
     435                            // real datagrams
     436                            ByteArrayOutputStream baos = new ByteArrayOutputStream(read + 1024);
     437                            baos.write(DataHelper.getASCII("3.0 "));
     438                            baos.write(DataHelper.getASCII(_v3ID));
     439                            baos.write((byte) ' ');
     440                            baos.write(DataHelper.getASCII(_remoteDestination));
     441                            if (_isV32) {
     442                                // only set TO_PORT to test session setting of FROM_PORT
     443                                baos.write(DataHelper.getASCII(" TO_PORT=5678"));
     444                            }
     445                            baos.write((byte) '\n');
     446                            baos.write(data, 0, read);
     447                            byte[] pkt = baos.toByteArray();
     448                            DatagramPacket p = new DatagramPacket(pkt, pkt.length, _dgSAM);
     449                            _dgSock.send(p);
     450                            try { Thread.sleep(25); } catch (InterruptedException ie) {}
    415451                        }
    416452                       
     
    424460            }
    425461           
    426             if (_isV3) {
    427                 try {
    428                     _samOut.close();
    429                 } catch (IOException ioe) {
    430                     _log.info("Error closing", ioe);
    431                 }
    432             } else {
    433                 byte msg[] = ("STREAM CLOSE ID=" + _connectionId + "\n").getBytes();
    434                 try {
    435                     synchronized (_samOut) {
    436                         _samOut.write(msg);
    437                         _samOut.flush();
     462            if (_samOut != null) {
     463                if (_isV3) {
     464                    try {
    438465                        _samOut.close();
     466                    } catch (IOException ioe) {
     467                        _log.info("Error closing", ioe);
    439468                    }
    440                 } catch (IOException ioe) {
    441                     _log.info("Error closing", ioe);
    442                 }
     469                } else {
     470                    byte msg[] = ("STREAM CLOSE ID=" + _connectionId + "\n").getBytes();
     471                    try {
     472                        synchronized (_samOut) {
     473                            _samOut.write(msg);
     474                            _samOut.flush();
     475                            _samOut.close();
     476                        }
     477                    } catch (IOException ioe) {
     478                        _log.info("Error closing", ioe);
     479                    }
     480                }
     481            } else if (_dgSock != null) {
     482                _dgSock.close();
    443483            }
    444484           
  • apps/sam/java/src/net/i2p/sam/client/SAMStreamSink.java

    re77c5bd r9f625a0  
    164164                t.start();
    165165            }
    166             if (_isV3 && mode != V1DG && mode != V1RAW) {
     166            if (_isV3 && mode == STREAM) {
    167167                Socket sock2 = connect(isSSL);
    168168                out = sock2.getOutputStream();
Note: See TracChangeset for help on using the changeset viewer.