Annotation of embedaddon/strongswan/scripts/thread_analysis.c, revision 1.1.1.1

1.1       misho       1: /* Analyzes the concurrent use of charon's threads
                      2:  *
                      3:  * Copyright (C) 2008 Andreas Steffen
                      4:  * HSR Hochschule fuer Technik Rapperswil
                      5:  *
                      6:  * This program is free software; you can redistribute it and/or modify it
                      7:  * under the terms of the GNU General Public License as published by the
                      8:  * Free Software Foundation; either version 2 of the License, or (at your
                      9:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
                     10:  *
                     11:  * This program is distributed in the hope that it will be useful, but
                     12:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
                     13:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
                     14:  * for more details.
                     15:  */
                     16: 
                     17: #include <stdio.h>
                     18: #include <stdlib.h>
                     19: #include <string.h>
                     20: 
                     21: #define LOGFILE                "moon.daemon.log"
                     22: #define LINE_LEN       2048
                     23: #define THREADS                99
                     24: 
                     25: typedef enum state_t state_t;
                     26: 
                     27: enum state_t {
                     28:        STATE_IDLE  = 0,
                     29:        STATE_INIT  = 1,
                     30:        STATE_AUTH  = 2,
                     31:        STATE_BUSY  = 3,
                     32:        STATE_RETRY = 4,
                     33:        STATE_ERROR = 5
                     34: };
                     35: 
                     36: typedef enum print_t print_t;
                     37: 
                     38: enum print_t {
                     39:        MODE_ANY        = 0,
                     40:        MODE_ADD        = 1,
                     41:        MODE_DEL        = 2
                     42: };
                     43: 
                     44: static char *state_names[] = { "idle", "init", "auth", "busy", "retry", "error" };
                     45: 
                     46: static int readline(FILE *fd, char *line)
                     47: {
                     48:        while (fread(line, 1, 1, fd))
                     49:        {
                     50:                if (*line == '\n')
                     51:                {
                     52:                        *line = '\0';
                     53:                        return 1;
                     54:                }
                     55:                line++;
                     56:        }
                     57:        *line = '\0';
                     58:        return 0;
                     59: }
                     60: 
                     61: static void printline(state_t *state, char *timestamp)
                     62: {
                     63:        int states[] = { 0, 0, 0, 0, 0};
                     64:        int th, total ;
                     65: 
                     66:        printf("    <tr>\n");
                     67:        printf("      <td class=\"log\">%.15s</td>", timestamp);
                     68: 
                     69:        for (th = 1; th <= THREADS; th++)
                     70:        {
                     71:                states[state[th]]++;
                     72:                printf("<td class=\"%s\"></td>", state_names[state[th]]);
                     73:        }
                     74:        total = states[STATE_INIT] + states[STATE_AUTH] + states[STATE_BUSY] + states[STATE_RETRY];
                     75:        printf("<td class=\"init\">%d</td><td class=\"auth\">%d</td><td class=\"busy\">%d</td>",
                     76:                        states[STATE_INIT], states[STATE_AUTH], total);
                     77:        for (th = 10; th <= (THREADS + 2); th += 5)
                     78:        {
                     79:                printf("<td class=\"%s\"></td>", (th <= total + 2)? "busy":"idle");
                     80:        }
                     81:        printf("\n");
                     82:        printf("    </tr>\n");
                     83: }
                     84: 
                     85: int main(int argc, char *argv[])
                     86: {
                     87:        char line[LINE_LEN];
                     88:        int section = 0;
                     89:        int mode = MODE_ANY;
                     90:        int th;
                     91:        FILE *fd;
                     92: 
                     93:        state_t state[THREADS + 1];
                     94: 
                     95:        /* threads 1..5 and 9 are always busy */
                     96:        for (th = 1; th <= THREADS; th++)
                     97:        {
                     98:                state[th] = (th <= 7 && th != 3)? STATE_BUSY : STATE_IDLE;
                     99:        }
                    100: 
                    101:        /* open the log file */
                    102:        fd = fopen(LOGFILE, "r");
                    103:        if (!fd)
                    104:        {
                    105:                printf("could not open log file '%s'\n", LOGFILE);
                    106:                return 1;
                    107:        }
                    108: 
                    109:        printf("<html>\n");
                    110:        printf("<head>\n");
                    111:        printf("  <title>Charon Thread Analysis</title>\n");
                    112:        printf("  <style>\n");
                    113:        printf("    body     { font: 11px verdana,arial, helvetica, sans-serif }\n");
                    114:        printf("    td       { font: 10px verdana,arial, helvetica, sans-serif;\n");
                    115:        printf("               text-align: center;  padding: 0px 1px 0px 1px; background: #FFFF66 }\n");
                    116:        printf("    td.log   { text-align: left; background: #FFFF66; white-space: nowrap }\n");
                    117:        printf("    td.idle  { background: #FFFF66 }\n");
                    118:        printf("    td.init  { background: #FFA522 }\n");
                    119:        printf("    td.auth  { background: #90EE90 }\n");
                    120:        printf("    td.busy  { background: #ADD8E6 }\n");
                    121:        printf("    td.retry { background: #7B68EE }\n");
                    122:        printf("    td.error { background: #FF6347 }\n");
                    123:        printf("    hr { background-color: #000000; border: 0; height: 1px; }\n");
                    124:        printf("    a:visited { color: #000000 }\n");
                    125:     printf("    a:link    { color: #000000 }\n");
                    126:        printf("    a:hover   { color: #0000FF }\n");
                    127:        printf("  </style>\n");
                    128:        printf("</head>\n");
                    129:        printf("<body>\n");
                    130:        printf("  <h1>Charon Thread Analysis</h1>\n");
                    131:        printf("  <table>\n");
                    132: 
                    133:        /* print table header */
                    134:        printf("    <tr>\n");
                    135:        printf("      <td class=\"log\">Timestamp</td>");
                    136:        for (th = 1 ; th <= THREADS; th++)
                    137:        {
                    138:                printf("<td>%02d</td>", th);
                    139:        }
                    140:        printf("<td class=\"init\">I</td><td class=\"auth\">A</td><td class=\"busy\">B</td>");
                    141:        for (th = 10; th <= (THREADS + 2); th += 5)
                    142:        {
                    143:                printf("<td class=\"busy\">%d</td>", (th == 100)? 99:th);
                    144:        }
                    145:        printf("\n");
                    146:        printf("    </tr>\n");
                    147: 
                    148:        while (readline(fd, line))
                    149:        {
                    150:                char *p_section, *p_charon, *p_thread, *p_log;
                    151: 
                    152:                p_section = strstr(line, "---");
                    153:                if (p_section)
                    154:                {
                    155:                        printline(state, line);
                    156:                        mode = MODE_ANY;
                    157: 
                    158:                        if (section++ < 1)
                    159:                        {
                    160:                                continue;
                    161:                        }
                    162:                        else
                    163:                        {
                    164:                                break;
                    165:                        }
                    166:                }
                    167: 
                    168:                p_charon = strstr(line, "charon");
                    169:                if (!p_charon)
                    170:                {
                    171:                        continue;
                    172:                }
                    173: 
                    174:                /* determine thread */
                    175:                p_thread = p_charon + 8;
                    176:                th = atol(p_thread);
                    177: 
                    178:                /* determine log message */
                    179:                p_log = p_charon + 16;
                    180:                if (strstr(p_log, "received packet"))
                    181:                {
                    182:                        if (mode == MODE_DEL)
                    183:                        {
                    184:                                printline(state, line);
                    185:                        }
                    186:                        mode = MODE_ADD;
                    187:                        if (state[th] != STATE_IDLE)
                    188:                        {
                    189:                                state[th] = STATE_ERROR;
                    190:                        }
                    191:                        else
                    192:                        {
                    193:                                state[th] = STATE_BUSY;
                    194:                        }
                    195:                }
                    196:                if (strstr(p_log, "sending packet"))
                    197:                {
                    198:                        if (mode == MODE_ADD)
                    199:                        {
                    200:                                printline(state, line);
                    201:                        }
                    202:                        mode = MODE_DEL;
                    203:                        if (state[th] == STATE_IDLE)
                    204:                        {
                    205:                                state[th] = STATE_ERROR;
                    206:                        }
                    207:                        else
                    208:                        {
                    209:                                state[th] = STATE_IDLE;
                    210:                        }
                    211:                }
                    212:                if (strstr(p_log, "parsed IKE_SA_INIT request"))
                    213:                {
                    214:                        if (state[th] != STATE_BUSY)
                    215:                        {
                    216:                                state[th] = STATE_ERROR;
                    217:                        }
                    218:                        else
                    219:                        {
                    220:                                state[th] = STATE_INIT;
                    221:                        }
                    222:                }
                    223:                if (strstr(p_log, "parsed IKE_AUTH request"))
                    224:                {
                    225:                        if (state[th] != STATE_BUSY)
                    226:                        {
                    227:                                state[th] = STATE_ERROR;
                    228:                        }
                    229:                        else
                    230:                        {
                    231:                                state[th] = STATE_AUTH;
                    232:                        }
                    233:                }
                    234:                if (strstr(p_log, "already processing"))
                    235:                {
                    236:                        if (state[th] != STATE_IDLE)
                    237:                        {
                    238:                                state[th] = STATE_ERROR;
                    239:                        }
                    240:                        else
                    241:                        {
                    242:                                state[th] = STATE_RETRY;
                    243:                        }
                    244:                        printline(state, line);
                    245:                        mode = MODE_ANY;
                    246:                        state[th] = STATE_IDLE;
                    247:                }
                    248:        }
                    249:        printf("  </table>\n");
                    250:        printf("  <p>\n");
                    251:        printf("  <table>\n");
                    252:        printf("    <tr>\n");
                    253:        printf("      <td class=\"init\">&nbsp;I&nbsp;</td><td>IKE_SA_INIT Thread &nbsp;</td>\n");
                    254:        printf("      <td class=\"auth\">&nbsp;A&nbsp;</td><td>IKE_AUTH Thread &nbsp;</td>\n");
                    255:        printf("      <td class=\"retry\">&nbsp;R&nbsp;</td><td>Retransmit Thread &nbsp;</td>\n");
                    256:        printf("      <td class=\"busy\">&nbsp;B&nbsp;</td><td>Busy Thread &nbsp;</td>\n");
                    257:        printf("      <td class=\"error\">&nbsp;E&nbsp;</td><td>State Error &nbsp;</td>\n");
                    258:        printf("    </tr>\n");
                    259:        printf("  </table>\n");
                    260:        printf("  <p>\n");
                    261:        printf("  <hr/>\n");
                    262:        printf("  <em>&copy; 2008\n");
                    263:        printf("    <a href=\"http://www.hsr.ch/?&L=1\" target=\"popup\">\n");
                    264:        printf("       HSR Hochschule f&uuml;r Technik Rapperswil</a>\n");
                    265:        printf("  </em>\n");
                    266:        printf("</body>\n");
                    267:        printf("</html>\n");
                    268: 
                    269:        fclose(fd);
                    270:        return 0;
                    271: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>