Various protocol changes to comply better with spec.
authorSteinar H. Gunderson <sesse@samfundet.no>
Sat, 5 Feb 2005 02:44:46 +0000 (02:44 +0000)
committerSteinar H. Gunderson <sesse@samfundet.no>
Sat, 5 Feb 2005 02:44:46 +0000 (02:44 +0000)
iso.c
mcs.c

diff --git a/iso.c b/iso.c
index 746a945..b0bafa7 100644 (file)
--- a/iso.c
+++ b/iso.c
@@ -22,7 +22,7 @@
 
 /* Send a self-contained ISO PDU */
 static void
-iso_send_msg(uint8 code)
+iso_send_msg(uint8 code, uint8 class)
 {
        STREAM s;
 
@@ -34,9 +34,9 @@ iso_send_msg(uint8 code)
 
        out_uint8(s, 6);        /* hdrlen */
        out_uint8(s, code);
-       out_uint16(s, 0);       /* dst_ref */
-       out_uint16(s, 0);       /* src_ref */
-       out_uint8(s, 0);        /* class */
+       out_uint16(s, 0);               /* dst_ref */
+       out_uint16_be(s, 0x1234);       /* src_ref */
+       out_uint8(s, class);    /* class */
 
        s_mark_end(s);
        tcp_send(s);
@@ -202,7 +202,7 @@ iso_recv_connect(int server_sock)
 
        DEBUG(("Got ISO connection request\n"));
 
-       iso_send_msg(ISO_PDU_CC);
+       iso_send_msg(ISO_PDU_CC, 0);
        return 1;
 }
 
@@ -210,6 +210,6 @@ iso_recv_connect(int server_sock)
 void
 iso_disconnect(void)
 {
-       iso_send_msg(ISO_PDU_DR);
+       iso_send_msg(ISO_PDU_DR, 0);
        tcp_disconnect();
 }
diff --git a/mcs.c b/mcs.c
index 5f4fe20..038886a 100644 (file)
--- a/mcs.c
+++ b/mcs.c
@@ -89,6 +89,13 @@ ber_out_integer(STREAM s, int value)
        out_uint16_be(s, value);
 }
 
+static void
+ber_out_uint8(STREAM s, uint8 value)
+{
+       ber_out_header(s, BER_TAG_INTEGER, 1);
+       out_uint8(s, value);
+}
+
 static void
 ber_in_integer(STREAM s, int *value)
 {
@@ -101,15 +108,18 @@ ber_in_integer(STREAM s, int *value)
 static void
 mcs_out_domain_params(STREAM s, int max_channels, int max_users, int max_tokens, int max_pdusize)
 {
-       ber_out_header(s, MCS_TAG_DOMAIN_PARAMS, 32);
-       ber_out_integer(s, max_channels);
-       ber_out_integer(s, max_users);
-       ber_out_integer(s, max_tokens);
-       ber_out_integer(s, 1);  /* num_priorities */
-       ber_out_integer(s, 0);  /* min_throughput */
-       ber_out_integer(s, 1);  /* max_height */
-       ber_out_integer(s, max_pdusize);
-       ber_out_integer(s, 2);  /* ver_protocol */
+       ber_out_header(s, MCS_TAG_DOMAIN_PARAMS, 26);
+       ber_out_uint8(s, 34); // max_channels
+       ber_out_uint8(s, 3);  // max_users
+       ber_out_uint8(s, 0);  // max_tokens
+       ber_out_uint8(s, 1);  // num_priorities 
+       ber_out_uint8(s, 0);  // min_throughput
+       ber_out_uint8(s, 1);  // max_height
+       ber_out_header(s, BER_TAG_INTEGER, 3); // pdu size
+       out_uint8(s, 0x00);
+       out_uint8(s, 0xff);
+       out_uint8(s, 0xf8);
+       ber_out_uint8(s, 2);  // ver_protocol
 }
 
 /* Parse a DOMAIN_PARAMS structure (ASN.1 BER) */
@@ -189,27 +199,62 @@ mcs_send_connect_response()
        STREAM s;
        int i;
 
-       s = iso_init(92);
+       s = iso_init(98);
+       printf("INITLEN: %u\n", s->p - s->iso_hdr);
 
-       ber_out_header(s, MCS_CONNECT_RESPONSE, 80);
+       ber_out_header(s, MCS_CONNECT_RESPONSE, 93);
        ber_out_header(s, BER_TAG_RESULT, 1);
        out_uint8(s, 0);
 
        ber_out_header(s, BER_TAG_INTEGER, 1);
-       out_uint8(s, 1);  // connect id
+       out_uint8(s, 0);  // connect id
        
        mcs_out_domain_params(s, 34, 2, 0, 0xffff);  // dumdidum?
 
-       ber_out_header(s, BER_TAG_OCTET_STRING, 40);
-
-       out_uint8s(s, 21);   // ick
-       out_uint8(s, 0);
+       ber_out_header(s, BER_TAG_OCTET_STRING, 59);
+
+       // some unknown header of sorts
+       out_uint8(s, 0x00);
+       out_uint8(s, 0x05);
+       out_uint8(s, 0x00);
+       out_uint8(s, 0x14);
+       out_uint8(s, 0x7c);
+       out_uint8(s, 0x00);
+       out_uint8(s, 0x01);
+       out_uint8(s, 0x2a);
+       out_uint8(s, 0x14);
+       out_uint8(s, 0x76);
+       out_uint8(s, 0x0a); // length?
+       out_uint8(s, 0x01); // length?
+       out_uint8(s, 0x01);
+       out_uint8(s, 0x00);
+       out_uint8(s, 0x01);
+       out_uint8(s, 0xc0);
+       out_uint8(s, 0x00);
+       out_uint8(s, 0x4d);
+       out_uint8(s, 0x63);
+       out_uint8(s, 0x44);
+       out_uint8(s, 0x6e);
+       
+       out_uint8(s, 0x81);  // one byte length
+       out_uint8(s, 0x04);  // unknown
 
        // server info -- we claim to support RDP5
        out_uint16_le(s, SEC_TAG_SRV_INFO);
-       out_uint16_le(s, 6);  // length
-       out_uint16_le(s, 5);
-
+       out_uint16_le(s, 8);  // length
+       out_uint16_le(s, 4);  // version
+       out_uint16_le(s, 8);  // unknown
+
+       // channel info -- open a few channels
+       out_uint16_le(s, SEC_TAG_SRV_CHANNELS);
+       out_uint16_le(s, 16); // length
+       out_uint16_le(s, 1003);
+       out_uint16_le(s, 3);
+       out_uint16_le(s, 1004);
+       out_uint16_le(s, 1005);
+       out_uint16_le(s, 1006);
+       out_uint16_le(s, 0);
+       
        // crypto info
        out_uint16_le(s, SEC_TAG_SRV_CRYPT);
        out_uint16_le(s, 12); // length
@@ -262,7 +307,7 @@ mcs_send_aucf(uint16 mcs_userid)
 
        out_uint8(s, (MCS_AUCF << 2) | 2);  // | 2 = send user ID
        out_uint8(s, 0);  // success
-       out_uint16_be(s, 0);
+       out_uint16_be(s, 6);
        
        s_mark_end(s);
        iso_send(s);
@@ -294,9 +339,10 @@ mcs_send_cjcf(uint16 userid, uint16 chanid)
 
        s = iso_init(5);
 
-       out_uint8(s, (MCS_CJCF << 2));
+       out_uint8(s, (MCS_CJCF << 2) | 2);
        out_uint8(s, 0); // success
-       out_uint16_be(s, g_mcs_userid);
+       out_uint16_be(s, 6);
+       out_uint16_be(s, chanid);
        out_uint16_be(s, chanid);
 
        s_mark_end(s);