linux/net/ipv4/tcp_probe.c
<<
>2 <.4./spa> .4./form .4.ad>2 hoefS 167.4" > v3.7.4form img src4fo .4.ad>2fo 4.ad class="lxr_search">form2 <="+search" method="post" onsubmit="return do_search(this);">form input typo> hidden" namo> navtarget" optio> ">form input typo> text" namo> search" id> search">form butt2 submit">Search2 hoefS 167 .4.ad>2fo 4.ad class="lxr_p.7.s"167.4" 3.7.4<+p.7.s?return=net/ipv4/tcp_probe.c" > vonclick="return ajax_p.7.s();">form P.7.s2 hoea>fo .4.ad>2> vhoediv>2> vhofS ac>2 <="ajax+*" method="post" onsubmit="return false;">fo input typo> hidden" namo> ajax_lookup" id> ajax_lookup" optio> ">f> vhoefS 16f> vhodiv class="headingbott2m">
2>
2> vhodiv id> search_results" class="search_results"2 >2> vhoediv>2 odiv id> content">2 odiv id> file_contents"1 6e/60/3ec49fea39f9478079d7f18c84e0aac76048_3/0"1< 3.7.4 L1" class="line" namo> L1"> vh1oea> 4.ad class="comment">/* .4.ad>2< 3.7.4 L2" class="line" namo> L2"> vh2oea> 4.ad class="comment"> * tcpprobe - Observe the TCP flow with kprobes. .4.ad>2< 3.7.4 L3" class="line" namo> L3"> vh3oea> 4.ad class="comment"> * .4.ad>2< 3.7.4 L4" class="line" namo> L4"> vh4oea> 4.ad class="comment"> * The idea fS this camo from Werner Almesberger's umlsim .4.ad>2< 3.7.4 L5" class="line" namo> L5"> vh5oea> 4.ad class="comment"> * Copyright (C) 2004, Stephen Hemminger <shemminger@osdl.org> .4.ad>2< 3.7.4 L6" class="line" namo> L6"> vh6oea> 4.ad class="comment"> * .4.ad>2< 3.7.4 L7" class="line" namo> L7"> vh7oea> 4.ad class="comment"> * This program is free software; you can redistribute it and/S modify .4.ad>2< 3.7.4 L8" class="line" namo> L8"> vh8oea> 4.ad class="comment"> * it under the terms of the GNU General Public License as published by .4.ad>2< 3.7.4 L9" class="line" namo> L9"> vh9oea> 4.ad class="comment"> * the Free Software Founda>2 <; either vers>2 <2 of the License. .4.ad>2< 3.7.4 L10" class="line" namo> L10"> v/opta> 4.ad class="comment"> * .4.ad>2< 3.7.4 L11" class="line" namo> L11"> v11oea> 4.ad class="comment"> * This program is distributed in the hope that it will be useful, .4.ad>2< 3.7.4 L12" class="line" namo> L12"> v12oea> 4.ad class="comment"> * but WITHOUT ANY WARRANTY; without even the implied warranty of .4.ad>2< 3.7.4 L13" class="line" namo> L13"> v13oea> 4.ad class="comment"> * MERCHANTABILITY S FITNESS FOR A PARTICULAR PURPOSE. See the .4.ad>2< 3.7.4 L14" class="line" namo> L14"> v14oea> 4.ad class="comment"> * GNU General Public License fS more details. .4.ad>2< 3.7.4 L15" class="line" namo> L15"> v15oea> 4.ad class="comment"> * .4.ad>2< 3.7.4 L16" class="line" namo> L16"> v16oea> 4.ad class="comment"> * You should have received a copy of the GNU General Public License .4.ad>2< 3.7.4 L17" class="line" namo> L17"> v17oea> 4.ad class="comment"> * along with this program; if not, write to the Free Software .4.ad>2< 3.7.4 L18" class="line" namo> L18"> v18oea> 4.ad class="comment"> * Founda>2 <, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. .4.ad>2< 3.7.4 L19" class="line" namo> L19"> v19oea> 4.ad class="comment"> */ .4.ad>2< 3.7.4 L20" class="line" namo> L20"> v2opta>2< 3.7.4 L21" class="line" namo> L21"> v21oea>#include << 3.7.4linux/kernel.hoea>>2< 3.7.4 L22" class="line" namo> L22"> v22oea>#include << 3.7.4linux/kprobes.hoea>>2< 3.7.4 L23" class="line" namo> L23"> v23oea>#include << 3.7.4linux/socket.hoea>>2< 3.7.4 L24" class="line" namo> L24"> v24oea>#include << 3.7.4linux/tcp.hoea>>2< 3.7.4 L25" class="line" namo> L25"> v25oea>#include << 3.7.4linux/proc_fs.hoea>>2< 3.7.4 L26" class="line" namo> L26"> v26oea>#include << 3.7.4linux/module.hoea>>2< 3.7.4 L27" class="line" namo> L27"> v27oea>#include << 3.7.4linux/ktime.hoea>>2< 3.7.4 L28" class="line" namo> L28"> v28oea>#include << 3.7.4linux/time.hoea>>2< 3.7.4 L29" class="line" namo> L29"> v29oea>#include << 3.7.4net/net_namo4.ace.hoea>>2< 3.7.4 L30" class="line" namo> L30"> v3opta>2< 3.7.4 L31" class="line" namo> L31"> v31oea>#include << 3.7.4net/tcp.hoea>>2< 3.7.4 L32" class="line" namo> L32"> v32pta>2< 3.7.4 L33" class="line" namo> L33"> v33oea> 3.7.4<+code=MODULE_AUTHOR" class="sref">MODULE_AUTHORoea>( 4.ad class="string">"Stephen Hemminger <shemminger@linux-founda>2 <.org>" .4.ad>);2< 3.7.4 L34" class="line" namo> L34"> v34oea> 3.7.4<+code=MODULE_DESCRIPTION" class="sref">MODULE_DESCRIPTIONoea>( 4.ad class="string">"TCP cwnd snooper" .4.ad>);2< 3.7.4 L35" class="line" namo> L35"> v35oea> 3.7.4<+code=MODULE_LICENSE" class="sref">MODULE_LICENSEoea>( 4.ad class="string">"GPL" .4.ad>);2< 3.7.4 L36" class="line" namo> L36"> v36oea> 3.7.4<+code=MODULE_VERSION" class="sref">MODULE_VERSIONoea>( 4.ad class="string">"1.1" .4.ad>);2< 3.7.4 L37" class="line" namo> L37"> v37pta>2< 3.7.4 L38" class="line" namo> L38"> v38oea>static int 3.7.4<+code=port" class="sref">portoea> 3.7.4<+code=__read_mostly" class="sref">__read_mostlyoea> = 0;2< 3.7.4 L39" class="line" namo> L39"> v39oea> 3.7.4<+code=MODULE_PARM_DESC" class="sref">MODULE_PARM_DESCoea>( 3.7.4<+code=port" class="sref">portoea>, 4.ad class="string">"Port to match (0=all)" .4.ad>);2< 3.7.4 L40" class="line" namo> L40"> v40oea> 3.7.4<+code=module_param" class="sref">module_paramoea>( 3.7.4<+code=port" class="sref">portoea>, int, 0);2< 3.7.4 L41" class="line" namo> L41"> v41pta>2< 3.7.4 L42" class="line" namo> L42"> v42oea>static int 3.7.4<+code=bufsize" class="sref">bufsizeoea> 3.7.4<+code=__read_mostly" class="sref">__read_mostlyoea> = 4096;2< 3.7.4 L43" class="line" namo> L43"> v43oea> 3.7.4<+code=MODULE_PARM_DESC" class="sref">MODULE_PARM_DESCoea>( 3.7.4<+code=bufsize" class="sref">bufsizeoea>, 4.ad class="string">"Log buffer size in .ackets (4096)" .4.ad>);2< 3.7.4 L44" class="line" namo> L44"> v44oea> 3.7.4<+code=module_param" class="sref">module_paramoea>( 3.7.4<+code=bufsize" class="sref">bufsizeoea>, int, 0);2< 3.7.4 L45" class="line" namo> L45"> v45pta>2< 3.7.4 L46" class="line" namo> L46"> v46oea>static int 3.7.4<+code=full" class="sref">fulloea> 3.7.4<+code=__read_mostly" class="sref">__read_mostlyoea>;2< 3.7.4 L47" class="line" namo> L47"> v47oea> 3.7.4<+code=MODULE_PARM_DESC" class="sref">MODULE_PARM_DESCoea>( 3.7.4<+code=full" class="sref">fulloea>, 4.ad class="string">"Full log (1=every ack .acket received, 0=only cwnd changes)" .4.ad>);2< 3.7.4 L48" class="line" namo> L48"> v48oea> 3.7.4<+code=module_param" class="sref">module_paramoea>( 3.7.4<+code=full" class="sref">fulloea>, int, 0);2< 3.7.4 L49" class="line" namo> L49"> v49pta>2< 3.7.4 L50" class="line" namo> L50"> v50oea>static const char 3.7.4<+code=procnamo" class="sref">procnamooea>[] = 4.ad class="string">"tcpprobe" .4.ad>;2< 3.7.4 L51" class="line" namo> L51"> v51pta>2< 3.7.4 L52" class="line" namo> L52"> v52oea>struct 3.7.4<+code=tcp_log" class="sref">tcp_logoea> {2< 3.7.4 L53" class="line" namo> L53"> v53oea> 3.7.4<+code=ktime_t" class="sref">ktime_toea> 3.7.4<+code=tstamp" class="sref">tstampoea>;2< 3.7.4 L54" class="line" namo> L54"> v54oea> 3.7.4<+code=__be32" class="sref">__be32oea> 3.7.4<+code=saddr" class="sref">saddroea>, 3.7.4<+code=daddr" class="sref">daddroea>;2< 3.7.4 L55" class="line" namo> L55"> v55oea> 3.7.4<+code=__be16" class="sref">__be16oea> 3.7.4<+code=sport" class="sref">sportoea>, 3.7.4<+code=dport" class="sref">dportoea>;2< 3.7.4 L56" class="line" namo> L56"> v56oea> 3.7.4<+code=u16" class="sref">u16oea> 3.7.4<+code=length" class="sref">lengthoea>;2< 3.7.4 L57" class="line" namo> L57"> v57oea> 3.7.4<+code=u32" class="sref">u32oea> 3.7.4<+code=snd_nxt" class="sref">snd_nxtoea>;2< 3.7.4 L58" class="line" namo> L58"> v58oea> 3.7.4<+code=u32" class="sref">u32oea> 3.7.4<+code=snd_una" class="sref">snd_unaoea>;2< 3.7.4 L59" class="line" namo> L59"> v59oea> 3.7.4<+code=u32" class="sref">u32oea> 3.7.4<+code=snd_wnd" class="sref">snd_wndoea>;2< 3.7.4 L60" class="line" namo> L60"> v60oea> 3.7.4<+code=u32" class="sref">u32oea> 3.7.4<+code=snd_cwnd" class="sref">snd_cwndoea>;2< 3.7.4 L61" class="line" namo> L61"> v61oea> 3.7.4<+code=u32" class="sref">u32oea> 3.7.4<+code=sst3.7sh" class="sref">sst3.7shoea>;2< 3.7.4 L62" class="line" namo> L62"> v62oea> 3.7.4<+code=u32" class="sref">u32oea> 3.7.4<+code=srtt" class="sref">srttoea>;2< 3.7.4 L63" class="line" namo> L63"> v63oea>};2< 3.7.4 L64" class="line" namo> L64"> v64pta>2< 3.7.4 L65" class="line" namo> L65"> v65oea>static struct {2< 3.7.4 L66" class="line" namo> L66"> v66oea> 3.7.4<+code=spinlock_t" class="sref">spinlock_toea> 3.7.4<+code=lock" class="sref">lockoea>;2< 3.7.4 L67" class="line" namo> L67"> v67oea> 3.7.4<+code=wait_queue_head_t" class="sref">wait_queue_head_toea> 3.7.4<+code=wait" class="sref">waitoea>;2< 3.7.4 L68" class="line" namo> L68"> v68oea> 3.7.4<+code=ktime_t" class="sref">ktime_toea> 3.7.4<+code=start" class="sref">startoea>;2< 3.7.4 L69" class="line" namo> L69"> v69oea> 3.7.4<+code=u32" class="sref">u32oea> 3.7.4<+code=lastcwnd" class="sref">lastcwndoea>;2< 3.7.4 L70" class="line" namo> L70"> v7opta>2< 3.7.4 L71" class="line" namo> L71"> v71oea> unsigned long 3.7.4<+code=head" class="sref">headoea>, 3.7.4<+code=tail" class="sref">tailoea>;2< 3.7.4 L72" class="line" namo> L72"> v72oea> struct 3.7.4<+code=tcp_log" class="sref">tcp_logoea> * 3.7.4<+code=log" class="sref">logoea>;2< 3.7.4 L73" class="line" namo> L73"> v73oea>} 3.7.4<+code=tcp_probe" class="sref">tcp_probeoea>;2< 3.7.4 L74" class="line" namo> L74"> v74pta>2< 3.7.4 L75" class="line" namo> L75"> v75pta>2< 3.7.4 L76" class="line" namo> L76"> v76oea>static 3.7.4<+code=inline" class="sref">inlineoea> int 3.7.4<+code=tcp_probe_used" class="sref">tcp_probe_usedoea>(void)2< 3.7.4 L77" class="line" namo> L77"> v77oea>{2< 3.7.4 L78" class="line" namo> L78"> v78oea> return ( 3.7.4<+code=tcp_probe" class="sref">tcp_probeoea>. 3.7.4<+code=head" class="sref">headoea> - 3.7.4<+code=tcp_probe" class="sref">tcp_probeoea>. 3.7.4<+code=tail" class="sref">tailoea>) % 3.7.4<+code=bufsize" class="sref">bufsizeoea>;2< 3.7.4 L79" class="line" namo> L79"> v79oea>}2< 3.7.4 L80" class="line" namo> L80"> v8opta>2< 3.7.4 L81" class="line" namo> L81"> v81oea>static 3.7.4<+code=inline" class="sref">inlineoea> int 3.7.4<+code=tcp_probe_avail" class="sref">tcp_probe_availoea>(void)2< 3.7.4 L82" class="line" namo> L82"> v82oea>{2< 3.7.4 L83" class="line" namo> L83"> v83oea> return 3.7.4<+code=bufsize" class="sref">bufsizeoea> - 3.7.4<+code=tcp_probe_used" class="sref">tcp_probe_usedoea>();2< 3.7.4 L84" class="line" namo> L84"> v84oea>}2< 3.7.4 L85" class="line" namo> L85"> v85pta>2< 3.7.4 L86" class="line" namo> L86"> v86oea> 4.ad class="comment">/* .4.ad>2< 3.7.4 L87" class="line" namo> L87"> v87oea> 4.ad class="comment"> * Hook inserted to be called before each receive .acket. .4.ad>2< 3.7.4 L88" class="line" namo> L88"> v88oea> 4.ad class="comment"> * Note: arguments must match tcp_rcv_established()! .4.ad>2< 3.7.4 L89" class="line" namo> L89"> v89oea> 4.ad class="comment"> */ .4.ad>2< 3.7.4 L90" class="line" namo> L90"> v90oea>static int 3.7.4<+code=jtcp_rcv_established" class="sref">jtcp_rcv_establishedoea>(struct 3.7.4<+code=sock" class="sref">sockoea> * 3.7.4<+code=sk" class="sref">skoea>, struct 3.7.4<+code=sk_buff" class="sref">sk_buffoea> * 3.7.4<+code=skb" class="sref">skboea>,2< 3.7.4 L91" class="line" namo> L91"> v91oea> struct 3.7.4<+code=tcphdr" class="sref">tcphdroea> * 3.7.4<+code=th" class="sref">thoea>, unsigned 3.7.4<+code=len" class="sref">lenoea>)2< 3.7.4 L92" class="line" namo> L92"> v92oea>{2< 3.7.4 L93" class="line" namo> L93"> v93oea> const struct 3.7.4<+code=tcp_sock" class="sref">tcp_sockoea> * 3.7.4<+code=tp" class="sref">tpoea> = 3.7.4<+code=tcp_sk" class="sref">tcp_skoea>( 3.7.4<+code=sk" class="sref">skoea>);2< 3.7.4 L94" class="line" namo> L94"> v94oea> const struct 3.7.4<+code=inet_sock" class="sref">inet_sockoea> * 3.7.4<+code=inet" class="sref">inetoea> = 3.7.4<+code=inet_sk" class="sref">inet_skoea>( 3.7.4<+code=sk" class="sref">skoea>);2< 3.7.4 L95" class="line" namo> L95"> v95pta>2< 3.7.4 L96" class="line" namo> L96"> v96oea> 4.ad class="comment">/* Only update if port matches */ .4.ad>2< 3.7.4 L97" class="line" namo> L97"> v97oea> if (( 3.7.4<+code=port" class="sref">portoea> == 0 || 3.7.4<+code=ntohs" class="sref">ntohsoea>( 3.7.4<+code=inet" class="sref">inetoea>-> 3.7.4<+code=dport" class="sref">dportoea>) == 3.7.4<+code=port" class="sref">portoea> || 3.7.4<+code=ntohs" class="sref">ntohsoea>( 3.7.4<+code=inet" class="sref">inetoea>-> 3.7.4<+code=sport" class="sref">sportoea>) == 3.7.4<+code=port" class="sref">portoea>)2< 3.7.4 L98" class="line" namo> L98"> v98oea> && ( 3.7.4<+code=full" class="sref">fulloea> || 3.7.4<+code=tp" class="sref">tpoea>-> 3.7.4<+code=snd_cwnd" class="sref">snd_cwndoea> != 3.7.4<+code=tcp_probe" class="sref">tcp_probeoea>. 3.7.4<+code=lastcwnd" class="sref">lastcwndoea>)) {2< 3.7.4 L99" class="line" namo> L99"> v99pta>2< 3.7.4 L100" class="line" namo> L100"> 100oea> 3.7.4<+code=spin_lock" class="sref">spin_lockoea>(& 3.7.4<+code=tcp_probe" class="sref">tcp_probeoea>. 3.7.4<+code=lock" class="sref">lockoea>);2< 3.7.4 L101" class="line" namo> L101"> 101oea> 4.ad class="comment">/* If log fills, just silently drop */ .4.ad>2< 3.7.4 L102" class="line" namo> L102"> 102oea> if ( 3.7.4<+code=tcp_probe_avail" class="sref">tcp_probe_availoea>() > 1) {2< 3.7.4 L103" class="line" namo> L103"> 103oea> struct 3.7.4<+code=tcp_log" class="sref">tcp_logoea> * 3.7.4<+code=p" class="sref">poea> = 3.7.4<+code=tcp_probe" class="sref">tcp_probeoea>. 3.7.4<+code=log" class="sref">logoea> + 3.7.4<+code=tcp_probe" class="sref">tcp_probeoea>. 3.7.4<+code=head" class="sref">headoea>;2< 3.7.4 L104" class="line" namo> L104"> 104pta>2< 3.7.4 L105" class="line" namo> L105"> 105oea> 3.7.4<+code=p" class="sref">poea>-> 3.7.4<+code=tstamp" class="sref">tstampoea> = 3.7.4<+code=ktime_get" class="sref">ktime_getoea>();2< 3.7.4 L106" class="line" namo> L106"> 106oea> 3.7.4<+code=p" class="sref">poea>-> 3.7.4<+code=saddr" class="sref">saddroea> = 3.7.4<+code=inet" class="sref">inetoea>-> 3.7.4<+code=saddr" class="sref">saddroea>;2< 3.7.4 L107" class="line" namo> L107"> 107oea> 3.7.4<+code=p" class="sref">poea>-> 3.7.4<+code=sport" class="sref">sportoea> = 3.7.4<+code=inet" class="sref">inetoea>-> 3.7.4<+code=sport" class="sref">sportoea>;2< 3.7.4 L108" class="line" namo> L108"> 108oea> 3.7.4<+code=p" class="sref">poea>-> 3.7.4<+code=daddr" class="sref">daddroea> = 3.7.4<+code=inet" class="sref">inetoea>-> 3.7.4<+code=daddr" class="sref">daddroea>;2< 3.7.4 L109" class="line" namo> L109"> 109oea> 3.7.4<+code=p" class="sref">poea>-> 3.7.4<+code=dport" class="sref">dportoea> = 3.7.4<+code=inet" class="sref">inetoea>-> 3.7.4<+code=dport" class="sref">dportoea>;2< 3.7.4 L110" class="line" namo> L110"> 110oea> 3.7.4<+code=p" class="sref">poea>-> 3.7.4<+code=length" class="sref">lengthoea> = 3.7.4<+code=skb" class="sref">skboea>-> 3.7.4<+code=len" class="sref">lenoea>;2< 3.7.4 L111" class="line" namo> L111"> 111oea> 3.7.4<+code=p" class="sref">poea>-> 3.7.4<+code=snd_nxt" class="sref">snd_nxtoea> = 3.7.4<+code=tp" class="sref">tpoea>-> 3.7.4<+code=snd_nxt" class="sref">snd_nxtoea>;2< 3.7.4 L112" class="line" namo> L112"> 112oea> 3.7.4<+code=p" class="sref">poea>-> 3.7.4<+code=snd_una" class="sref">snd_unaoea> = 3.7.4<+code=tp" class="sref">tpoea>-> 3.7.4<+code=snd_una" class="sref">snd_unaoea>;2< 3.7.4 L113" class="line" namo> L113"> 113oea> 3.7.4<+code=p" class="sref">poea>-> 3.7.4<+code=snd_cwnd" class="sref">snd_cwndoea> = 3.7.4<+code=tp" class="sref">tpoea>-> 3.7.4<+code=snd_cwnd" class="sref">snd_cwndoea>;2< 3.7.4 L114" class="line" namo> L114"> 114oea> 3.7.4<+code=p" class="sref">poea>-> 3.7.4<+code=snd_wnd" class="sref">snd_wndoea> = 3.7.4<+code=tp" class="sref">tpoea>-> 3.7.4<+code=snd_wnd" class="sref">snd_wndoea>;2< 3.7.4 L115" class="line" namo> L115"> 115oea> 3.7.4<+code=p" class="sref">poea>-> 3.7.4<+code=sst3.7sh" class="sref">sst3.7shoea> = 3.7.4<+code=tcp_current_sst3.7sh" class="sref">tcp_current_sst3.7shoea>( 3.7.4<+code=sk" class="sref">skoea>);2< 3.7.4 L116" class="line" namo> L116"> 116oea> 3.7.4<+code=p" class="sref">poea>-> 3.7.4<+code=srtt" class="sref">srttoea> = 3.7.4<+code=tp" class="sref">tpoea>-> 3.7.4<+code=srtt" class="sref">srttoea> >> 3;2< 3.7.4 L117" class="line" namo> L117"> 117pta>2< 3.7.4 L118" class="line" namo> L118"> 118oea> 3.7.4<+code=tcp_probe" class="sref">tcp_probeoea>. 3.7.4<+code=head" class="sref">headoea> = ( 3.7.4<+code=tcp_probe" class="sref">tcp_probeoea>. 3.7.4<+code=head" class="sref">headoea> + 1) % 3.7.4<+code=bufsize" class="sref">bufsizeoea>;2< 3.7.4 L119" class="line" namo> L119"> 119oea> }2< 3.7.4 L120" class="line" namo> L120"> 120oea> 3.7.4<+code=tcp_probe" class="sref">tcp_probeoea>. 3.7.4<+code=lastcwnd" class="sref">lastcwndoea> = 3.7.4<+code=tp" class="sref">tpoea>-> 3.7.4<+code=snd_cwnd" class="sref">snd_cwndoea>;2< 3.7.4 L121" class="line" namo> L121"> 121oea> 3.7.4<+code=spin_unlock" class="sref">spin_unlockoea>(& 3.7.4<+code=tcp_probe" class="sref">tcp_probeoea>. 3.7.4<+code=lock" class="sref">lockoea>);2< 3.7.4 L122" class="line" namo> L122"> 122pta>2< 3.7.4 L123" class="line" namo> L123"> 123oea> 3.7.4<+code=wake_up" class="sref">wake_upoea>(& 3.7.4<+code=tcp_probe" class="sref">tcp_probeoea>. 3.7.4<+code=wait" class="sref">waitoea>);2< 3.7.4 L124" class="line" namo> L124"> 124oea> }2< 3.7.4 L125" class="line" namo> L125"> 125pta>2< 3.7.4 L126" class="line" namo> L126"> 126oea> 3.7.4<+code=jprobe_return" class="sref">jprobe_returnoea>();2< 3.7.4 L127" class="line" namo> L127"> 127oea> return 0;2< 3.7.4 L128" class="line" namo> L128"> 128oea>}2< 3.7.4 L129" class="line" namo> L129"> 129pta>2< 3.7.4 L130" class="line" namo> L130"> 130oea>static struct 3.7.4<+code=jprobe" class="sref">jprobeoea> 3.7.4<+code=tcp_jprobe" class="sref">tcp_jprobeoea> = {2< 3.7.4 L131" class="line" namo> L131"> 131oea> . 3.7.4<+code=kp" class="sref">kpoea> = {2< 3.7.4 L132" class="line" namo> L132"> 132oea> . 3.7.4<+code=symbol_namo" class="sref">symbol_namooea> = 4.ad class="string">"tcp_rcv_established" .4.ad>,2< 3.7.4 L133" class="line" namo> L133"> 133oea> },2< 3.7.4 L134" class="line" namo> L134"> 134oea> . 3.7.4<+code=entry" class="sref">entryoea> = 3.7.4<+code=jtcp_rcv_established" class="sref">jtcp_rcv_establishedoea>,2< 3.7.4 L135" class="line" namo> L135"> 135oea>};2< 3.7.4 L136" class="line" namo> L136"> 136oea>2< 3.7.4 L137" class="line" namo> L137"> 137pta>static int 3.7.4<+code=tcpprobe_open" class="sref">tcpprobe_openoea>(struct 3.7.4<+code=inode" class="sref">inodeoea> * 3.7.4<+code=inode" class="sref">inodeoea>, struct 3.7.4<+code=file" class="sref">fileoea> * 3.7.4<+code=file" class="sref">fileoea>)2< 3.7.4 L138" class="line" namo> L138"> 138oea>{2< 3.7.4 L139" class="line" namo> L139"> 139oea> 4.ad class="comment">/* Reset (empty) log */ .4.ad>2< 3.7.4 L140" class="line" namo> L140"> 140oea> 3.7.4<+code=spin_lock_bh" class="sref">spin_lock_bhoea>(& 3.7.4<+code=tcp_probe" class="sref">tcp_probeoea>. 3.7.4<+code=lock" class="sref">lockoea>);2< 3.7.4 L141" class="line" namo> L141"> 141oea> 3.7.4<+code=tcp_probe" class="sref">tcp_probeoea>. 3.7.4<+code=head" class="sref">headoea> = 3.7.4<+code=tcp_probe" class="sref">tcp_probeoea>. 3.7.4<+code=tail" class="sref">tailoea> = 0;2< 3.7.4 L142" class="line" namo> L142"> 142oea> 3.7.4<+code=tcp_probe" class="sref">tcp_probeoea>. 3.7.4<+code=start" class="sref">startoea> = 3.7.4<+code=ktime_get" class="sref">ktime_getoea>();2< 3.7.4 L43" class="line" 13"> v14oea> 3.7.4<+code=kpin_unlockobh" class="sref">spin_lnlockobh"ea>(& 3.7.4<+code=tcp_probe" class="sref">tcp_probeoea>. 3.7.4<+code=lock" class="sref">lockoea>);2< 3.7.4 L14"" class="line" namo> L14""> 134pta>2< 3.7.4 L415" class="line" namo> L415"> v14oea> eturn 0;2< 3.7.4 L416" class="line" namo> L416"> v16oea>s2< 3.7.4 L417" class="line" namo> L417"> v14pta>2< 3.7.4 L418" class="line" namo> L418"> v14oea>static int 3.7.4<+code=pcpprobe_osping" class="sref">kcpprobe_osping"ea>(&har 3.7.4<+code=tpbu" class="sref">spbu"ea>, snt 3.7.4<+code=p" class="sref">toea>)2< 3.7.4 L419" class="line" namo> L419"> v19pta>22< 3.7.4 L510" class="line" namo> L510"> v15oea> onst struct 3.7.4<+code=tcp_sog" class="sref">tcp_logoea> * 3.7.4<+code=p" class="sref">poea> < 3.7.4 L141" class="line" namo> L511"> v15oea> 3.7.4<+code=tcp_probe" class="sref">tcp_probeoea>. 3.7.4<+code=log" class="sref">logoea> + 3.7.4<+code=tcp_probe" class="sref">tcp_probeoea>. 3.7.4<+code=hail" class="sref">tailoea> =#37; 3.7.4<+code=bufsize" class="sref">bufsizeoea>;2< 3.7.4 L512" class="line" namo> L512"> v15oea> struct 3.7.4<+code=tcio4.aec class="sref">taio4.aecea> 3.7.4<+code=tcv class="sref">tavea> < 3.7.4 L513"> v15oea> 3.7.4<+code=ktime_gto_cio4.aec class="sref">ttime_gto_cio4.aecea>( 3.7.4<+code=stime_gsu" class="sref">stime_gsu"ea>( 3.7.4<+code=s" class="sref">poea>-> 3.7.4<+code=tstamp" class="sref">tstampoea> 3.7.4<+code=tap_probe" class="sref">tcp_probeoea>. 3.7.4<+code=start" class="sref">startoea> );2< 3.7.4 L514" class="line" namo> L514"> v15pta>2< 3.7.4 L515" class="line" namo> L515"> v15oea> eturn 0 3.7.4<+code=sndping"" class="sref">skdping""ea>( 3.7.4<+code=spbu" class="sref">spbu"ea>, s 3.7.4<+code=p" class="sref">toea>)2< 3.7.4 L516" class="line" namo> L516"> v15oea> .ad class="string">"t#37; lu.#37; 09lu quot; .4.ad>,s 3.7.4<+code=pNIPQUAD_FMT class="sref">tNIPQUAD_FMTea> .ad class="string">"t:#37; u quot; .4.ad>,s 3.7.4<+code=pNIPQUAD_FMT class="sref">tNIPQUAD_FMTea> .ad class="string">"t:#37; uquot; .4.ad>,< 3.7.4 L417" class="line" namo> L517"> v15oea> .ad class="string">"t=#37; d=#37; #x=#37; #x=#37; u=#37; u=#37; u=#37; u\nquot; .4.ad>,2< 3.7.4 L518" class="line" namo> L518"> v15oea> (nsigned long ) 3.7.4<+code=tcv class="sref">tavea> 3.7.4<+code=hav_sec class="sref">tav_secea>)2< 3.7.4 L419" class="line" namo> L519"> v15oea> (nsigned long ) 3.7.4<+code=tcv class="sref">tavea> 3.7.4<+code=hav_nsec class="sref">tav_nsecea>)2< 3.7.4 L610" class="line" namo> L610"> v16oea> 3.7.4<+code=pNIPQUAD class="sref">tNIPQUADea>( 3.7.4<+code=s" class="sref">poea>-> 3.7.4<+code=taddr" class="sref">saddroea>;) s 3.7.4<+code=p"ohs" class="sref">ntohsoea>( 3.7.4<+code=i" class="sref">poea>-> 3.7.4<+code=sport" class="sref">sportoea> )2< 3.7.4 L141" class="line" namo> L611"> v16oea> 3.7.4<+code=pNIPQUAD class="sref">tNIPQUADea>( 3.7.4<+code=s" class="sref">poea>-> 3.7.4<+code=taddr" class="sref">daddroea>;) s 3.7.4<+code=p"ohs" class="sref">ntohsoea>( 3.7.4<+code=i" class="sref">poea>-> 3.7.4<+code=sport" class="sref">dportoea>) 2< 3.7.4 L512" class="line" namo> L612"> v16oea> 3.7.4<+code=p" class="sref">poea>-> 3.7.4<+code=sength" class="sref">lengthoea> s 3.7.4<+code=p" class="sref">poea>-> 3.7.4<+code=snd_nxt" class="sref">snd_nxtoea> s 3.7.4<+code=p" class="sref">poea>-> 3.7.4<+code=snd_nna" class="sref">snd_unaoea>;2< 3.7.4 L613"> v16oea> 3.7.4<+code=p" class="sref">poea>-> 3.7.4<+code=snd_cwnd" class="sref">snd_cwndoea> s 3.7.4<+code=p" class="sref">poea>-> 3.7.4<+code=snt3.7sh" class="sref">sst3.7shoea> s 3.7.4<+code=p" class="sref">poea>-> 3.7.4<+code=snd_nnd" class="sref">snd_wndoea>; s 3.7.4<+code=p" class="sref">poea>-> 3.7.4<+code=sntt" class="sref">srttoea> ;2< 3.7.4 L614" class="line" namo> L614"> v16oea>}2< 3.7.4 L615" class="line" namo> L615"> v16pta>2< 3.7.4 L616" class="line" namo> L616"> v16oea>static 3.7.4<+code=isizeot" class="sref">spizeot"ea> 3.7.4<+code=tcp_robe_retd" class="sref">hcp_robe_retd"ea>(struct 3.7.4<+code=iile" class="sref">fileoea> * 3.7.4<+code=iile" class="sref">fileoea> ,char 3.7.4<+code=p_used" class="sref">d_used"ea> * 3.7.4<+code=ibu" class="sref">sbu"ea>, < 3.7.4 L417" class="line" namo> L617"> v16oea> 3.7.4<+code=pizeot" class="sref">spzeot"ea> 3.7.4<+code=ten" class="sref">lenoea>; s 3.7.4<+code=plofft" class="sref">slofft"ea> * 3.7.4<+code=p"po" class="sref">n"po"ea>)2< 3.7.4 L618" class="line" namo> L618"> v16oea>{2< 3.7.4 L619" class="line" namo> L619"> v19oea> nt 3.7.4<+code=perro" class="sref">derro"ea> = 0; s 3.7.4<+code=pcg" class="sref">kcnoea> = ;2< 3.7.4 L710" class="line" namo> L710"> v1opta>2< 3.7.4 L711" class="line" namo> L711"> v11oea> uf ( ! 3.7.4<+code=ibu" class="sref">sbu"ea>,|| 3.7.4<+code=ten" class="sref">lenoea>;<s 02< 3.7.4 L712" class="line" namo> L712"> v17oea> eturn 0- 3.7.4<+code=tEINVAL class="sref">lEINVALea>;2< 3.7.4 L713" class="line" namo> L713"> v13oea>}< 3.7.4 L614" class="line" namo> L714"> v17oea> .whleo( 3.7.4<+code=tcg" class="sref">kcnoea> =lt;s 3.7.4<+code=ten" class="sref">lenoea>; {2< 3.7.4 L715" class="line" namo> L715"> v17oea> har 3.7.4<+code=ppbu" class="sref">spbu"ea>,[128]2< 3.7.4 L616" class="line" namo> L716"> v17oea> nt 3.7.4<+code=pwidh" class="sref">lwidh"ea>;2< 3.7.4 L17"" class="line" namo> L17""> v17pta>2< 3.7.4 L718" class="line" namo> L718"> v17oea> 4.ad class="comment">/* RWaitfS mdatain .uffer s/ .4.ad>2< 3.7.4 L719" class="line" namo> L719"> v17oea> 3.7.4<+code=perro" class="sref">derro"ea> = 0 3.7.4<+code=pwit_qven t_nt erruptibe" class="sref">fwit_qven t_nt erruptibe"ea>( 3.7.4<+code=spp_probe" class="sref">tcp_probeoea>. 3.7.4<+code=wait" class="sref">waitoea>) < 3.7.4 L810" class="line" namo> L810"> v18oea> 3.7.4<+code=spp_probe"used" class="sref">tcp_probe_usedoea>();> 1);2< 3.7.4 L811" class="line" namo> L811"> v18oea> f ( 3.7.4<+code=terro" class="sref">derro"ea> 2< 3.7.4 L812" class="line" namo> L812"> v18oea> betdk2< 3.7.4 L713" class="line" namo> L813"> v18oea>}< 3.7.4 L814" class="line" namo> L814"> v18oea> 3.7.4<+code=kpin_uock_bh" class="sref">spin_lock_bhoea>(& 3.7.4<+code=tcp_probe" class="sref">tcp_probeoea>. 3.7.4<+code=lock" class="sref">lockoea>);2< 3.7.4 L815" class="line" namo> L815"> v18oea> f ( 3.7.4<+code=tcp_probe_ class="sref">tcp_probeoea>. 3.7.4<+code=lead" class="sref">headoea> = 3.7.4<+code=tcp_probe" class="sref">tcp_probeoea>. 3.7.4<+code=tail" class="sref">tailoea> {2< 3.7.4 L816" class="line" namo> L816"> v18oea> .ad class="somment">/* Rmultipl recaders race?s/ .4.ad>2< 3.7.4 L817" class="line" namo> L817"> v18oea> 3.7.4<+code=ppin_unlockobh" class="sref">spin_lnlockobh"ea>(& 3.7.4<+code=tcp_probe" class="sref">tcp_probeoea>. 3.7.4<+code=lock" class="sref">lockoea>);2< 3.7.4 L818" class="line" namo> L818"> v18oea> continue2< 3.7.4 L719" class="line" namo> L819"> v18oea> }2< 3.7.4 L910" class="line" namo> L910"> v19pta>2< 3.7.4 L911" class="line" namo> L911"> v11oea> 3.7.4<+code=pwidh" class="sref">lwidh"ea>; 3.7.4<+code=tcp_robe_osping" class="sref">kcpprobe_osping"ea>(& 3.7.4<+code=spbu" class="sref">spbu"ea>, spzeoof& 3.7.4<+code=spbu" class="sref">spbu"ea>,);2< 3.7.4 L912" class="line" namo> L912"> v19pta>2< 3.7.4 L913" class="line" namo> L913"> v19oea> f ( 3.7.4<+code=tcg" class="sref">kcnoea> = 3.7.4<+code=twidh" class="sref">lwidh"ea>; lt;s 3.7.4<+code=ten" class="sref">lenoea>; < 3.7.4 L814" class="line" namo> L914"> v19oea> 3.7.4<+code=pcp_probe" class="sref">tcp_probeoea>. 3.7.4<+code=tail" class="sref">tailoea> = 0 3.7.4<+code=tcp_probe_ class="sref">tcp_probeoea>. 3.7.4<+code=lail" class="sref">tailoea> = 1) % 3.7.4<+code=bufsize" class="sref">bufsizeoea>;2< 3.7.4 L915" class="line" namo> L915"> v15pta>2< 3.7.4 L916" class="line" namo> L916"> v19oea> 3.7.4<+code=ppin_unlockobh" class="sref">spin_lnlockobh"ea>(& 3.7.4<+code=tcp_probe" class="sref">tcp_probeoea>. 3.7.4<+code=lock" class="sref">lockoea>);2< 3.7.4 L917" class="line" namo> L917"> v19pta>2< 3.7.4 L918" class="line" namo> L918"> v18oea> & .ad class="somment">/* Rf (record geca er thd c.ace. vailoabe"ea.ad>2< 3.7.4 L919" class="line" namo> L919"> v19oea> 4.ad class="comment"> *******************eturn 0partial.uffer s(so far)s/ .4.ad>2< 3.7.4 L120" class="line" namo> L120"> 120oea> f ( 3.7.4<+code=tcg" class="sref">kcnoea> = 3.7.4<+code=twidh" class="sref">lwidh"ea>; lt; 3.7.4<+code=ten" class="sref">lenoea>; < 3.7.4 L121" class="line" namo> L121"> 121oea> betdk2< 3.7.4 L122" class="line" namo> L122"> 120pta>2< 3.7.4 L123" class="line" namo> L123"> 123oea> f ( 3.7.4<+code=tcopygto_sed" class="sref">dcopygto_sed"ea>(& 3.7.4<+code=sbu" class="sref">sbu"ea>,| 3.7.4<+code=tcg" class="sref">kcnoea> 3.7.4<+code=tabu" class="sref">spbu"ea>, s 3.7.4<+code=pwidh" class="sref">lwidh"ea>;) < 3.7.4 L123" class="line" namo> L924"> 120oea> eturn 0- 3.7.4<+code=tEFAULT class="sref">tEFAULTea>;2< 3.7.4 L125" class="line" namo> L125"> 125oea> 3.7.4<+code=tcg" class="sref">kcnoea> = 0 3.7.4<+code=pwidh" class="sref">lwidh"ea>;2< 3.7.4 L126" class="line" namo> L126"> 126oea> 2< 3.7.4 L127" class="line" namo> L127"> 120pta>2< 3.7.4 L128" class="line" namo> L128"> 120oea> return ( 3.7.4<+code=pcg" class="sref">kcnoea> = 0 |? 3.7.4<+code=perro" class="sref">derro"ea> =:( 3.7.4<+code=pcg" class="sref">kcnoea> 2< 3.7.4 L128" class="line" namo> L929"> 120oea>}2< 3.7.4 L120" class="line" namo> L120"> 121pta>2< 3.7.4 L121" class="line" namo> L121"> 121oea>static onst struct 3.7.4<+code=tileoopenrticnst class="sref">fileoopenrticnstea> 3.7.4<+code=tcp_robe_rfopt class="sref">fcp_robe_rfoptea> = 02< 3.7.4 L122" class="line" namo> L122"> 122oea> 3.7.4<+code=lownd" class="sref">downd"ea> 0 3.7.4<+code=pTHIS_ODULE_ class="sref">dTHIS_ODULE_ea>) < 3.7.4 L123" class="line" namo> L123"> 123oea> 3.7.4<+code=loen" class="sref">tpenoea>( 0 3.7.4<+code=pcpprobe_open" class="sref">tcpprobe_openoea>( < 3.7.4 L124" class="line" namo> L124"> 124oea> 3.7.4<+code=letd" class="sref">hetd"ea>( 0 3.7.4<+code=pcpprobe_oetd" class="sref">hcp_robe_retd"ea>( < 3.7.4 L125" class="line" namo> L125"> 121oea>};2< 3.7.4 L126" class="line" namo> L126"> 121oea>2< 3.7.4 L127" class="line" namo> L127"> 121pta>static i 3.7.4<+code=p_uint" class="sref">w_uint"ea>( nt 3.7.4<+code=pcpprobe_oint" class="sref">wcpprobe_oint"ea>(&oid)2< 3.7.4 L128" class="line" namo> L128"> 121oea>{2< 3.7.4 L129" class="line" namo> L129"> 121oea> nt 3.7.4<+code=prt" class="sref">krtoea> = - 3.7.4<+code=tENOMEM class="sref">tENOMEMea> 2< 3.7.4 L120" class="line" namo> L120"> 122pta>2< 3.7.4 L121" class="line" namo> L121"> 122oea> 3.7.4<+code=tint"_aitoueue_head_ class="sref">tint"_aitoueue_head_ea>(& 3.7.4<+code=tcp_probe" class="sref">tcp_probeoea>. 3.7.4<+code=lait" class="sref">waitoea>);2< 3.7.4 L122" class="line" namo> L122"> 122oea> 3.7.4<+code=tpin_lock_bint" class="sref">wpin_lock_bint"ea>(& 3.7.4<+code=tcp_probe" class="sref">tcp_probeoea>. 3.7.4<+code=lock" class="sref">lockoea>);2< 3.7.4 L123" class="line" namo> L123"> 122oea>}< 3.7.4 L124" class="line" namo> L124"> 124oea> }f ( 3.7.4<+code=tufsize" class="sref">bufsizeoea> -lt;s 02< 3.7.4 L125" class="line" namo> L125"> 122oea> eturn 0- 3.7.4<+code=tEINVAL class="sref">lEINVALea>;2< 3.7.4 L126" class="line" namo> L126"> 122oea>2< 3.7.4 L127" class="line" namo> L127"> 122oea> 3.7.4<+code=wcp_probe" class="sref">tcp_probeoea>. 3.7.4<+code=log" class="sref">logoea> + 3.7.4<+code=ktalleoc class="sref">ttalleocea>(& 3.7.4<+code=sbu"ize" class="sref">bufsizeoea> spzeoof&truct 3.7.4<+code=tcp_sog" class="sref">tcp_logoea> ) s 3.7.4<+code=pGFP_KERNEL class="sref">lGFP_KERNELea>);2< 3.7.4 L128" class="line" namo> L128"> 1228ea> }f ( ! 3.7.4<+code=icp_probe" class="sref">tcp_probeoea>. 3.7.4<+code=log" class="sref">logoea> 2< 3.7.4 L129" class="line" namo> L129"> 122oea> }goto 3.7.4<+code=perr0 class="sref">lerr0ea>;2< 3.7.4 L120" class="line" namo> L120"> 123pta>2< 3.7.4 L121" class="line" namo> L121"> 123oea> uf ( ! 3.7.4<+code=irobc_et/rfopt_ceca e class="sref">lrobc_et/rfopt_ceca eea>(& 3.7.4<+code=tint"_et" class="sref">inet"_et"ea>, s 3.7.4<+code=probcamo" class="sref">srobcamo"ea>, s 3.7.4<+code=pS_IRUSR class="sref">sS_IRUSRea>, samp; 3.7.4<+code=tcp_robe_rfopt class="sref">fcp_robe_rfoptea> ) < 3.7.4 L122" class="line" namo> L122"> 122oea> .goto 3.7.4<+code=perr0 class="sref">lerr0ea>;2< 3.7.4 L123" class="line" namo> L123"> 123oea>}< 3.7.4 L124" class="line" namo> L124"> 124oea> . 3.7.4<+code=prt" class="sref">krtoea> = 3.7.4<+code=prtgisterjprobe" class="sref">trtgisterjprobe"ea>(& 3.7.4<+code=tcp_pprobe" class="sref">tcp_jprobeoea> ;2< 3.7.4 L125" class="line" namo> L125"> 1235ea> }f ( 3.7.4<+code=trt" class="sref">krtoea> < 3.7.4 L126" class="line" namo> L126"> 123oea> goto 3.7.4<+code=perr1 class="sref">lerr1ea>;2< 3.7.4 L127" class="line" namo> L127"> 123pta>2< 3.7.4 L128" class="line" namo> L128"> 123oea> 3.7.4<+code=kprbinfo class="sref">srobinfoea>(& .ad class="string">"tTCP robe. rtgistered (orto=#37; d)\nquot; .4.ad>,2 3.7.4<+code=kprt" class="sref">portoea>)22< 3.7.4 L129" class="line" namo> L129"> 129oea> eturn 0;2< 3.7.4 L120" class="line" namo> L120"> 120oea> 3.7.4<+code=perr1 class="sref">lerr1ea>;:< 3.7.4 L121" class="line" namo> L121"> 121oea> 3.7.4<+code=trobc_et/rremove class="sref">lrobc_et/rremoveea>(& 3.7.4<+code=tint"_et" class="sref">inet"_et"ea>, s 3.7.4<+code=probcamo" class="sref">srobcamo"ea>,22< 3.7.4 L122" class="line" namo> L122"> 122oea> 3.7.4<+code=perr0 class="sref">lerr0ea>;:< 3.7.4 L12" id> L43" class="line" 23"> v24oea> 3.7.4<+code=kkfre" class="sref">skfre"ea>(& 3.7.4<+code=spp_probe" class="sref">tcp_probeoea>. 3.7.4<+code=log" class="sref">logoea> 22< 3.7.4 L12"" class="line" namo> L12""> 1244ea> eturn 0 3.7.4<+code=trt" class="sref">krtoea> 2< 3.7.4 L125" class="line" namo> L425"> v24oea> 2< 3.7.4 L426" class="line" namo> L426"> v26oea>s 3.7.4<+code=tmodul_oint" class="sref">wmodul_oint"ea>(& 3.7.4<+code=spp_robe_oint" class="sref">wcpprobe_oint"ea>(22< 3.7.4 L127" class="line" namo> L427"> v24pta>2< 3.7.4 L428" class="line" namo> L428"> v24oea>static i 3.7.4<+code=p_uext" class="sref">w_uext"ea> oid) 3.7.4<+code=pcpprobe_oext" class="sref">wcpprobe_oext"ea>(&oid)2< 3.7.4 L429" class="line" namo> L429"> v29pta>22< 3.7.4 L520" class="line" namo> L520"> v25oea> 3.7.4<+code=srobc_et/rremove class="sref">lrobc_et/rremoveea>(& 3.7.4<+code=tint"_et" class="sref">inet"_et"ea>, s 3.7.4<+code=probcamo" class="sref">srobcamo"ea>,22< 3.7.4 L121" class="line" namo> L521"> v25oea> 3.7.4<+code=tunrtgisterjprobe" class="sref">tunrtgisterjprobe"ea>(& 3.7.4<+code=tcp_pprobe" class="sref">tcp_jprobeoea> ;2< 3.7.4 L522" class="line" namo> L522"> v25oea> 3.7.4<+code=tkfre" class="sref">skfre"ea>(& 3.7.4<+code=spp_probe" class="sref">tcp_probeoea>. 3.7.4<+code=log" class="sref">logoea> 22< 3.7.4 L523"> v25oea> 2< 3.7.4 L524" class="line" namo> L524"> v25pta>2 3.7.4<+code=tmodul_oext" class="sref">wmodul_oext"ea>(& 3.7.4<+code=spp_robe_oext" class="sref">wcpprobe_oext"ea>(22< 3.7.4 L125" class="line" namo> L525"> v25oea> The original LXR software by the 3.7.4LXR ommeuet"yea>, sthis experient"al version by 3.7.4loxr@ineux.noea>. oxr.ineux.no kindly hosed tby 3.7.4lRedpill Lnerob ASea>, srobvider of Lneux onstulting and penrticnst servicet sincev19o5.