Subversion Repositories HelenOS-historic

Rev

Rev 1596 | Rev 1653 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. #include <stdio.h>
  2. #include <async.h>
  3. #include <ipc/ipc.h>
  4. #include <ipc/services.h>
  5. #include <errno.h>
  6.  
  7. #define TEST_START       10000
  8. #define MAXLIST          4
  9.  
  10. #define MSG_HANG_ME_UP   2000
  11.  
  12. static int connections[50];
  13. static ipc_callid_t callids[50];
  14. static int phones[20];
  15. static int myservice = 0;
  16.  
  17. static void client_connection(ipc_callid_t iid, ipc_call_t *icall)
  18. {
  19.     ipc_callid_t callid;
  20.     ipc_call_t call;
  21.     ipcarg_t phonehash = icall->in_phone_hash;
  22.     int retval;
  23.     int i;
  24.  
  25.     printf("Connected phone: %P, accepting\n", icall->in_phone_hash);
  26.     ipc_answer_fast(iid, 0, 0, 0);
  27.     for (i=0;i < 1024;i++)
  28.         if (!connections[i]) {
  29.             connections[i] = phonehash;
  30.             break;
  31.         }
  32.    
  33.     while (1) {
  34.         callid = async_get_call(&call);
  35.         switch (IPC_GET_METHOD(call)) {
  36.         case IPC_M_PHONE_HUNGUP:
  37.             printf("Phone (%P) hung up.\n", phonehash);
  38.             retval = 0;
  39.             break;
  40.         default:
  41.             printf("Received message from %P: %X\n", phonehash,callid);
  42.             for (i=0; i < 1024; i++)
  43.                 if (!callids[i]) {
  44.                     callids[i] = callid;
  45.                     break;
  46.                 }
  47.             continue;
  48.         }
  49.         ipc_answer_fast(callid, retval, 0, 0);
  50.     }
  51. }
  52.  
  53. static void printhelp(void)
  54. {
  55.     printf("? - help\n");
  56.     printf("c - connect to other service\n");
  57.     printf("h - hangup connection\n");
  58.     printf("a - send async message to other service\n");
  59.     printf("s - send sync message to other service\n");
  60.     printf("d - answer message that we have received\n");
  61.     printf("j - jump to endless loop\n");
  62.     printf("p - page fault\n");
  63.     printf("u - unaligned read\n");
  64. }
  65.  
  66. static void callback(void *private, int retval, ipc_call_t *data)
  67. {
  68.     printf("Received response to msg %d - retval: %d.\n", private,
  69.            retval);
  70. }
  71.  
  72. static void do_answer_msg(void)
  73. {
  74.     int i,cnt, errn;
  75.     char c;
  76.     ipc_callid_t callid;
  77.  
  78.     cnt = 0;
  79.     for (i=0;i < 50;i++) {
  80.         if (callids[i]) {
  81.             printf("%d: %P\n", cnt, callids[i]);
  82.             cnt++;
  83.         }
  84.         if (cnt >= 10)
  85.             break;
  86.     }
  87.     if (!cnt)
  88.         return;
  89.     printf("Choose message:\n");
  90.     do {
  91.         c = getchar();
  92.     } while (c < '0' || (c-'0') >= cnt);
  93.     cnt = c - '0' + 1;
  94.    
  95.     for (i=0;cnt;i++)
  96.         if (callids[i])
  97.             cnt--;
  98.     i -= 1;
  99.  
  100.     printf("Normal (n) or hangup (h) or error(e) message?\n");
  101.     do {
  102.         c = getchar();
  103.     } while (c != 'n' && c != 'h' && c != 'e');
  104.     if (c == 'n')
  105.         errn = 0;
  106.     else if (c == 'h')
  107.         errn = EHANGUP;
  108.     else if (c == 'e')
  109.         errn = ENOENT;
  110.     printf("Answering %P\n", callids[i]);
  111.     ipc_answer_fast(callids[i], errn, 0, 0);
  112.     callids[i] = 0;
  113. }
  114.  
  115. static void do_send_msg(int async)
  116. {
  117.     int phoneid;
  118.     int res;
  119.     static int msgid = 1;
  120.     char c;
  121.  
  122.     printf("Select phoneid to send msg: 2-9\n");
  123.     do {
  124.         c = getchar();
  125.     } while (c < '2' || c > '9');
  126.     phoneid = c - '0';
  127.  
  128.     if (async) {
  129.         ipc_call_async(phoneid, 2000, 0, (void *)msgid, callback, 1);
  130.         printf("Async sent - msg %d\n", msgid);
  131.         msgid++;
  132.     } else {
  133.         printf("Sending msg...");
  134.         res = ipc_call_sync_2(phoneid, 2000, 0, 0, NULL, NULL);
  135.         printf("done: %d\n", res);
  136.     }
  137. }
  138.  
  139. static void do_hangup(void)
  140. {
  141.     char c;
  142.     int res;
  143.     int phoneid;
  144.  
  145.     printf("Select phoneid to hangup: 2-9\n");
  146.     do {
  147.         c = getchar();
  148.     } while (c < '2' || c > '9');
  149.     phoneid = c - '0';
  150.    
  151.     printf("Hanging up...");
  152.     res = ipc_hangup(phoneid);
  153.     printf("done: %d\n", phoneid);
  154. }
  155.  
  156. static void do_connect(void)
  157. {
  158.     char c;
  159.     int svc;
  160.     int phid;
  161.  
  162.     printf("Choose one service: 0:10000....9:10009\n");
  163.     do {
  164.         c = getchar();
  165.     } while (c < '0' || c > '9');
  166.     svc = TEST_START + c - '0';
  167.     if (svc == myservice) {
  168.         printf("Currently cannot connect to myself, update test\n");
  169.         return;
  170.     }
  171.     printf("Connecting to %d..", svc);
  172.     phid = ipc_connect_me_to(PHONE_NS, svc, 0);
  173.     if (phid > 0) {
  174.         printf("phoneid: %d\n", phid);
  175.         phones[phid] = 1;
  176.     } else
  177.         printf("error: %d\n", phid);
  178. }
  179.  
  180.  
  181.  
  182. int main(void)
  183. {
  184.     ipcarg_t phonead;
  185.     int i;
  186.     char c;
  187.     int res;
  188.     volatile long long var;
  189.     volatile int var1;
  190.    
  191.     printf("********************************\n");
  192.     printf("***********IPC Tester***********\n");
  193.     printf("********************************\n");
  194.  
  195.    
  196.     async_set_client_connection(client_connection);
  197.  
  198.     for (i=TEST_START;i < TEST_START+10;i++) {
  199.         res = ipc_connect_to_me(PHONE_NS, i, 0, &phonead);
  200.         if (!res)
  201.             break;
  202.         printf("Failed registering as %d..:%d\n", i, res);
  203.     }
  204.     printf("Registered as service: %d\n", i);
  205.     myservice = i;
  206.  
  207.     printhelp();
  208.     while (1) {
  209.         c = getchar();
  210.         switch (c) {
  211.         case '?':
  212.             printhelp();
  213.             break;
  214.         case 'h':
  215.             do_hangup();
  216.             break;
  217.         case 'c':
  218.             do_connect();
  219.             break;
  220.         case 'a':
  221.             do_send_msg(1);
  222.             break;
  223.         case 's':
  224.             do_send_msg(0);
  225.             break;
  226.         case 'd':
  227.             do_answer_msg();
  228.             break;
  229.         case 'j':
  230.             while (1)
  231.                 ;
  232.         case 'p':
  233.             printf("Doing page fault\n");
  234.             *((char *)0) = 1;
  235.             printf("done\n");
  236.         case 'u':
  237.             var1=*( (int *) ( ( (char *)(&var) ) + 1 ) );
  238.             break;
  239.         }
  240.     }
  241. }
  242.