Changeset 6587

Show
Ignore:
Timestamp:
11/29/10 15:14:17 (2 years ago)
Author:
jow
Message:

modules/admin-full: track non-tcp or udp connections, use /proc/net/nf_conntrack on newer systems

Location:
luci/trunk/modules/admin-full
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • luci/trunk/modules/admin-full/htdocs/luci-static/resources/connections.svg

    r6583 r6587  
    1212    <text id="label_25" x="20" y="74%" style="fill:#999999; font-size:9pt"> </text> 
    1313 
     14    <polyline id="tcp" points="" style="fill:green;fill-opacity:0.4;stroke:green;stroke-width:1" /> 
    1415    <polyline id="udp" points="" style="fill:blue;fill-opacity:0.4;stroke:blue;stroke-width:1" /> 
    15     <polyline id="tcp" points="" style="fill:green;fill-opacity:0.4;stroke:green;stroke-width:1" /> 
     16    <polyline id="other" points="" style="fill:red;fill-opacity:0.4;stroke:red;stroke-width:1" /> 
    1617</svg> 
  • luci/trunk/modules/admin-full/luasrc/view/admin_status/connections.htm

    r6583 r6587  
    2020 
    2121    var G; 
    22     var TIME = 0; 
    23     var UDP  = 1; 
    24     var TCP  = 2; 
     22    var TIME  = 0; 
     23    var UDP   = 1; 
     24    var TCP   = 2; 
     25    var OTHER = 3; 
    2526 
    2627    var width  = 760; 
     
    3435    var data_udp = [ ]; 
    3536    var data_tcp = [ ]; 
     37    var data_otr = [ ]; 
    3638 
    3739    var line_udp; 
     
    4244    var label_75; 
    4345 
    44     var label_rx_cur; 
    45     var label_rx_avg; 
    46     var label_rx_peak; 
    47  
    48     var label_tx_cur; 
    49     var label_tx_avg; 
    50     var label_tx_peak; 
     46    var label_udp_cur; 
     47    var label_udp_avg; 
     48    var label_udp_peak; 
     49 
     50    var label_tcp_cur; 
     51    var label_tcp_avg; 
     52    var label_tcp_peak; 
     53 
     54    var label_otr_cur; 
     55    var label_otr_avg; 
     56    var label_otr_peak; 
    5157 
    5258    var label_scale; 
     
    6369                var data_udp_avg = 0; 
    6470                var data_tcp_avg = 0; 
     71                var data_otr_avg = 0; 
    6572 
    6673                var data_udp_peak = 0; 
    6774                var data_tcp_peak = 0; 
     75                var data_otr_peak = 0; 
    6876 
    6977                for (var i = data_stamp ? 0 : 1; i < data.length; i++) 
     
    7583                    data_udp.push(data[i][UDP]); 
    7684                    data_tcp.push(data[i][TCP]); 
     85                    data_otr.push(data[i][OTHER]); 
    7786                } 
    7887 
     
    8089                data_udp = data_udp.slice(data_udp.length - data_wanted, data_udp.length); 
    8190                data_tcp = data_tcp.slice(data_tcp.length - data_wanted, data_tcp.length); 
     91                data_otr = data_otr.slice(data_otr.length - data_wanted, data_otr.length); 
    8292 
    8393                /* find peak */ 
     
    8696                    data_max = Math.max(data_max, data_udp[i]); 
    8797                    data_max = Math.max(data_max, data_tcp[i]); 
     98                    data_max = Math.max(data_max, data_otr[i]); 
    8899 
    89100                    data_udp_peak = Math.max(data_udp_peak, data_udp[i]); 
    90101                    data_tcp_peak = Math.max(data_tcp_peak, data_tcp[i]); 
     102                    data_otr_peak = Math.max(data_otr_peak, data_otr[i]); 
    91103 
    92104                    if (i > 0) 
     
    94106                        data_udp_avg = (data_udp_avg + data_udp[i]) / 2; 
    95107                        data_tcp_avg = (data_tcp_avg + data_tcp[i]) / 2; 
     108                        data_otr_avg = (data_otr_avg + data_otr[i]) / 2; 
    96109                    } 
    97110                    else 
     
    99112                        data_udp_avg = data_udp[i]; 
    100113                        data_tcp_avg = data_tcp[i]; 
     114                        data_otr_avg = data_otr[i]; 
    101115                    } 
    102116                } 
     
    108122 
    109123                /* plot data */ 
    110                 var pt_rx = '0,' + height; 
    111                 var pt_tx = '0,' + height; 
    112  
    113                 var y_rx = 0; 
    114                 var y_tx = 0; 
     124                var pt_udp = '0,' + height; 
     125                var pt_tcp = '0,' + height; 
     126                var pt_otr = '0,' + height; 
     127 
     128                var y_udp = 0; 
     129                var y_tcp = 0; 
     130                var y_otr = 0; 
    115131 
    116132                for (var i = 0; i < data_udp.length; i++) 
     
    118134                    var x = i * step; 
    119135 
    120                     y_rx = height - Math.floor(data_udp[i] * data_scale); 
    121                     y_tx = height - Math.floor(data_tcp[i] * data_scale); 
    122  
    123                     pt_rx += ' ' + x + ',' + y_rx; 
    124                     pt_tx += ' ' + x + ',' + y_tx; 
    125                 } 
    126  
    127                 pt_rx += ' ' + width + ',' + y_rx + ' ' + width + ',' + height; 
    128                 pt_tx += ' ' + width + ',' + y_tx + ' ' + width + ',' + height; 
    129  
    130  
    131                 line_udp.setAttribute('points', pt_rx); 
    132                 line_tcp.setAttribute('points', pt_tx); 
     136                    y_udp = height - Math.floor(data_udp[i] * data_scale); 
     137                    y_tcp = height - Math.floor(data_tcp[i] * data_scale); 
     138                    y_otr = height - Math.floor(data_otr[i] * data_scale); 
     139 
     140                    pt_udp += ' ' + x + ',' + y_udp; 
     141                    pt_tcp += ' ' + x + ',' + y_tcp; 
     142                    pt_otr += ' ' + x + ',' + y_otr; 
     143                } 
     144 
     145                pt_udp += ' ' + width + ',' + y_udp + ' ' + width + ',' + height; 
     146                pt_tcp += ' ' + width + ',' + y_tcp + ' ' + width + ',' + height; 
     147                pt_otr += ' ' + width + ',' + y_otr + ' ' + width + ',' + height; 
     148 
     149 
     150                line_udp.setAttribute('points', pt_udp); 
     151                line_tcp.setAttribute('points', pt_tcp); 
     152                line_otr.setAttribute('points', pt_otr); 
    133153 
    134154                label_25.firstChild.data = Math.floor(1.1 * 0.25 * data_max); 
     
    136156                label_75.firstChild.data = Math.floor(1.1 * 0.75 * data_max); 
    137157 
    138                 label_rx_cur.innerHTML = Math.floor(data_udp[data_udp.length-1]); 
    139                 label_tx_cur.innerHTML = Math.floor(data_tcp[data_tcp.length-1]); 
    140  
    141                 label_rx_avg.innerHTML = Math.floor(data_udp_avg); 
    142                 label_tx_avg.innerHTML = Math.floor(data_tcp_avg); 
    143  
    144                 label_rx_peak.innerHTML = Math.floor(data_udp_peak); 
    145                 label_tx_peak.innerHTML = Math.floor(data_tcp_peak); 
     158                label_udp_cur.innerHTML = Math.floor(data_udp[data_udp.length-1]); 
     159                label_tcp_cur.innerHTML = Math.floor(data_tcp[data_tcp.length-1]); 
     160                label_otr_cur.innerHTML = Math.floor(data_otr[data_otr.length-1]); 
     161 
     162                label_udp_avg.innerHTML = Math.floor(data_udp_avg); 
     163                label_tcp_avg.innerHTML = Math.floor(data_tcp_avg); 
     164                label_otr_avg.innerHTML = Math.floor(data_otr_avg); 
     165 
     166                label_udp_peak.innerHTML = Math.floor(data_udp_peak); 
     167                label_tcp_peak.innerHTML = Math.floor(data_tcp_peak); 
     168                label_otr_peak.innerHTML = Math.floor(data_otr_peak); 
    146169 
    147170                /* reset timer */ 
     
    180203                    data_udp[i] = 0; 
    181204                    data_tcp[i] = 0; 
     205                    data_otr[i] = 0; 
    182206                } 
    183207 
     
    185209                line_udp = G.getElementById('udp'); 
    186210                line_tcp = G.getElementById('tcp'); 
     211                line_otr = G.getElementById('other'); 
    187212 
    188213                label_25 = G.getElementById('label_25'); 
     
    190215                label_75 = G.getElementById('label_75'); 
    191216 
    192                 label_rx_cur  = document.getElementById('lb_udp_cur'); 
    193                 label_rx_avg  = document.getElementById('lb_udp_avg'); 
    194                 label_rx_peak = document.getElementById('lb_udp_peak'); 
    195  
    196                 label_tx_cur  = document.getElementById('lb_tcp_cur'); 
    197                 label_tx_avg  = document.getElementById('lb_tcp_avg'); 
    198                 label_tx_peak = document.getElementById('lb_tcp_peak'); 
     217                label_udp_cur  = document.getElementById('lb_udp_cur'); 
     218                label_udp_avg  = document.getElementById('lb_udp_avg'); 
     219                label_udp_peak = document.getElementById('lb_udp_peak'); 
     220 
     221                label_tcp_cur  = document.getElementById('lb_tcp_cur'); 
     222                label_tcp_avg  = document.getElementById('lb_tcp_avg'); 
     223                label_tcp_peak = document.getElementById('lb_tcp_peak'); 
     224 
     225                label_otr_cur  = document.getElementById('lb_otr_cur'); 
     226                label_otr_avg  = document.getElementById('lb_otr_avg'); 
     227                label_otr_peak = document.getElementById('lb_otr_peak'); 
    199228 
    200229                label_scale   = document.getElementById('scale'); 
     
    257286        <td id="lb_tcp_peak">0</td> 
    258287    </tr> 
     288    <tr> 
     289        <td style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid red"><%:Other:%></strong></td> 
     290        <td id="lb_otr_cur">0</td> 
     291 
     292        <td style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></td> 
     293        <td id="lb_otr_avg">0</td> 
     294 
     295        <td style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></td> 
     296        <td id="lb_otr_peak">0</td> 
     297    </tr> 
    259298</table> 
    260299 
  • luci/trunk/modules/admin-full/src/luci-bwc.c

    r6583 r6587  
    6767    uint32_t udp; 
    6868    uint32_t tcp; 
     69    uint32_t other; 
    6970}; 
    7071 
     
    221222} 
    222223 
    223 static int update_cnstat(uint32_t udp, uint32_t tcp) 
     224static int update_cnstat(uint32_t udp, uint32_t tcp, uint32_t other) 
    224225{ 
    225226    char path[1024]; 
     
    241242    } 
    242243 
    243     e.time = htonll(time(NULL)); 
    244     e.udp  = htonl(udp); 
    245     e.tcp  = htonl(tcp); 
     244    e.time  = htonll(time(NULL)); 
     245    e.udp   = htonl(udp); 
     246    e.tcp   = htonl(tcp); 
     247    e.other = htonl(other); 
    246248 
    247249    return update_file(path, &e, sizeof(struct conn_entry)); 
     
    280282    FILE *info; 
    281283    uint64_t rxb, txb, rxp, txp; 
    282     uint32_t udp, tcp; 
     284    uint32_t udp, tcp, other; 
    283285    float lf1, lf5, lf15; 
    284286    char line[1024]; 
    285287    char ifname[16]; 
    286288 
     289    struct stat s; 
     290    const char *ipc = stat("/proc/net/nf_conntrack", &s) 
     291        ? "/proc/net/ip_conntrack" : "/proc/net/nf_conntrack"; 
    287292 
    288293    if (!nofork) 
     
    332337        } 
    333338 
    334         if ((info = fopen("/proc/net/ip_conntrack", "r")) != NULL) 
    335         { 
    336             udp = 0; 
    337             tcp = 0; 
     339        if ((info = fopen(ipc, "r")) != NULL) 
     340        { 
     341            udp   = 0; 
     342            tcp   = 0; 
     343            other = 0; 
    338344 
    339345            while (fgets(line, sizeof(line), info)) 
    340346            { 
    341                 switch (line[0]) 
     347                if (sscanf(line, "%*s %*d %s", ifname) || sscanf(line, "%s %*d", ifname)) 
    342348                { 
    343                     case 't': 
     349                    if (!strcmp(ifname, "tcp")) 
    344350                        tcp++; 
    345                         break; 
    346  
    347                     case 'u': 
     351                    else if (!strcmp(ifname, "udp")) 
    348352                        udp++; 
    349                         break; 
    350  
    351                     default: 
    352                         break; 
     353                    else 
     354                        other++; 
    353355                } 
    354356            } 
    355357 
    356             update_cnstat(udp, tcp); 
     358            update_cnstat(udp, tcp, other); 
    357359 
    358360            fclose(info); 
     
    432434            continue; 
    433435 
    434         printf("[ %" PRIu64 ", %u, %u ]%s\n", 
    435             ntohll(e->time), ntohl(e->udp), ntohl(e->tcp), 
     436        printf("[ %" PRIu64 ", %u, %u, %u ]%s\n", 
     437            ntohll(e->time), ntohl(e->udp), 
     438            ntohl(e->tcp), ntohl(e->other), 
    436439            ((i + sizeof(struct conn_entry)) < m.size) ? "," : ""); 
    437440    }