// IP tapset // // Copyright (C) 2009, IBM Inc. // Copyright (C) 2010, Red Hat Inc. // // Author : Breno Leitao // // This file is free software. You can redistribute it and/or modify it under // the terms of the GNU General Public License (GPL), version 2. // // Based on previous work done by Arnaldo Carvalho de Melo %{ #include %} /** * sfunction ip_ntop - returns a string representation from an integer IP number * @addr: the ip represented as an integer */ function ip_ntop:string (addr:long) %{ __be32 ip; ip = THIS->addr; snprintf(THIS->__retvalue, MAXSTRINGLEN, NIPQUAD_FMT, NIPQUAD(ip)); %} /* return the source IP address for a given sock */ function __ip_sock_saddr:long (sock:long) { return (@defined(@cast(sock, "inet_sock")->inet_saddr) ? @cast(sock, "inet_sock")->inet_saddr # kernel >= 2.6.33 : (@defined(@cast(sock, "inet_sock")->saddr) ? @cast(sock, "inet_sock", "kernel")->saddr # kernel >= 2.6.11 : @cast(sock, "inet_sock", "kernel")->inet->saddr)) } /* return the destination IP address for a given sock */ function __ip_sock_daddr:long (sock:long) { return (@defined(@cast(sock, "inet_sock")->inet_daddr) ? @cast(sock, "inet_sock")->inet_daddr # kernel >= 2.6.33 : (@defined(@cast(sock, "inet_sock")->daddr) ? @cast(sock, "inet_sock", "kernel")->daddr # kernel >= 2.6.11 : @cast(sock, "inet_sock", "kernel")->inet->daddr)) } /* Get the IP header for recent (> 2.6.21) kernels */ function __get_skb_iphdr_new:long(skb:long) %{ /* pure */ struct sk_buff *skb; skb = (struct sk_buff *)(long)THIS->skb; /* as done by skb_network_header() */ #ifdef NET_SKBUFF_DATA_USES_OFFSET THIS->__retvalue = (long)(kread(&(skb->head)) + kread(&(skb->network_header))); #else THIS->__retvalue = (long)kread(&(skb->network_header)); #endif CATCH_DEREF_FAULT(); %} /* Get the IP header from a sk_buff struct */ function __get_skb_iphdr:long(skb:long){ %( kernel_v < "2.6.21" %? iphdr = @cast(skb, "sk_buff")->nh->raw return iphdr %: return __get_skb_iphdr_new(skb) %) } /* return the source next layer protocol for a given sk_buff structure */ function __ip_skb_proto:long (iphdr) { return @cast(iphdr, "iphdr")->protocol } /* return the source IP address for a given sk_buff structure */ function __ip_skb_saddr:long (iphdr) { return @cast(iphdr, "iphdr")->saddr } /* return the destination IP address for a given skb */ function __ip_skb_daddr:long (iphdr) { return @cast(iphdr, "iphdr")->daddr }