core: added support for WS keyword for use in conditionals with proto and snd_proto
[sip-router] / ip_addr.h
index fd19c42..3e23633 100644 (file)
--- a/ip_addr.h
+++ b/ip_addr.h
@@ -52,8 +52,8 @@
 
 #include "dprint.h"
 
-enum sip_protos { PROTO_NONE, PROTO_UDP, PROTO_TCP, PROTO_TLS, PROTO_SCTP };
-#define PROTO_LAST PROTO_SCTP
+enum sip_protos { PROTO_NONE, PROTO_UDP, PROTO_TCP, PROTO_TLS, PROTO_SCTP, PROTO_OTHER, PROTO_WS /* Deliberately after PROTO_(OTHER|LAST) */ };
+#define PROTO_LAST PROTO_OTHER
 
 #ifdef USE_COMP
 enum comp_methods { COMP_NONE, COMP_SIGCOMP, COMP_SERGZ };
@@ -72,7 +72,7 @@ struct ip_addr{
        }u;
 };
 
-
+typedef struct ip_addr ip_addr_t;
 
 struct net{
        struct ip_addr ip;
@@ -102,6 +102,15 @@ struct addr_info{
        struct addr_info* prev;
 };
 
+struct advertise_info {
+       str name; /* name - eg.: foo.bar or 10.0.0.1 */
+       unsigned short port_no;  /* port number */
+       str port_no_str; /* port number converted to string -- optimization*/
+       str address_str;        /*ip address converted to string -- optimization*/
+       struct ip_addr address; /* ip address */
+       str sock_str; /* Socket proto, ip, and port as string */
+};
+
 struct socket_info{
        int socket;
        str name; /* name - eg.: foo.bar or 10.0.0.1 */
@@ -116,6 +125,9 @@ struct socket_info{
        char proto; /* tcp or udp*/
        str sock_str; /* Socket proto, ip, and port as string */
        struct addr_info* addr_info_lst; /* extra addresses (e.g. SCTP mh) */
+       int workers; /* number of worker processes for this socket */
+       int workers_tcpidx; /* index of workers in tcp children array */
+       struct advertise_info useinfo; /* details to be used in SIP msg */
 };
 
 
@@ -240,13 +252,21 @@ struct socket_id{
 
 
 
-struct net* mk_net(struct ip_addr* ip, struct ip_addr* mask);
-struct net* mk_net_bitlen(struct ip_addr* ip, unsigned int bitlen);
+struct net* mk_new_net(struct ip_addr* ip, struct ip_addr* mask);
+struct net* mk_new_net_bitlen(struct ip_addr* ip, unsigned int bitlen);
+int mk_net(struct net* n, struct ip_addr* ip, struct ip_addr* mask);
+int mk_net_bitlen(struct net* n, struct ip_addr* ip, unsigned int bitlen);
+int mk_net_str(struct net* dst, str* s);
 
 void print_ip(char* prefix, struct ip_addr* ip, char* suffix);
 void stdout_print_ip(struct ip_addr* ip);
 void print_net(struct net* net);
 
+char* get_proto_name(unsigned int proto);
+#define proto2a get_proto_name
+
+
+
 #ifdef USE_MCAST
 /* Returns 1 if the given address is a multicast address */
 int is_mcast(struct ip_addr* ip);
@@ -362,7 +382,8 @@ static inline void sockaddr2ip_addr(struct ip_addr* ip, struct sockaddr* sa)
 
 
 /* compare 2 sockaddr_unions */
-static inline int su_cmp(union sockaddr_union* s1, union sockaddr_union* s2)
+static inline int su_cmp(const union sockaddr_union* s1,
+                                                const union sockaddr_union* s2)
 {
        if (s1->s.sa_family!=s2->s.sa_family) return 0;
        switch(s1->s.sa_family){
@@ -384,7 +405,7 @@ static inline int su_cmp(union sockaddr_union* s1, union sockaddr_union* s2)
 
 
 /* gets the port number (host byte order) */
-static inline unsigned short su_getport(union sockaddr_union* su)
+static inline unsigned short su_getport(const union sockaddr_union* su)
 {
        switch(su->s.sa_family){
                case AF_INET:
@@ -714,7 +735,7 @@ static inline char* su2a(union sockaddr_union* su, int su_len)
 {
        static char buf[SU2A_MAX_STR_SIZE];
        int offs;
-       
+
 #ifdef USE_IPV6
        if (unlikely(su->s.sa_family==AF_INET6)){
                if (unlikely(su_len<sizeof(su->sin6)))
@@ -736,6 +757,34 @@ static inline char* su2a(union sockaddr_union* su, int su_len)
        return buf;
 }
 
+#define SUIP2A_MAX_STR_SIZE  (IP6_MAX_STR_SIZE + 2 /* [] */ + 1 /* \0 */)
+/* returns an asciiz string containing the ip
+ *  (<ipv4_addr> or [<ipv6_addr>])
+ */
+static inline char* suip2a(union sockaddr_union* su, int su_len)
+{
+       static char buf[SUIP2A_MAX_STR_SIZE];
+       int offs;
+
+#ifdef USE_IPV6
+       if (unlikely(su->s.sa_family==AF_INET6)){
+               if (unlikely(su_len<sizeof(su->sin6)))
+                       return "<addr. error>";
+               buf[0]='[';
+               offs=1+ip6tosbuf((unsigned char*)su->sin6.sin6_addr.s6_addr, &buf[1],
+                                                       sizeof(buf)-4);
+               buf[offs]=']';
+               offs++;
+       }else
+#endif /* USE_IPV6*/
+       if (unlikely(su_len<sizeof(su->sin)))
+               return "<addr. error>";
+       else
+               offs=ip4tosbuf((unsigned char*)&su->sin.sin_addr, buf, sizeof(buf)-2);
+       buf[offs]=0;
+       return buf;
+}
+
 
 
 /* converts an ip_addr structure to a hostent, returns pointer to internal
@@ -788,5 +837,10 @@ inline static void init_dst_from_rcv(struct dest_info* dst,
 #endif
 }
 
+/**
+ * match ip address with net address and bitmask
+ * - return 0 on match, -1 otherwise
+ */
+int ip_addr_match_net(ip_addr_t *iaddr, ip_addr_t *naddr, int mask);
 
 #endif