<p>Michael Bradeen has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.asterisk.org/c/asterisk/+/19565">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">res_pktccops: Remove deprecated module.<br><br>ASTERISK-30301<br><br>Change-Id: I2dd4e804be9d14efaf0fd655abdddbb1a13f1c9d<br>---<br>M channels/chan_mgcp.c<br>D configs/samples/res_pktccops.conf.sample<br>M configure<br>M configure.ac<br>A doc/UPGRADE-staging/res_pktccops_removal.txt<br>D include/asterisk/pktccops.h<br>M main/asterisk.dynamics<br>D res/res_pktccops.c<br>D res/res_pktccops.exports.in<br>M tests/CI/buildAsterisk.sh<br>10 files changed, 20 insertions(+), 1,732 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/65/19565/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/channels/chan_mgcp.c b/channels/chan_mgcp.c</span><br><span>index b2f1e57..6825002 100644</span><br><span>--- a/channels/chan_mgcp.c</span><br><span>+++ b/channels/chan_mgcp.c</span><br><span>@@ -34,7 +34,6 @@</span><br><span>  */</span><br><span> </span><br><span> /*** MODULEINFO</span><br><span style="color: hsl(0, 100%, 40%);">-        <use type="module">res_pktccops</use></span><br><span>    <defaultenabled>no</defaultenabled></span><br><span>      <support_level>deprecated</support_level></span><br><span>        <deprecated_in>19</deprecated_in></span><br><span>@@ -81,7 +80,6 @@</span><br><span> #include "asterisk/stringfields.h"</span><br><span> #include "asterisk/abstract_jb.h"</span><br><span> #include "asterisk/chanvars.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk/pktccops.h"</span><br><span> #include "asterisk/stasis.h"</span><br><span> #include "asterisk/bridge.h"</span><br><span> #include "asterisk/features_config.h"</span><br><span>@@ -931,20 +929,6 @@</span><br><span> </span><br><span>       mgcp_set_owner(sub, NULL);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  /* for deleting gate */</span><br><span style="color: hsl(0, 100%, 40%);">- if (p->pktcgatealloc && sub->gate) {</span><br><span style="color: hsl(0, 100%, 40%);">-              sub->gate->gate_open = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-              sub->gate->gate_remove = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-            sub->gate->got_dq_gi = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-              sub->gate->tech_pvt = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-               if (sub->gate->state == GATE_ALLOC_PROGRESS || sub->gate->state == GATE_ALLOCATED) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        ast_pktccops_gate_alloc(GATE_DEL, sub->gate, 0, 0, 0, 0, 0, 0, NULL, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-          } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        sub->gate->deltimer = time(NULL) + 5;</span><br><span style="color: hsl(0, 100%, 40%);">-             }</span><br><span style="color: hsl(0, 100%, 40%);">-               sub->gate = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>    if (!ast_strlen_zero(sub->cxident)) {</span><br><span>             transmit_connection_del(sub);</span><br><span>        }</span><br><span>@@ -2413,16 +2397,7 @@</span><br><span> </span><br><span> static int mgcp_alloc_pktcgate(struct mgcp_subchannel *sub)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      struct mgcp_endpoint *p = sub->parent;</span><br><span style="color: hsl(0, 100%, 40%);">-       sub->gate = ast_pktccops_gate_alloc(GATE_SET, NULL, ntohl(p->parent->addr.sin_addr.s_addr),</span><br><span style="color: hsl(0, 100%, 40%);">-                                    8, 128000, 232, 0, 0, NULL, &mgcp_pktcgate_remove);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (!sub->gate) {</span><br><span style="color: hsl(0, 100%, 40%);">-            return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-       sub->gate->tech_pvt = sub;</span><br><span style="color: hsl(0, 100%, 40%);">-        sub->gate->gate_open = &mgcp_pktcgate_open;</span><br><span style="color: hsl(0, 100%, 40%);">-   return 1;</span><br><span style="color: hsl(120, 100%, 40%);">+     return 0;</span><br><span> }</span><br><span> </span><br><span> static int transmit_connect(struct mgcp_subchannel *sub)</span><br><span>@@ -5005,5 +4980,4 @@</span><br><span>       .unload = unload_module,</span><br><span>     .reload = reload,</span><br><span>    .load_pri = AST_MODPRI_CHANNEL_DRIVER,</span><br><span style="color: hsl(0, 100%, 40%);">-  .optional_modules = "res_pktccops",</span><br><span> );</span><br><span>diff --git a/configs/samples/res_pktccops.conf.sample b/configs/samples/res_pktccops.conf.sample</span><br><span>deleted file mode 100644</span><br><span>index 769508d..0000000</span><br><span>--- a/configs/samples/res_pktccops.conf.sample</span><br><span>+++ /dev/null</span><br><span>@@ -1,32 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-;; Sample res_pktccops.conf</span><br><span style="color: hsl(0, 100%, 40%);">-;</span><br><span style="color: hsl(0, 100%, 40%);">-;[general]</span><br><span style="color: hsl(0, 100%, 40%);">-;gateinfoperiod => 60 ; default 60s</span><br><span style="color: hsl(0, 100%, 40%);">-;gatetimeout = 150 ; default 150</span><br><span style="color: hsl(0, 100%, 40%);">-;t1 => 250 ; default 250s</span><br><span style="color: hsl(0, 100%, 40%);">-;t7 => 200 ; default 200s</span><br><span style="color: hsl(0, 100%, 40%);">-;t8 => 300 ; default 300s</span><br><span style="color: hsl(0, 100%, 40%);">-;keepalive => 60 ; default 60s</span><br><span style="color: hsl(0, 100%, 40%);">-;</span><br><span style="color: hsl(0, 100%, 40%);">-;[teszt]</span><br><span style="color: hsl(0, 100%, 40%);">-;host => 192.168.0.24</span><br><span style="color: hsl(0, 100%, 40%);">-;pool => 10.0.1.0 10.0.1.255</span><br><span style="color: hsl(0, 100%, 40%);">-;pool => 10.0.3.0 10.0.3.255</span><br><span style="color: hsl(0, 100%, 40%);">-;pool => 10.0.7.0 10.0.8.255</span><br><span style="color: hsl(0, 100%, 40%);">-;pool => 10.0.10.0 10.0.11.255</span><br><span style="color: hsl(0, 100%, 40%);">-;</span><br><span style="color: hsl(0, 100%, 40%);">-;[general]</span><br><span style="color: hsl(0, 100%, 40%);">-;gateinfoperiod => 60 ; default 60s</span><br><span style="color: hsl(0, 100%, 40%);">-;gatetimeout = 150 ; default 150</span><br><span style="color: hsl(0, 100%, 40%);">-;t1 => 250 ; default 250s</span><br><span style="color: hsl(0, 100%, 40%);">-;t7 => 200 ; default 200s</span><br><span style="color: hsl(0, 100%, 40%);">-;t8 => 300 ; default 300s</span><br><span style="color: hsl(0, 100%, 40%);">-;keepalive => 60 ; default 60s</span><br><span style="color: hsl(0, 100%, 40%);">-;</span><br><span style="color: hsl(0, 100%, 40%);">-;[test]</span><br><span style="color: hsl(0, 100%, 40%);">-;host => 192.168.0.24</span><br><span style="color: hsl(0, 100%, 40%);">-;pool => 10.0.1.0 10.0.1.255</span><br><span style="color: hsl(0, 100%, 40%);">-;pool => 10.0.3.0 10.0.3.255</span><br><span style="color: hsl(0, 100%, 40%);">-;pool => 10.0.7.0 10.0.8.255</span><br><span style="color: hsl(0, 100%, 40%);">-;pool => 10.0.10.0 10.0.11.255</span><br><span style="color: hsl(0, 100%, 40%);">-;</span><br><span>diff --git a/configure b/configure</span><br><span>index 168d791..531e86c 100755</span><br><span>--- a/configure</span><br><span>+++ b/configure</span><br><span>@@ -34950,100 +34950,6 @@</span><br><span> fi</span><br><span> </span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-# Used in res/res_pktccops</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    if test "x${PBX_MSG_NOSIGNAL}" != "x1"; then</span><br><span style="color: hsl(0, 100%, 40%);">-    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for MSG_NOSIGNAL in sys/socket.h" >&5</span><br><span style="color: hsl(0, 100%, 40%);">-printf %s "checking for MSG_NOSIGNAL in sys/socket.h... " >&6; }</span><br><span style="color: hsl(0, 100%, 40%);">-        saved_cppflags="${CPPFLAGS}"</span><br><span style="color: hsl(0, 100%, 40%);">-  if test "x${MSG_NOSIGNAL_DIR}" != "x"; then</span><br><span style="color: hsl(0, 100%, 40%);">-     MSG_NOSIGNAL_INCLUDE="-I${MSG_NOSIGNAL_DIR}/include"</span><br><span style="color: hsl(0, 100%, 40%);">-      fi</span><br><span style="color: hsl(0, 100%, 40%);">-      CPPFLAGS="${CPPFLAGS} ${MSG_NOSIGNAL_INCLUDE}"</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        cat confdefs.h - <<_ACEOF >conftest.$ac_ext</span><br><span style="color: hsl(0, 100%, 40%);">-/* end confdefs.h.  */</span><br><span style="color: hsl(0, 100%, 40%);">- #include <sys/socket.h></span><br><span style="color: hsl(0, 100%, 40%);">-int</span><br><span style="color: hsl(0, 100%, 40%);">-main (void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-#if defined(MSG_NOSIGNAL)</span><br><span style="color: hsl(0, 100%, 40%);">-                                int foo = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                            #else</span><br><span style="color: hsl(0, 100%, 40%);">-                           int foo = bar;</span><br><span style="color: hsl(0, 100%, 40%);">-                          #endif</span><br><span style="color: hsl(0, 100%, 40%);">-                          0</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  ;</span><br><span style="color: hsl(0, 100%, 40%);">-  return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-_ACEOF</span><br><span style="color: hsl(0, 100%, 40%);">-if ac_fn_c_try_compile "$LINENO"</span><br><span style="color: hsl(0, 100%, 40%);">-then :</span><br><span style="color: hsl(0, 100%, 40%);">-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5</span><br><span style="color: hsl(0, 100%, 40%);">-printf "%s\n" "yes" >&6; }</span><br><span style="color: hsl(0, 100%, 40%);">-               PBX_MSG_NOSIGNAL=1</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-printf "%s\n" "#define HAVE_MSG_NOSIGNAL 1" >>confdefs.h</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-else $as_nop</span><br><span style="color: hsl(0, 100%, 40%);">-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5</span><br><span style="color: hsl(0, 100%, 40%);">-printf "%s\n" "no" >&6; }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-fi</span><br><span style="color: hsl(0, 100%, 40%);">-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext</span><br><span style="color: hsl(0, 100%, 40%);">-   CPPFLAGS="${saved_cppflags}"</span><br><span style="color: hsl(0, 100%, 40%);">-    fi</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    if test "x${PBX_SO_NOSIGPIPE}" != "x1"; then</span><br><span style="color: hsl(0, 100%, 40%);">-        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for SO_NOSIGPIPE in sys/socket.h" >&5</span><br><span style="color: hsl(0, 100%, 40%);">-printf %s "checking for SO_NOSIGPIPE in sys/socket.h... " >&6; }</span><br><span style="color: hsl(0, 100%, 40%);">-        saved_cppflags="${CPPFLAGS}"</span><br><span style="color: hsl(0, 100%, 40%);">-  if test "x${SO_NOSIGPIPE_DIR}" != "x"; then</span><br><span style="color: hsl(0, 100%, 40%);">-     SO_NOSIGPIPE_INCLUDE="-I${SO_NOSIGPIPE_DIR}/include"</span><br><span style="color: hsl(0, 100%, 40%);">-      fi</span><br><span style="color: hsl(0, 100%, 40%);">-      CPPFLAGS="${CPPFLAGS} ${SO_NOSIGPIPE_INCLUDE}"</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        cat confdefs.h - <<_ACEOF >conftest.$ac_ext</span><br><span style="color: hsl(0, 100%, 40%);">-/* end confdefs.h.  */</span><br><span style="color: hsl(0, 100%, 40%);">- #include <sys/socket.h></span><br><span style="color: hsl(0, 100%, 40%);">-int</span><br><span style="color: hsl(0, 100%, 40%);">-main (void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-#if defined(SO_NOSIGPIPE)</span><br><span style="color: hsl(0, 100%, 40%);">-                                int foo = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                            #else</span><br><span style="color: hsl(0, 100%, 40%);">-                           int foo = bar;</span><br><span style="color: hsl(0, 100%, 40%);">-                          #endif</span><br><span style="color: hsl(0, 100%, 40%);">-                          0</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  ;</span><br><span style="color: hsl(0, 100%, 40%);">-  return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-_ACEOF</span><br><span style="color: hsl(0, 100%, 40%);">-if ac_fn_c_try_compile "$LINENO"</span><br><span style="color: hsl(0, 100%, 40%);">-then :</span><br><span style="color: hsl(0, 100%, 40%);">-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5</span><br><span style="color: hsl(0, 100%, 40%);">-printf "%s\n" "yes" >&6; }</span><br><span style="color: hsl(0, 100%, 40%);">-               PBX_SO_NOSIGPIPE=1</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-printf "%s\n" "#define HAVE_SO_NOSIGPIPE 1" >>confdefs.h</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-else $as_nop</span><br><span style="color: hsl(0, 100%, 40%);">-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5</span><br><span style="color: hsl(0, 100%, 40%);">-printf "%s\n" "no" >&6; }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-fi</span><br><span style="color: hsl(0, 100%, 40%);">-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext</span><br><span style="color: hsl(0, 100%, 40%);">-   CPPFLAGS="${saved_cppflags}"</span><br><span style="color: hsl(0, 100%, 40%);">-    fi</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> </span><br><span> </span><br><span> </span><br><span>diff --git a/configure.ac b/configure.ac</span><br><span>index b7a206d..9b65e7e 100644</span><br><span>--- a/configure.ac</span><br><span>+++ b/configure.ac</span><br><span>@@ -2792,9 +2792,6 @@</span><br><span> AC_CHECK_HEADER([linux/compiler.h],</span><br><span>                 [AC_DEFINE_UNQUOTED([HAVE_LINUX_COMPILER_H], 1, [Define to 1 if your system has linux/compiler.h.])])</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-# Used in res/res_pktccops</span><br><span style="color: hsl(0, 100%, 40%);">-AST_C_DEFINE_CHECK([MSG_NOSIGNAL], [MSG_NOSIGNAL], [sys/socket.h])</span><br><span style="color: hsl(0, 100%, 40%);">-AST_C_DEFINE_CHECK([SO_NOSIGPIPE], [SO_NOSIGPIPE], [sys/socket.h])</span><br><span> </span><br><span> AST_EXT_TOOL_CHECK([SDL], [sdl-config])</span><br><span> AST_EXT_LIB_CHECK([SDL_IMAGE], [SDL_image], [IMG_Load], [SDL_image.h], [${SDL_LIB}], [${SDL_INCLUDE}])</span><br><span>diff --git a/doc/UPGRADE-staging/res_pktccops_removal.txt b/doc/UPGRADE-staging/res_pktccops_removal.txt</span><br><span>new file mode 100644</span><br><span>index 0000000..2279d6f</span><br><span>--- /dev/null</span><br><span>+++ b/doc/UPGRADE-staging/res_pktccops_removal.txt</span><br><span>@@ -0,0 +1,7 @@</span><br><span style="color: hsl(120, 100%, 40%);">+Subject: res_pktccops</span><br><span style="color: hsl(120, 100%, 40%);">+Master-Only: True</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+This module was deprecated in Asterisk 19</span><br><span style="color: hsl(120, 100%, 40%);">+and is now being removed in accordance with</span><br><span style="color: hsl(120, 100%, 40%);">+the Asterisk Module Deprecation policy.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/include/asterisk/pktccops.h b/include/asterisk/pktccops.h</span><br><span>deleted file mode 100644</span><br><span>index 14c71b4..0000000</span><br><span>--- a/include/asterisk/pktccops.h</span><br><span>+++ /dev/null</span><br><span>@@ -1,82 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-/*</span><br><span style="color: hsl(0, 100%, 40%);">- * Asterisk -- An open source telephony toolkit.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * Copyright (C) 2009, Attila Domjan</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * Attila Domjan <attila.domjan.hu@gmail.com></span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * See http://www.asterisk.org for more information about</span><br><span style="color: hsl(0, 100%, 40%);">- * the Asterisk project. Please do not directly contact</span><br><span style="color: hsl(0, 100%, 40%);">- * any of the maintainers of this project for assistance;</span><br><span style="color: hsl(0, 100%, 40%);">- * the project provides a web site, mailing lists and IRC</span><br><span style="color: hsl(0, 100%, 40%);">- * channels for your use.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is free software, distributed under the terms of</span><br><span style="color: hsl(0, 100%, 40%);">- * the GNU General Public License Version 2. See the LICENSE file</span><br><span style="color: hsl(0, 100%, 40%);">- * at the top of the source tree.</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*! \file</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * \brief PacketCable COPS</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * \author Attila Domjan <attila.domjan.hu@gmail.com></span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#ifndef _ASTERISK_PKTCCOPS_H</span><br><span style="color: hsl(0, 100%, 40%);">-#define _ASTERISK_PKTCCOPS_H</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk/optional_api.h"</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#if defined(__cplusplus) || defined(c_plusplus)</span><br><span style="color: hsl(0, 100%, 40%);">-extern "C" {</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-enum {</span><br><span style="color: hsl(0, 100%, 40%);">-        GATE_SET,</span><br><span style="color: hsl(0, 100%, 40%);">-       GATE_INFO,</span><br><span style="color: hsl(0, 100%, 40%);">-      GATE_SET_HAVE_GATEID,</span><br><span style="color: hsl(0, 100%, 40%);">-   GATE_DEL</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-enum {</span><br><span style="color: hsl(0, 100%, 40%);">-        GATE_ALLOC_FAILED,</span><br><span style="color: hsl(0, 100%, 40%);">-      GATE_ALLOC_PROGRESS,</span><br><span style="color: hsl(0, 100%, 40%);">-    GATE_ALLOCATED,</span><br><span style="color: hsl(0, 100%, 40%);">- GATE_CLOSED,</span><br><span style="color: hsl(0, 100%, 40%);">-    GATE_CLOSED_ERR,</span><br><span style="color: hsl(0, 100%, 40%);">-        GATE_OPEN,</span><br><span style="color: hsl(0, 100%, 40%);">-      GATE_DELETED,</span><br><span style="color: hsl(0, 100%, 40%);">-   GATE_TIMEOUT</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct cops_gate {</span><br><span style="color: hsl(0, 100%, 40%);">-        AST_LIST_ENTRY(cops_gate) list;</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t gateid;</span><br><span style="color: hsl(0, 100%, 40%);">-        uint16_t trid;</span><br><span style="color: hsl(0, 100%, 40%);">-  time_t in_transaction;</span><br><span style="color: hsl(0, 100%, 40%);">-  uint32_t mta;</span><br><span style="color: hsl(0, 100%, 40%);">-   int state;</span><br><span style="color: hsl(0, 100%, 40%);">-      time_t allocated;</span><br><span style="color: hsl(0, 100%, 40%);">-       time_t checked;</span><br><span style="color: hsl(0, 100%, 40%);">- time_t deltimer;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct cops_cmts *cmts;</span><br><span style="color: hsl(0, 100%, 40%);">- int (* got_dq_gi) (struct cops_gate *gate);</span><br><span style="color: hsl(0, 100%, 40%);">-     int (* gate_remove) (struct cops_gate *gate);</span><br><span style="color: hsl(0, 100%, 40%);">-   int (* gate_open) (struct cops_gate *gate);</span><br><span style="color: hsl(0, 100%, 40%);">-     void *tech_pvt;</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AST_OPTIONAL_API(struct cops_gate *, ast_pktccops_gate_alloc,</span><br><span style="color: hsl(0, 100%, 40%);">-  (int cmd,  struct cops_gate *gate, uint32_t mta, uint32_t actcount,</span><br><span style="color: hsl(0, 100%, 40%);">-      float bitrate, uint32_t psize, uint32_t ssip, uint16_t ssport,</span><br><span style="color: hsl(0, 100%, 40%);">-  int (* const got_dq_gi) (struct cops_gate *gate),</span><br><span style="color: hsl(0, 100%, 40%);">-       int (* const gate_remove) (struct cops_gate *gate)),</span><br><span style="color: hsl(0, 100%, 40%);">-   { return NULL; });</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#if defined(__cplusplus) || defined(c_plusplus)</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#endif /* _ASTERISK_PKTCCOPS_H */</span><br><span>diff --git a/main/asterisk.dynamics b/main/asterisk.dynamics</span><br><span>index 1c4b1b1..a134e2a 100644</span><br><span>--- a/main/asterisk.dynamics</span><br><span>+++ b/main/asterisk.dynamics</span><br><span>@@ -2,7 +2,6 @@</span><br><span>     *ast_adsi_*;</span><br><span>         *ast_agi_*;</span><br><span>  *ast_beep_*;</span><br><span style="color: hsl(0, 100%, 40%);">-    *ast_pktccops_*;</span><br><span>     *ast_smdi_*;</span><br><span>         *ast_monitor_*;</span><br><span>      *ast_key_get;</span><br><span>diff --git a/res/res_pktccops.c b/res/res_pktccops.c</span><br><span>deleted file mode 100644</span><br><span>index 6b6ad33..0000000</span><br><span>--- a/res/res_pktccops.c</span><br><span>+++ /dev/null</span><br><span>@@ -1,1486 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-/*</span><br><span style="color: hsl(0, 100%, 40%);">- * Asterisk -- An open source telephony toolkit.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * Copyright (C) 2009, Attila Domjan</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * Attila Domjan <attila.domjan.hu@gmail.com></span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * See http://www.asterisk.org for more information about</span><br><span style="color: hsl(0, 100%, 40%);">- * the Asterisk project. Please do not directly contact</span><br><span style="color: hsl(0, 100%, 40%);">- * any of the maintainers of this project for assistance;</span><br><span style="color: hsl(0, 100%, 40%);">- * the project provides a web site, mailing lists and IRC</span><br><span style="color: hsl(0, 100%, 40%);">- * channels for your use.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is free software, distributed under the terms of</span><br><span style="color: hsl(0, 100%, 40%);">- * the GNU General Public License Version 2. See the LICENSE file</span><br><span style="color: hsl(0, 100%, 40%);">- * at the top of the source tree.</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*!\file</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * \brief PacketCable COPS</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * \author Attila Domjan <attila.domjan.hu@gmail.com></span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * \note</span><br><span style="color: hsl(0, 100%, 40%);">- * This module is an add-on to chan_mgcp. It adds support for the</span><br><span style="color: hsl(0, 100%, 40%);">- * PacketCable MGCP variation called NCS. Res_pktccops implements COPS</span><br><span style="color: hsl(0, 100%, 40%);">- * (RFC 2748), a protocol used to manage dynamic bandwith allocation in</span><br><span style="color: hsl(0, 100%, 40%);">- * CMTS's (HFC gateways). When you use NCS, you need to talk COPS with</span><br><span style="color: hsl(0, 100%, 40%);">- * the CMTS to complete the calls.</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*** MODULEINFO</span><br><span style="color: hsl(0, 100%, 40%);">-        <defaultenabled>no</defaultenabled></span><br><span style="color: hsl(0, 100%, 40%);">- <support_level>deprecated</support_level></span><br><span style="color: hsl(0, 100%, 40%);">-   <deprecated_in>19</deprecated_in></span><br><span style="color: hsl(0, 100%, 40%);">-   <removed_in>21</removed_in></span><br><span style="color: hsl(0, 100%, 40%);">- ***/</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk.h"</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <sys/types.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <sys/socket.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <fcntl.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <netdb.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdio.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdlib.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <unistd.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <string.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <time.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <errno.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <arpa/inet.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <signal.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk/file.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk/logger.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk/channel.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk/config.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk/options.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk/pbx.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk/module.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk/cli.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk/lock.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#define AST_API_MODULE</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk/pktccops.h"</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#define DEFAULT_COPS_PORT "2126"</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#define COPS_HEADER_SIZE 8</span><br><span style="color: hsl(0, 100%, 40%);">-#define COPS_OBJECT_HEADER_SIZE 4</span><br><span style="color: hsl(0, 100%, 40%);">-#define GATE_SET_OBJ_SIZE 144</span><br><span style="color: hsl(0, 100%, 40%);">-#define GATEID_OBJ_SIZE 8</span><br><span style="color: hsl(0, 100%, 40%);">-#define GATE_INFO_OBJ_SIZE 24</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#define PKTCCOPS_SCOMMAND_GATE_ALLOC 1</span><br><span style="color: hsl(0, 100%, 40%);">-#define PKTCCOPS_SCOMMAND_GATE_ALLOC_ACK 2</span><br><span style="color: hsl(0, 100%, 40%);">-#define PKTCCOPS_SCOMMAND_GATE_ALLOC_ERR 3</span><br><span style="color: hsl(0, 100%, 40%);">-#define PKTCCOPS_SCOMMAND_GATE_SET 4</span><br><span style="color: hsl(0, 100%, 40%);">-#define PKTCCOPS_SCOMMAND_GATE_SET_ACK 5</span><br><span style="color: hsl(0, 100%, 40%);">-#define PKTCCOPS_SCOMMAND_GATE_SET_ERR 6</span><br><span style="color: hsl(0, 100%, 40%);">-#define PKTCCOPS_SCOMMAND_GATE_INFO 7</span><br><span style="color: hsl(0, 100%, 40%);">-#define PKTCCOPS_SCOMMAND_GATE_INFO_ACK 8</span><br><span style="color: hsl(0, 100%, 40%);">-#define PKTCCOPS_SCOMMAND_GATE_INFO_ERR 9</span><br><span style="color: hsl(0, 100%, 40%);">-#define PKTCCOPS_SCOMMAND_GATE_DELETE 10</span><br><span style="color: hsl(0, 100%, 40%);">-#define PKTCCOPS_SCOMMAND_GATE_DELETE_ACK 11</span><br><span style="color: hsl(0, 100%, 40%);">-#define PKTCCOPS_SCOMMAND_GATE_DELETE_ERR 12</span><br><span style="color: hsl(0, 100%, 40%);">-#define PKTCCOPS_SCOMMAND_GATE_OPEN 13</span><br><span style="color: hsl(0, 100%, 40%);">-#define PKTCCOPS_SCOMMAND_GATE_CLOSE 14</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AST_MUTEX_DEFINE_STATIC(pktccops_lock);</span><br><span style="color: hsl(0, 100%, 40%);">-static pthread_t pktccops_thread = AST_PTHREADT_NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-static uint16_t cops_trid = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct pktcobj {</span><br><span style="color: hsl(0, 100%, 40%);">-     uint16_t length;</span><br><span style="color: hsl(0, 100%, 40%);">-        unsigned char cnum;</span><br><span style="color: hsl(0, 100%, 40%);">-     unsigned char ctype;</span><br><span style="color: hsl(0, 100%, 40%);">-    char *contents;</span><br><span style="color: hsl(0, 100%, 40%);">- struct pktcobj *next;</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct copsmsg {</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char verflag;</span><br><span style="color: hsl(0, 100%, 40%);">-  unsigned char opcode;</span><br><span style="color: hsl(0, 100%, 40%);">-   uint16_t clienttype;</span><br><span style="color: hsl(0, 100%, 40%);">-    uint32_t length;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct pktcobj *object;</span><br><span style="color: hsl(0, 100%, 40%);">- char *msg; /* != NULL if not packet cable message received */</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct gatespec {</span><br><span style="color: hsl(0, 100%, 40%);">-        int direction; /* 0-DS, 1-US */</span><br><span style="color: hsl(0, 100%, 40%);">- int protocolid;</span><br><span style="color: hsl(0, 100%, 40%);">- int flags; /* 0x00 */</span><br><span style="color: hsl(0, 100%, 40%);">-   int sessionclass; /* normal voip: 0x01, high priority voip: 0x02, unspecified: 0x00 */</span><br><span style="color: hsl(0, 100%, 40%);">-  uint32_t srcip;</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t dstip;</span><br><span style="color: hsl(0, 100%, 40%);">- uint16_t srcp;</span><br><span style="color: hsl(0, 100%, 40%);">-  uint16_t dstp;</span><br><span style="color: hsl(0, 100%, 40%);">-  int diffserv;</span><br><span style="color: hsl(0, 100%, 40%);">-   uint16_t t1;</span><br><span style="color: hsl(0, 100%, 40%);">-    uint16_t t7;</span><br><span style="color: hsl(0, 100%, 40%);">-    uint16_t t8;</span><br><span style="color: hsl(0, 100%, 40%);">-    uint32_t r; /* Token Bucket Rate */</span><br><span style="color: hsl(0, 100%, 40%);">-     uint32_t b; /* token Bucket Size */</span><br><span style="color: hsl(0, 100%, 40%);">-     uint32_t p; /* Peak Data Rate */</span><br><span style="color: hsl(0, 100%, 40%);">-        uint32_t m; /* Minimum Policed Size*/</span><br><span style="color: hsl(0, 100%, 40%);">-   uint32_t mm; /* Maximum Policed Size */</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t rate;</span><br><span style="color: hsl(0, 100%, 40%);">-  uint32_t s; /* Allowable Jitter*/</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct cops_cmts {</span><br><span style="color: hsl(0, 100%, 40%);">-   AST_LIST_ENTRY(cops_cmts) list;</span><br><span style="color: hsl(0, 100%, 40%);">- char name[80];</span><br><span style="color: hsl(0, 100%, 40%);">-  char host[80];</span><br><span style="color: hsl(0, 100%, 40%);">-  char port[80];</span><br><span style="color: hsl(0, 100%, 40%);">-  uint16_t t1;</span><br><span style="color: hsl(0, 100%, 40%);">-    uint16_t t7;</span><br><span style="color: hsl(0, 100%, 40%);">-    uint16_t t8;</span><br><span style="color: hsl(0, 100%, 40%);">-    uint32_t keepalive;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     uint32_t handle;</span><br><span style="color: hsl(0, 100%, 40%);">-        int state;</span><br><span style="color: hsl(0, 100%, 40%);">-      time_t contime;</span><br><span style="color: hsl(0, 100%, 40%);">- time_t katimer;</span><br><span style="color: hsl(0, 100%, 40%);">- int sfd;</span><br><span style="color: hsl(0, 100%, 40%);">-        int need_delete;</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct cops_ippool {</span><br><span style="color: hsl(0, 100%, 40%);">-  AST_LIST_ENTRY(cops_ippool) list;</span><br><span style="color: hsl(0, 100%, 40%);">-       uint32_t start;</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t stop;</span><br><span style="color: hsl(0, 100%, 40%);">-  struct cops_cmts *cmts;</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static uint16_t t1 = 250;</span><br><span style="color: hsl(0, 100%, 40%);">-static uint16_t t7 = 200;</span><br><span style="color: hsl(0, 100%, 40%);">-static uint16_t t8 = 300;</span><br><span style="color: hsl(0, 100%, 40%);">-static uint32_t keepalive = 60;</span><br><span style="color: hsl(0, 100%, 40%);">-static int pktcreload = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-static int gateinfoperiod = 60;</span><br><span style="color: hsl(0, 100%, 40%);">-static int gatetimeout = 150;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AST_LIST_HEAD_STATIC(cmts_list, cops_cmts);</span><br><span style="color: hsl(0, 100%, 40%);">-AST_LIST_HEAD_STATIC(ippool_list, cops_ippool);</span><br><span style="color: hsl(0, 100%, 40%);">-AST_LIST_HEAD_STATIC(gate_list, cops_gate);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int pktccops_add_ippool(struct cops_ippool *ippool);</span><br><span style="color: hsl(0, 100%, 40%);">-static struct cops_gate *cops_gate_cmd(int cmd, struct cops_cmts *cmts, uint16_t trid, uint32_t mta, uint32_t actcount, float bitrate, uint32_t psize, uint32_t ssip, uint16_t ssport, struct cops_gate *gate);</span><br><span style="color: hsl(0, 100%, 40%);">-static void pktccops_unregister_ippools(void);</span><br><span style="color: hsl(0, 100%, 40%);">-static int load_pktccops_config(void);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static uint32_t ftoieeef(float n)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  uint32_t res;</span><br><span style="color: hsl(0, 100%, 40%);">-   memcpy(&res, &n, 4);</span><br><span style="color: hsl(0, 100%, 40%);">-    return htonl(res);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static uint16_t cops_constructgatespec(struct gatespec *gs, char *res)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      if (res == NULL) {</span><br><span style="color: hsl(0, 100%, 40%);">-              return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       *res = (char) gs->direction;</span><br><span style="color: hsl(0, 100%, 40%);">- *(res + 1) = (char) gs->protocolid;</span><br><span style="color: hsl(0, 100%, 40%);">-  *(res + 2) = (char) gs->flags;</span><br><span style="color: hsl(0, 100%, 40%);">-       *(res + 3) = (char) gs->sessionclass;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        *((uint32_t *) (res + 4)) = gs->srcip;</span><br><span style="color: hsl(0, 100%, 40%);">-       *((uint32_t *) (res + 8)) = gs->dstip;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       *((uint16_t *) (res + 12)) = gs->srcp;</span><br><span style="color: hsl(0, 100%, 40%);">-       *((uint16_t *) (res + 14)) = gs->dstp;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       *(res + 16) = (char) gs->diffserv;</span><br><span style="color: hsl(0, 100%, 40%);">-   *(res + 17) = 0; /* reserved */</span><br><span style="color: hsl(0, 100%, 40%);">- *(res + 18) = 0; /* reserved */</span><br><span style="color: hsl(0, 100%, 40%);">- *(res + 19) = 0; /* reserved */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- *((uint16_t *) (res + 20)) = gs->t1;</span><br><span style="color: hsl(0, 100%, 40%);">- *(res + 22) = 0; /* reserved */</span><br><span style="color: hsl(0, 100%, 40%);">- *(res + 23) = 0; /* reserved */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- *((uint16_t *) (res + 24)) = gs->t7;</span><br><span style="color: hsl(0, 100%, 40%);">- *((uint16_t *) (res + 26)) = gs->t8;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- *((uint32_t *) (res + 28)) = gs->r;</span><br><span style="color: hsl(0, 100%, 40%);">-  *((uint32_t *) (res + 32)) = gs->b;</span><br><span style="color: hsl(0, 100%, 40%);">-  *((uint32_t *) (res + 36)) = gs->p;</span><br><span style="color: hsl(0, 100%, 40%);">-  *((uint32_t *) (res + 40)) = gs->m;</span><br><span style="color: hsl(0, 100%, 40%);">-  *((uint32_t *) (res + 44)) = gs->mm;</span><br><span style="color: hsl(0, 100%, 40%);">- *((uint32_t *) (res + 48)) = gs->rate;</span><br><span style="color: hsl(0, 100%, 40%);">-       *((uint32_t *) (res + 52)) = gs->s;</span><br><span style="color: hsl(0, 100%, 40%);">-  return 56; /* length */</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static uint16_t cops_construct_gate (int cmd, char *p,  uint16_t trid,</span><br><span style="color: hsl(0, 100%, 40%);">-         uint32_t mtahost, uint32_t actcount, float rate, uint32_t psizegateid,</span><br><span style="color: hsl(0, 100%, 40%);">-          uint32_t ssip, uint16_t ssport, uint32_t gateid, struct cops_cmts *cmts)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       struct gatespec gs;</span><br><span style="color: hsl(0, 100%, 40%);">-     int offset = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- ast_debug(3, "CMD: %d\n", cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Transaction Identifier 8 octets */</span><br><span style="color: hsl(0, 100%, 40%);">-   *(p + offset++) = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-    *(p + offset++) = 8; /* length */</span><br><span style="color: hsl(0, 100%, 40%);">-       *(p + offset++) = 1; /* snum */</span><br><span style="color: hsl(0, 100%, 40%);">- *(p + offset++) = 1; /* stype */</span><br><span style="color: hsl(0, 100%, 40%);">-        *((uint16_t *) (p + offset)) = htons(trid);</span><br><span style="color: hsl(0, 100%, 40%);">-     offset += 2;</span><br><span style="color: hsl(0, 100%, 40%);">-    *(p + offset++) = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-    *(p + offset++) = (cmd == GATE_DEL) ? PKTCCOPS_SCOMMAND_GATE_DELETE : (cmd != GATE_INFO) ? PKTCCOPS_SCOMMAND_GATE_SET : PKTCCOPS_SCOMMAND_GATE_INFO; /* 4: GATE-SET, 7: GATE-INFO */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    /*Subscriper Identifier 8 octets */</span><br><span style="color: hsl(0, 100%, 40%);">-     *(p + offset++) = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-    *(p + offset++) = 8; /* length */</span><br><span style="color: hsl(0, 100%, 40%);">-       *(p + offset++) = 2; /* snum */</span><br><span style="color: hsl(0, 100%, 40%);">- *(p + offset++) = 1; /* stype */</span><br><span style="color: hsl(0, 100%, 40%);">-        *((uint32_t *) (p + offset)) = htonl(mtahost);</span><br><span style="color: hsl(0, 100%, 40%);">-  offset += 4;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    if (cmd == GATE_INFO || cmd == GATE_SET_HAVE_GATEID || cmd == GATE_DEL) {</span><br><span style="color: hsl(0, 100%, 40%);">-               /* Gate ID 8 Octets */</span><br><span style="color: hsl(0, 100%, 40%);">-          *(p + offset++) = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-            *(p + offset++) = 8; /* length */</span><br><span style="color: hsl(0, 100%, 40%);">-               *(p + offset++) = 3; /* snum */</span><br><span style="color: hsl(0, 100%, 40%);">-         *(p + offset++) = 1; /* stype */</span><br><span style="color: hsl(0, 100%, 40%);">-                *((uint32_t *) (p + offset)) = htonl(gateid);</span><br><span style="color: hsl(0, 100%, 40%);">-           offset += 4;</span><br><span style="color: hsl(0, 100%, 40%);">-            if (cmd == GATE_INFO || cmd == GATE_DEL) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      return offset;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Activity Count 8 octets */</span><br><span style="color: hsl(0, 100%, 40%);">-   *(p + offset++) = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-    *(p + offset++) = 8; /* length */</span><br><span style="color: hsl(0, 100%, 40%);">-       *(p + offset++) = 4; /* snum */</span><br><span style="color: hsl(0, 100%, 40%);">- *(p + offset++) = 1; /* stype */</span><br><span style="color: hsl(0, 100%, 40%);">-        *((uint32_t *) (p + offset)) = htonl(actcount);</span><br><span style="color: hsl(0, 100%, 40%);">- offset += 4;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    /* Gate Spec 2*60 Octets */</span><br><span style="color: hsl(0, 100%, 40%);">-     gs.direction = 0; /* DS */</span><br><span style="color: hsl(0, 100%, 40%);">-      gs.protocolid = 17; /* UDP */</span><br><span style="color: hsl(0, 100%, 40%);">-   gs.flags = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-   gs.sessionclass = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-    gs.srcip = htonl(ssip);</span><br><span style="color: hsl(0, 100%, 40%);">- gs.dstip = htonl(mtahost);</span><br><span style="color: hsl(0, 100%, 40%);">-      gs.srcp = htons(ssport);</span><br><span style="color: hsl(0, 100%, 40%);">-        gs.dstp = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-/*  gs.diffserv = 0xa0;*/</span><br><span style="color: hsl(0, 100%, 40%);">-   gs.diffserv = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-        gs.t1 = htons(cmts->t1);</span><br><span style="color: hsl(0, 100%, 40%);">-     gs.t7 = htons(cmts->t7);</span><br><span style="color: hsl(0, 100%, 40%);">-     gs.t8 = htons(cmts->t8);</span><br><span style="color: hsl(0, 100%, 40%);">-     gs.r = ftoieeef(rate);</span><br><span style="color: hsl(0, 100%, 40%);">-  gs.b = ftoieeef(psizegateid);</span><br><span style="color: hsl(0, 100%, 40%);">-   gs.p = ftoieeef(rate);</span><br><span style="color: hsl(0, 100%, 40%);">-  gs.m = htonl((uint32_t) psizegateid);</span><br><span style="color: hsl(0, 100%, 40%);">-   gs.mm = htonl((uint32_t) psizegateid);</span><br><span style="color: hsl(0, 100%, 40%);">-  gs.rate = ftoieeef(rate);</span><br><span style="color: hsl(0, 100%, 40%);">-       gs.s = htonl(800);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      *(p + offset) = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-      offset++;</span><br><span style="color: hsl(0, 100%, 40%);">-       *(p + offset) = 60; /* length */</span><br><span style="color: hsl(0, 100%, 40%);">-        offset++;</span><br><span style="color: hsl(0, 100%, 40%);">-       *(p + offset) = 5; /* snum */</span><br><span style="color: hsl(0, 100%, 40%);">-   offset++;</span><br><span style="color: hsl(0, 100%, 40%);">-       *(p + offset) = 1; /* stype */</span><br><span style="color: hsl(0, 100%, 40%);">-  offset++;</span><br><span style="color: hsl(0, 100%, 40%);">-       offset += cops_constructgatespec(&gs, p + offset);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  gs.direction = 1; /* US */</span><br><span style="color: hsl(0, 100%, 40%);">-      gs.srcip = htonl(mtahost);</span><br><span style="color: hsl(0, 100%, 40%);">-      gs.dstip = htonl(ssip);</span><br><span style="color: hsl(0, 100%, 40%);">- gs.srcp = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-    gs.dstp = htons(ssport);</span><br><span style="color: hsl(0, 100%, 40%);">-        *(p + offset) = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-      offset++;</span><br><span style="color: hsl(0, 100%, 40%);">-       *(p + offset) = 60; /* length */</span><br><span style="color: hsl(0, 100%, 40%);">-        offset++;</span><br><span style="color: hsl(0, 100%, 40%);">-       *(p + offset) = 5; /* snum */</span><br><span style="color: hsl(0, 100%, 40%);">-   offset++;</span><br><span style="color: hsl(0, 100%, 40%);">-       *(p + offset) = 1; /* stype */</span><br><span style="color: hsl(0, 100%, 40%);">-  offset++;</span><br><span style="color: hsl(0, 100%, 40%);">-       offset += cops_constructgatespec(&gs, p + offset);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  return(offset);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int cops_getmsg (int sfd, struct copsmsg *recmsg)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       int len, lent;</span><br><span style="color: hsl(0, 100%, 40%);">-  char buf[COPS_HEADER_SIZE];</span><br><span style="color: hsl(0, 100%, 40%);">-     struct pktcobj *pobject = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">- uint16_t *ubuf = (uint16_t *) buf;</span><br><span style="color: hsl(0, 100%, 40%);">-      recmsg->msg = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-  recmsg->object = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-       len = recv(sfd, buf, COPS_HEADER_SIZE, MSG_DONTWAIT);</span><br><span style="color: hsl(0, 100%, 40%);">-   if (len < COPS_HEADER_SIZE) {</span><br><span style="color: hsl(0, 100%, 40%);">-                return len;</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span style="color: hsl(0, 100%, 40%);">-       recmsg->verflag = *buf;</span><br><span style="color: hsl(0, 100%, 40%);">-      recmsg->opcode = *(buf + 1);</span><br><span style="color: hsl(0, 100%, 40%);">- recmsg->clienttype = ntohs(*((uint16_t *) (buf + 2)));</span><br><span style="color: hsl(0, 100%, 40%);">-       recmsg->length = ntohl(*((uint32_t *) (buf + 4)));</span><br><span style="color: hsl(0, 100%, 40%);">-   /* Eg KA msg*/</span><br><span style="color: hsl(0, 100%, 40%);">-  if (recmsg->clienttype != 0x8008 ) {</span><br><span style="color: hsl(0, 100%, 40%);">-         if (!(recmsg->msg = ast_malloc(recmsg->length - COPS_HEADER_SIZE))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-               lent = recv(sfd, recmsg->msg, recmsg->length - COPS_HEADER_SIZE, MSG_DONTWAIT);</span><br><span style="color: hsl(0, 100%, 40%);">-           if (lent < recmsg->length - COPS_HEADER_SIZE) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   return lent;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-               len += len;</span><br><span style="color: hsl(0, 100%, 40%);">-     } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                /* PacketCable Objects */</span><br><span style="color: hsl(0, 100%, 40%);">-               while (len < recmsg->length) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    if (len == COPS_HEADER_SIZE) {</span><br><span style="color: hsl(0, 100%, 40%);">-                          /* 1st round */</span><br><span style="color: hsl(0, 100%, 40%);">-                         if (!(recmsg->object = ast_malloc(sizeof(struct pktcobj)))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                        return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-                              }</span><br><span style="color: hsl(0, 100%, 40%);">-                               pobject = recmsg->object;</span><br><span style="color: hsl(0, 100%, 40%);">-                    } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                if (!(pobject->next = ast_malloc(sizeof(struct pktcobj)))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                 return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-                              }</span><br><span style="color: hsl(0, 100%, 40%);">-                               pobject = pobject->next;</span><br><span style="color: hsl(0, 100%, 40%);">-                     }</span><br><span style="color: hsl(0, 100%, 40%);">-                       pobject->next = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-                        lent = recv(sfd, buf, COPS_OBJECT_HEADER_SIZE, MSG_DONTWAIT);</span><br><span style="color: hsl(0, 100%, 40%);">-                   if (lent < COPS_OBJECT_HEADER_SIZE) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                ast_debug(3, "Too short object header len: %i\n", lent);</span><br><span style="color: hsl(0, 100%, 40%);">-                              return lent;</span><br><span style="color: hsl(0, 100%, 40%);">-                    }</span><br><span style="color: hsl(0, 100%, 40%);">-                       len += lent;</span><br><span style="color: hsl(0, 100%, 40%);">-                    pobject->length = ntohs(*ubuf);</span><br><span style="color: hsl(0, 100%, 40%);">-                      pobject->cnum = *(buf + 2);</span><br><span style="color: hsl(0, 100%, 40%);">-                  pobject->ctype = *(buf + 3);</span><br><span style="color: hsl(0, 100%, 40%);">-                 if (!(pobject->contents = ast_malloc(pobject->length - COPS_OBJECT_HEADER_SIZE))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                               return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-                      }</span><br><span style="color: hsl(0, 100%, 40%);">-                       lent = recv(sfd, pobject->contents, pobject->length - COPS_OBJECT_HEADER_SIZE, MSG_DONTWAIT);</span><br><span style="color: hsl(0, 100%, 40%);">-                     if (lent < pobject->length - COPS_OBJECT_HEADER_SIZE) {</span><br><span style="color: hsl(0, 100%, 40%);">-                           ast_debug(3, "Too short object content len: %i\n", lent);</span><br><span style="color: hsl(0, 100%, 40%);">-                             return lent;</span><br><span style="color: hsl(0, 100%, 40%);">-                    }</span><br><span style="color: hsl(0, 100%, 40%);">-                       len += lent;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-       return len;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int cops_sendmsg (int sfd, struct copsmsg * sendmsg)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        char *buf;</span><br><span style="color: hsl(0, 100%, 40%);">-      int bufpos;</span><br><span style="color: hsl(0, 100%, 40%);">-     struct pktcobj *pobject;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (sfd < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-               return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       ast_debug(3, "COPS: sending opcode: %i len: %u\n", sendmsg->opcode, sendmsg->length);</span><br><span style="color: hsl(0, 100%, 40%);">-   if (sendmsg->length < COPS_HEADER_SIZE) {</span><br><span style="color: hsl(0, 100%, 40%);">-         ast_log(LOG_WARNING, "COPS: invalid msg size!!!\n");</span><br><span style="color: hsl(0, 100%, 40%);">-          return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-       if (!(buf = ast_malloc((size_t) sendmsg->length))) {</span><br><span style="color: hsl(0, 100%, 40%);">-         return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-       *buf = sendmsg->verflag ;</span><br><span style="color: hsl(0, 100%, 40%);">-    *(buf + 1) = sendmsg->opcode;</span><br><span style="color: hsl(0, 100%, 40%);">-        *((uint16_t *)(buf + 2)) = htons(sendmsg->clienttype);</span><br><span style="color: hsl(0, 100%, 40%);">-       *((uint32_t *)(buf + 4)) = htonl(sendmsg->length);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   if (sendmsg->msg != NULL) {</span><br><span style="color: hsl(0, 100%, 40%);">-          memcpy(buf + COPS_HEADER_SIZE, sendmsg->msg, sendmsg->length - COPS_HEADER_SIZE);</span><br><span style="color: hsl(0, 100%, 40%);">- } else if (sendmsg->object != NULL) {</span><br><span style="color: hsl(0, 100%, 40%);">-                bufpos = 8;</span><br><span style="color: hsl(0, 100%, 40%);">-             pobject = sendmsg->object;</span><br><span style="color: hsl(0, 100%, 40%);">-           while(pobject != NULL) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        ast_debug(3, "COPS: Sending Object : cnum: %i ctype %i len: %i\n", pobject->cnum, pobject->ctype, pobject->length);</span><br><span style="color: hsl(0, 100%, 40%);">-                  if (sendmsg->length < bufpos + pobject->length) {</span><br><span style="color: hsl(0, 100%, 40%);">-                              ast_log(LOG_WARNING, "COPS: Invalid msg size len: %u objectlen: %i\n", sendmsg->length, pobject->length);</span><br><span style="color: hsl(0, 100%, 40%);">-                               ast_free(buf);</span><br><span style="color: hsl(0, 100%, 40%);">-                          return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-                      }</span><br><span style="color: hsl(0, 100%, 40%);">-                       *(uint16_t *) (buf + bufpos) = htons(pobject->length);</span><br><span style="color: hsl(0, 100%, 40%);">-                       *(buf + bufpos + 2) = pobject->cnum;</span><br><span style="color: hsl(0, 100%, 40%);">-                 *(buf + bufpos + 3) = pobject->ctype;</span><br><span style="color: hsl(0, 100%, 40%);">-                        if (sendmsg->length < pobject->length + bufpos) {</span><br><span style="color: hsl(0, 100%, 40%);">-                              ast_log(LOG_WARNING, "COPS: Error sum of object len more the msg len %u < %i\n", sendmsg->length, pobject->length + bufpos);</span><br><span style="color: hsl(0, 100%, 40%);">-                         ast_free(buf);</span><br><span style="color: hsl(0, 100%, 40%);">-                          return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-                      }</span><br><span style="color: hsl(0, 100%, 40%);">-                       memcpy((buf + bufpos + 4), pobject->contents, pobject->length - 4);</span><br><span style="color: hsl(0, 100%, 40%);">-                       bufpos += pobject->length;</span><br><span style="color: hsl(0, 100%, 40%);">-                   pobject = pobject->next;</span><br><span style="color: hsl(0, 100%, 40%);">-             }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       errno = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-#ifdef HAVE_MSG_NOSIGNAL</span><br><span style="color: hsl(0, 100%, 40%);">-#define       SENDFLAGS       MSG_NOSIGNAL | MSG_DONTWAIT</span><br><span style="color: hsl(0, 100%, 40%);">-#else</span><br><span style="color: hsl(0, 100%, 40%);">-#define SENDFLAGS       MSG_DONTWAIT</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-      if (send(sfd, buf, sendmsg->length, SENDFLAGS) == -1) {</span><br><span style="color: hsl(0, 100%, 40%);">-              ast_log(LOG_WARNING, "COPS: Send failed errno=%i\n", errno);</span><br><span style="color: hsl(0, 100%, 40%);">-          ast_free(buf);</span><br><span style="color: hsl(0, 100%, 40%);">-          return -2;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-#undef SENDFLAGS</span><br><span style="color: hsl(0, 100%, 40%);">-       ast_free(buf);</span><br><span style="color: hsl(0, 100%, 40%);">-  return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void cops_freemsg(struct copsmsg *p)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  struct pktcobj *pnext;</span><br><span style="color: hsl(0, 100%, 40%);">-  ast_free(p->msg);</span><br><span style="color: hsl(0, 100%, 40%);">-    p->msg = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-       while (p->object != NULL) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  pnext = p->object->next;</span><br><span style="color: hsl(0, 100%, 40%);">-                  ast_free(p->object->contents);</span><br><span style="color: hsl(0, 100%, 40%);">-                    p->object->contents = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-                       ast_free(p->object);</span><br><span style="color: hsl(0, 100%, 40%);">-                 p->object = pnext;</span><br><span style="color: hsl(0, 100%, 40%);">-   }</span><br><span style="color: hsl(0, 100%, 40%);">-       p->object = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct cops_gate * AST_OPTIONAL_API_NAME(ast_pktccops_gate_alloc)(int cmd,</span><br><span style="color: hsl(0, 100%, 40%);">-         struct cops_gate *gate, uint32_t mta, uint32_t actcount, float bitrate,</span><br><span style="color: hsl(0, 100%, 40%);">-         uint32_t psize, uint32_t ssip, uint16_t ssport,</span><br><span style="color: hsl(0, 100%, 40%);">-         int (* const got_dq_gi) (struct cops_gate *gate),</span><br><span style="color: hsl(0, 100%, 40%);">-               int (* const gate_remove) (struct cops_gate *gate))</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    while (pktcreload) {</span><br><span style="color: hsl(0, 100%, 40%);">-            sched_yield();</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (cmd == GATE_SET_HAVE_GATEID && gate) {</span><br><span style="color: hsl(0, 100%, 40%);">-              ast_debug(3, "------- gate modify gateid 0x%x ssip: 0x%x\n", gate->gateid, ssip);</span><br><span style="color: hsl(0, 100%, 40%);">-          /* TODO implement it */</span><br><span style="color: hsl(0, 100%, 40%);">-         ast_log(LOG_WARNING, "Modify GateID not implemented\n");</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if ((gate = cops_gate_cmd(cmd, NULL, cops_trid++, mta, actcount, bitrate, psize, ssip, ssport, gate))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                ast_debug(3, "COPS: Allocating gate for mta: 0x%x\n", mta);</span><br><span style="color: hsl(0, 100%, 40%);">-           gate->got_dq_gi = got_dq_gi;</span><br><span style="color: hsl(0, 100%, 40%);">-         gate->gate_remove = gate_remove;</span><br><span style="color: hsl(0, 100%, 40%);">-             return(gate);</span><br><span style="color: hsl(0, 100%, 40%);">-   } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                ast_debug(3, "COPS: Couldn't allocate gate for mta: 0x%x\n", mta);</span><br><span style="color: hsl(0, 100%, 40%);">-                return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static struct cops_gate *cops_gate_cmd(int cmd, struct cops_cmts *cmts,</span><br><span style="color: hsl(0, 100%, 40%);">-               uint16_t trid, uint32_t mta, uint32_t actcount, float bitrate,</span><br><span style="color: hsl(0, 100%, 40%);">-          uint32_t psize, uint32_t ssip, uint16_t ssport, struct cops_gate *gate)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        struct copsmsg *gateset;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct cops_gate *new;</span><br><span style="color: hsl(0, 100%, 40%);">-  struct cops_ippool *ippool;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     if (cmd == GATE_DEL) {</span><br><span style="color: hsl(0, 100%, 40%);">-          if (gate == NULL) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-            } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        cmts = gate->cmts;</span><br><span style="color: hsl(0, 100%, 40%);">-           }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (!cmts) {</span><br><span style="color: hsl(0, 100%, 40%);">-            AST_LIST_LOCK(&ippool_list);</span><br><span style="color: hsl(0, 100%, 40%);">-                AST_LIST_TRAVERSE(&ippool_list, ippool, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     if (mta >= ippool->start && mta <= ippool->stop) {</span><br><span style="color: hsl(0, 100%, 40%);">-                          cmts = ippool->cmts;</span><br><span style="color: hsl(0, 100%, 40%);">-                         break;</span><br><span style="color: hsl(0, 100%, 40%);">-                  }</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-               AST_LIST_UNLOCK(&ippool_list);</span><br><span style="color: hsl(0, 100%, 40%);">-              if (!cmts) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    ast_log(LOG_WARNING, "COPS: couldn't find cmts for mta: 0x%x\n", mta);</span><br><span style="color: hsl(0, 100%, 40%);">-                    return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-               if (cmts->sfd < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      ast_log(LOG_WARNING, "CMTS: %s not connected\n", cmts->name);</span><br><span style="color: hsl(0, 100%, 40%);">-                      return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (cmd == GATE_SET) {</span><br><span style="color: hsl(0, 100%, 40%);">-          new = ast_calloc(1, sizeof(*new));</span><br><span style="color: hsl(0, 100%, 40%);">-              new->gateid = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-             new->trid = trid;</span><br><span style="color: hsl(0, 100%, 40%);">-            new->mta = mta;</span><br><span style="color: hsl(0, 100%, 40%);">-              new->state = GATE_ALLOC_PROGRESS;</span><br><span style="color: hsl(0, 100%, 40%);">-            new->checked = time(NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-           new->allocated = time(NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-         new->cmts = cmts;</span><br><span style="color: hsl(0, 100%, 40%);">-            new->got_dq_gi = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-               new->gate_remove = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-             new->gate_open = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-               new->tech_pvt = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-                new->deltimer = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-           AST_LIST_LOCK(&gate_list);</span><br><span style="color: hsl(0, 100%, 40%);">-          AST_LIST_INSERT_HEAD(&gate_list, new, list);</span><br><span style="color: hsl(0, 100%, 40%);">-                AST_LIST_UNLOCK(&gate_list);</span><br><span style="color: hsl(0, 100%, 40%);">-                gate = new;</span><br><span style="color: hsl(0, 100%, 40%);">-     } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                if (gate) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     gate->trid = trid;</span><br><span style="color: hsl(0, 100%, 40%);">-           }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       gate->in_transaction = time(NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   if (!(gateset = ast_malloc(sizeof(struct copsmsg)))) {</span><br><span style="color: hsl(0, 100%, 40%);">-          ast_free(gateset);</span><br><span style="color: hsl(0, 100%, 40%);">-              return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-       gateset->msg = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">- gateset->verflag = 0x10;</span><br><span style="color: hsl(0, 100%, 40%);">-     gateset->opcode = 2; /* Decision */</span><br><span style="color: hsl(0, 100%, 40%);">-  gateset->clienttype = 0x8008; /* =PacketCable */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* Handle object */</span><br><span style="color: hsl(0, 100%, 40%);">-     gateset->object = ast_malloc(sizeof(struct pktcobj));</span><br><span style="color: hsl(0, 100%, 40%);">-        if (!gateset->object) {</span><br><span style="color: hsl(0, 100%, 40%);">-              cops_freemsg(gateset);</span><br><span style="color: hsl(0, 100%, 40%);">-          ast_free(gateset);</span><br><span style="color: hsl(0, 100%, 40%);">-              return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-       gateset->object->length = COPS_OBJECT_HEADER_SIZE + 4;</span><br><span style="color: hsl(0, 100%, 40%);">-    gateset->object->cnum = 1; /* Handle */</span><br><span style="color: hsl(0, 100%, 40%);">-   gateset->object->ctype = 1; /* client */</span><br><span style="color: hsl(0, 100%, 40%);">-  if (!(gateset->object->contents = ast_malloc(sizeof(uint32_t)))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                cops_freemsg(gateset);</span><br><span style="color: hsl(0, 100%, 40%);">-          ast_free(gateset);</span><br><span style="color: hsl(0, 100%, 40%);">-              return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-       *((uint32_t *) gateset->object->contents) = htonl(cmts->handle);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Context Object */</span><br><span style="color: hsl(0, 100%, 40%);">-    if (!(gateset->object->next = ast_malloc(sizeof(struct pktcobj)))) {</span><br><span style="color: hsl(0, 100%, 40%);">-              cops_freemsg(gateset);</span><br><span style="color: hsl(0, 100%, 40%);">-          ast_free(gateset);</span><br><span style="color: hsl(0, 100%, 40%);">-              return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-       gateset->object->next->length = COPS_OBJECT_HEADER_SIZE + 4;</span><br><span style="color: hsl(0, 100%, 40%);">-   gateset->object->next->cnum = 2; /* Context */</span><br><span style="color: hsl(0, 100%, 40%);">- gateset->object->next->ctype = 1; /* Context */</span><br><span style="color: hsl(0, 100%, 40%);">-        if (!(gateset->object->next->contents = ast_malloc(sizeof(uint32_t)))) {</span><br><span style="color: hsl(0, 100%, 40%);">-               cops_freemsg(gateset);</span><br><span style="color: hsl(0, 100%, 40%);">-          ast_free(gateset);</span><br><span style="color: hsl(0, 100%, 40%);">-              return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-       *((uint32_t *) gateset->object->next->contents) = htonl(0x00080000); /* R-Type = 8 configuration request, M-Type = 0 */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* Decision Object: Flags */</span><br><span style="color: hsl(0, 100%, 40%);">-    if (!(gateset->object->next->next = ast_malloc(sizeof(struct pktcobj)))) {</span><br><span style="color: hsl(0, 100%, 40%);">-             cops_freemsg(gateset);</span><br><span style="color: hsl(0, 100%, 40%);">-          ast_free(gateset);</span><br><span style="color: hsl(0, 100%, 40%);">-              return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-       gateset->object->next->next->length = COPS_OBJECT_HEADER_SIZE + 4;</span><br><span style="color: hsl(0, 100%, 40%);">-  gateset->object->next->next->cnum = 6; /* Decision */</span><br><span style="color: hsl(0, 100%, 40%);">-       gateset->object->next->next->ctype = 1; /* Flags */</span><br><span style="color: hsl(0, 100%, 40%);">- if (!(gateset->object->next->next->contents = ast_malloc(sizeof(uint32_t)))) {</span><br><span style="color: hsl(0, 100%, 40%);">-              cops_freemsg(gateset);</span><br><span style="color: hsl(0, 100%, 40%);">-          ast_free(gateset);</span><br><span style="color: hsl(0, 100%, 40%);">-              return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-       *((uint32_t *) gateset->object->next->next->contents) = htonl(0x00010001); /* Install, Trigger Error */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* Decision Object: Data */</span><br><span style="color: hsl(0, 100%, 40%);">-     if (!(gateset->object->next->next->next = ast_malloc(sizeof(struct pktcobj)))) {</span><br><span style="color: hsl(0, 100%, 40%);">-            cops_freemsg(gateset);</span><br><span style="color: hsl(0, 100%, 40%);">-          ast_free(gateset);</span><br><span style="color: hsl(0, 100%, 40%);">-              return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-       gateset->object->next->next->next->length = COPS_OBJECT_HEADER_SIZE + ((cmd != GATE_INFO && cmd != GATE_DEL) ? GATE_SET_OBJ_SIZE : GATE_INFO_OBJ_SIZE) + ((cmd == GATE_SET_HAVE_GATEID) ? GATEID_OBJ_SIZE : 0);</span><br><span style="color: hsl(0, 100%, 40%);">-  gateset->object->next->next->next->cnum = 6; /* Decision */</span><br><span style="color: hsl(0, 100%, 40%);">-      gateset->object->next->next->next->ctype = 4; /* Decision Data */</span><br><span style="color: hsl(0, 100%, 40%);">-        gateset->object->next->next->next->contents = ast_malloc(((cmd != GATE_INFO && cmd != GATE_DEL) ? GATE_SET_OBJ_SIZE : GATE_INFO_OBJ_SIZE) + ((cmd == GATE_SET_HAVE_GATEID) ? GATEID_OBJ_SIZE : 0));</span><br><span style="color: hsl(0, 100%, 40%);">-      if (!gateset->object->next->next->next->contents) {</span><br><span style="color: hsl(0, 100%, 40%);">-              cops_freemsg(gateset);</span><br><span style="color: hsl(0, 100%, 40%);">-          ast_free(gateset);</span><br><span style="color: hsl(0, 100%, 40%);">-              return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-       gateset->object->next->next->next->next = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  gateset->length = COPS_HEADER_SIZE + gateset->object->length + gateset->object->next->length + gateset->object->next->next->length + gateset->object->next->next->next->length;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    if ((cmd == GATE_INFO || cmd == GATE_SET_HAVE_GATEID || cmd == GATE_DEL) && gate) {</span><br><span style="color: hsl(0, 100%, 40%);">-             ast_debug(1, "Construct gate with gateid: 0x%x\n", gate->gateid);</span><br><span style="color: hsl(0, 100%, 40%);">-          cops_construct_gate(cmd, gateset->object->next->next->next->contents, trid, mta, actcount, bitrate, psize, ssip, ssport, gate->gateid, cmts);</span><br><span style="color: hsl(0, 100%, 40%);">- } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                ast_debug(1, "Construct new gate\n");</span><br><span style="color: hsl(0, 100%, 40%);">-         cops_construct_gate(cmd, gateset->object->next->next->next->contents, trid, mta, actcount, bitrate, psize, ssip, ssport, 0, cmts);</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-       ast_debug(3, "send cmd\n");</span><br><span style="color: hsl(0, 100%, 40%);">-   cops_sendmsg(cmts->sfd, gateset);</span><br><span style="color: hsl(0, 100%, 40%);">-    cops_freemsg(gateset);</span><br><span style="color: hsl(0, 100%, 40%);">-  ast_free(gateset);</span><br><span style="color: hsl(0, 100%, 40%);">-      return gate;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int cops_connect(char *host, char *port)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   int s, sfd = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct addrinfo hints;</span><br><span style="color: hsl(0, 100%, 40%);">-  struct addrinfo *rp;</span><br><span style="color: hsl(0, 100%, 40%);">-    struct addrinfo *result;</span><br><span style="color: hsl(0, 100%, 40%);">-#ifdef HAVE_SO_NOSIGPIPE</span><br><span style="color: hsl(0, 100%, 40%);">-        int trueval = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  memset(&hints, 0, sizeof(struct addrinfo));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- hints.ai_family = AF_UNSPEC;</span><br><span style="color: hsl(0, 100%, 40%);">-    hints.ai_socktype = SOCK_STREAM;</span><br><span style="color: hsl(0, 100%, 40%);">-        hints.ai_flags = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-     hints.ai_protocol = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  s = getaddrinfo(host, port, &hints, &result);</span><br><span style="color: hsl(0, 100%, 40%);">-   if (s != 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-           ast_log(LOG_WARNING, "COPS: getaddrinfo: %s\n", gai_strerror(s));</span><br><span style="color: hsl(0, 100%, 40%);">-             return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       for (rp = result; rp != NULL; rp = rp->ai_next) {</span><br><span style="color: hsl(0, 100%, 40%);">-            sfd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);</span><br><span style="color: hsl(0, 100%, 40%);">-         if (sfd == -1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        ast_log(LOG_WARNING, "Failed socket\n");</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-               ast_fd_set_flags(sfd, O_NONBLOCK);</span><br><span style="color: hsl(0, 100%, 40%);">-#ifdef HAVE_SO_NOSIGPIPE</span><br><span style="color: hsl(0, 100%, 40%);">-              setsockopt(sfd, SOL_SOCKET, SO_NOSIGPIPE, &trueval, sizeof(trueval));</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-         connect(sfd, rp->ai_addr, rp->ai_addrlen);</span><br><span style="color: hsl(0, 100%, 40%);">-                if (sfd == -1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        ast_log(LOG_WARNING, "Failed connect\n");</span><br><span style="color: hsl(0, 100%, 40%);">-             }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-       freeaddrinfo(result);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   ast_debug(3, "Connecting to cmts:  %s:%s\n", host, port);</span><br><span style="color: hsl(0, 100%, 40%);">-     return(sfd);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#define PKTCCOPS_DESTROY_CURRENT_GATE   \</span><br><span style="color: hsl(0, 100%, 40%);">-          AST_LIST_REMOVE_CURRENT(list);  \</span><br><span style="color: hsl(0, 100%, 40%);">-               if (gate->gate_remove) {        \</span><br><span style="color: hsl(0, 100%, 40%);">-                    gate->gate_remove(gate);    \</span><br><span style="color: hsl(0, 100%, 40%);">-                }                               \</span><br><span style="color: hsl(0, 100%, 40%);">-               ast_free(gate);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void *do_pktccops(void *data)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    int res, nfds, len;</span><br><span style="color: hsl(0, 100%, 40%);">-     struct copsmsg *recmsg, *sendmsg;</span><br><span style="color: hsl(0, 100%, 40%);">-       struct copsmsg recmsgb, sendmsgb;</span><br><span style="color: hsl(0, 100%, 40%);">-       struct pollfd *pfds = NULL, *tmp;</span><br><span style="color: hsl(0, 100%, 40%);">-       struct pktcobj *pobject;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct cops_cmts *cmts;</span><br><span style="color: hsl(0, 100%, 40%);">- struct cops_gate *gate;</span><br><span style="color: hsl(0, 100%, 40%);">- char *sobjp;</span><br><span style="color: hsl(0, 100%, 40%);">-    uint16_t snst, sobjlen, scommand, recvtrid, actcount, reason, subreason;</span><br><span style="color: hsl(0, 100%, 40%);">-        uint32_t gateid, subscrid, pktcerror;</span><br><span style="color: hsl(0, 100%, 40%);">-   time_t last_exec = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   recmsg = &recmsgb;</span><br><span style="color: hsl(0, 100%, 40%);">-  sendmsg = &sendmsgb;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        ast_debug(3, "COPS: thread started\n");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       for (;;) {</span><br><span style="color: hsl(0, 100%, 40%);">-              ast_free(pfds);</span><br><span style="color: hsl(0, 100%, 40%);">-         pfds = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-            nfds = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-               AST_LIST_LOCK(&cmts_list);</span><br><span style="color: hsl(0, 100%, 40%);">-          AST_LIST_TRAVERSE(&cmts_list, cmts, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 if (last_exec != time(NULL)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                          if (cmts->state == 2 && cmts->katimer + cmts->keepalive < time(NULL)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                     ast_log(LOG_WARNING, "KA timer (%us) expired cmts: %s\n",  cmts->keepalive, cmts->name);</span><br><span style="color: hsl(0, 100%, 40%);">-                                        cmts->state = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                                     cmts->katimer = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-                                  close(cmts->sfd);</span><br><span style="color: hsl(0, 100%, 40%);">-                                    cmts->sfd = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-                              }</span><br><span style="color: hsl(0, 100%, 40%);">-                       }</span><br><span style="color: hsl(0, 100%, 40%);">-                       if (cmts->sfd > 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                              if (!(tmp = ast_realloc(pfds, (nfds + 1) * sizeof(*pfds)))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                   continue;</span><br><span style="color: hsl(0, 100%, 40%);">-                               }</span><br><span style="color: hsl(0, 100%, 40%);">-                               pfds = tmp;</span><br><span style="color: hsl(0, 100%, 40%);">-                             pfds[nfds].fd = cmts->sfd;</span><br><span style="color: hsl(0, 100%, 40%);">-                           pfds[nfds].events = POLLIN;</span><br><span style="color: hsl(0, 100%, 40%);">-                             pfds[nfds].revents = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                         nfds++;</span><br><span style="color: hsl(0, 100%, 40%);">-                 } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                cmts->sfd = cops_connect(cmts->host, cmts->port);</span><br><span style="color: hsl(0, 100%, 40%);">-                              if (cmts->sfd > 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                      cmts->state = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-                                     if (cmts->sfd > 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                              if (!(tmp = ast_realloc(pfds, (nfds + 1) * sizeof(*pfds)))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                   continue;</span><br><span style="color: hsl(0, 100%, 40%);">-                                               }</span><br><span style="color: hsl(0, 100%, 40%);">-                                               pfds = tmp;</span><br><span style="color: hsl(0, 100%, 40%);">-                                             pfds[nfds].fd = cmts->sfd;</span><br><span style="color: hsl(0, 100%, 40%);">-                                           pfds[nfds].events = POLLIN;</span><br><span style="color: hsl(0, 100%, 40%);">-                                             pfds[nfds].revents = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                                         nfds++;</span><br><span style="color: hsl(0, 100%, 40%);">-                                 }</span><br><span style="color: hsl(0, 100%, 40%);">-                               }</span><br><span style="color: hsl(0, 100%, 40%);">-                       }</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-               AST_LIST_UNLOCK(&cmts_list);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                if (last_exec != time(NULL)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  last_exec = time(NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-                 AST_LIST_LOCK(&gate_list);</span><br><span style="color: hsl(0, 100%, 40%);">-                  AST_LIST_TRAVERSE_SAFE_BEGIN(&gate_list, gate, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-                              if (gate) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                     if (gate->deltimer && gate->deltimer < time(NULL)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                           gate->deltimer = time(NULL) + 5;</span><br><span style="color: hsl(0, 100%, 40%);">-                                             gate->trid = cops_trid++;</span><br><span style="color: hsl(0, 100%, 40%);">-                                            cops_gate_cmd(GATE_DEL, gate->cmts, gate->trid, 0, 0, 0, 0, 0, 0, gate);</span><br><span style="color: hsl(0, 100%, 40%);">-                                          ast_debug(3, "COPS: requested Gate-Del: CMTS: %s gateid: 0x%x\n", (gate->cmts) ? gate->cmts->name : "null", gate->gateid);</span><br><span style="color: hsl(0, 100%, 40%);">-                                      }</span><br><span style="color: hsl(0, 100%, 40%);">-                                       if (time(NULL) - gate->checked > gatetimeout) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                           ast_debug(3, "COPS: remove from list GATE, CMTS: %s gateid: 0x%x\n", (gate->cmts) ? gate->cmts->name : "null", gate->gateid);</span><br><span style="color: hsl(0, 100%, 40%);">-                                           gate->state = GATE_TIMEOUT;</span><br><span style="color: hsl(0, 100%, 40%);">-                                          PKTCCOPS_DESTROY_CURRENT_GATE;</span><br><span style="color: hsl(0, 100%, 40%);">-                                  } else if (time(NULL) - gate->checked > gateinfoperiod && (gate->state == GATE_ALLOCATED || gate->state == GATE_OPEN)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                            if (gate->cmts && (!gate->in_transaction || ( gate->in_transaction + 5 ) < time(NULL))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                   gate->trid = cops_trid++;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                    ast_debug(3, "COPS: Gate-Info send to CMTS: %s gateid: 0x%x\n", gate->cmts->name, gate->gateid);</span><br><span style="color: hsl(0, 100%, 40%);">-                                                     cops_gate_cmd(GATE_INFO, gate->cmts, gate->trid, gate->mta, 0, 0, 0, 0, 0, gate);</span><br><span style="color: hsl(0, 100%, 40%);">-                                              }</span><br><span style="color: hsl(0, 100%, 40%);">-                                       }</span><br><span style="color: hsl(0, 100%, 40%);">-                               }</span><br><span style="color: hsl(0, 100%, 40%);">-                       }</span><br><span style="color: hsl(0, 100%, 40%);">-                       AST_LIST_TRAVERSE_SAFE_END;</span><br><span style="color: hsl(0, 100%, 40%);">-                     AST_LIST_UNLOCK(&gate_list);</span><br><span style="color: hsl(0, 100%, 40%);">-                }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               if (pktcreload == 2) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  pktcreload = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-         }</span><br><span style="color: hsl(0, 100%, 40%);">-               if ((res = ast_poll(pfds, nfds, 1000))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       AST_LIST_LOCK(&cmts_list);</span><br><span style="color: hsl(0, 100%, 40%);">-                  AST_LIST_TRAVERSE(&cmts_list, cmts, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-                         int idx;</span><br><span style="color: hsl(0, 100%, 40%);">-                                if ((idx = ast_poll_fd_index(pfds, nfds, cmts->sfd)) > -1 && (pfds[idx].revents & POLLIN)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                  len = cops_getmsg(cmts->sfd, recmsg);</span><br><span style="color: hsl(0, 100%, 40%);">-                                        if (len > 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                               ast_debug(3, "COPS: got from %s:\n Header: versflag=0x%02hhx opcode=%i clienttype=0x%04hx msglength=%u\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                                                    cmts->name, recmsg->verflag,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                      recmsg->opcode, recmsg->clienttype, recmsg->length);</span><br><span style="color: hsl(0, 100%, 40%);">-                                           if (recmsg->object != NULL) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                        pobject = recmsg->object;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                    while (pobject != NULL) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                               ast_debug(3, " OBJECT: length=%i cnum=%i ctype=%i\n", pobject->length, pobject->cnum, pobject->ctype);</span><br><span style="color: hsl(0, 100%, 40%);">-                                                               if (recmsg->opcode == 1 && pobject->cnum == 1 && pobject->ctype == 1 ) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                       cmts->handle = ntohl(*((uint32_t *) pobject->contents));</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                  ast_debug(3, "    REQ client handle: %u\n", cmts->handle);</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                 cmts->state = 2;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                     cmts->katimer = time(NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-                                                          } else if (pobject->cnum == 9 && pobject->ctype == 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                   sobjp = pobject->contents;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                   subscrid = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                   recvtrid = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                   scommand = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                   pktcerror = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                  actcount = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                   gateid = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                     reason = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                     subreason = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                  while (sobjp < (pobject->contents + pobject->length - 4)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                            sobjlen = ntohs(*((uint16_t *) sobjp));</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                         snst = ntohs(*((uint16_t *) (sobjp + 2)));</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                              ast_debug(3, "   S-Num S-type: 0x%.4x len: %i\n", (unsigned)snst, sobjlen);</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                           if (snst == 0x0101 ) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                  recvtrid = ntohs(*((uint16_t *) (sobjp + 4)));</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                  scommand = ntohs(*((uint16_t *) (sobjp + 6)));</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                  ast_debug(3, "     Transaction Identifier command: %i trid %i\n", scommand, recvtrid);</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                } else if (snst == 0x0201) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                    subscrid = ntohl(*((uint32_t *) (sobjp + 4)));</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                  ast_debug(3, "     Subscriber ID: 0x%.8x\n", subscrid);</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                               } else if (snst == 0x0301) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                    gateid = ntohl(*((uint32_t *) (sobjp + 4)));</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                    ast_debug(3, "      Gate ID: 0x%x 0x%.8x\n", gateid, gateid);</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                         } else if (snst == 0x0401) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                    actcount = ntohs(*((uint16_t *) (sobjp + 6)));</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                  ast_debug(3, "      Activity Count: %i\n", actcount);</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                         } else if (snst == 0x0901) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                    pktcerror = ntohl(*((uint32_t *) (sobjp + 4)));</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                 ast_debug(3, "      PKTC Error: 0x%.8x\n", pktcerror);</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                } else if (snst == 0x0d01) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                    reason = ntohs(*((uint16_t *) (sobjp + 4)));</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                    subreason = ntohs(*((uint16_t *) (sobjp + 6)));</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                 ast_debug(3, "      Reason: %d Subreason: %d\n", reason, subreason);</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                          }</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                               sobjp += sobjlen;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                               if (!sobjlen)</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                   break;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                  }</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                       if (scommand == PKTCCOPS_SCOMMAND_GATE_CLOSE || scommand == PKTCCOPS_SCOMMAND_GATE_OPEN) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                              AST_LIST_LOCK(&gate_list);</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                          AST_LIST_TRAVERSE_SAFE_BEGIN(&gate_list, gate, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                      if (gate->cmts == cmts && gate->gateid == gateid) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                               if (scommand == PKTCCOPS_SCOMMAND_GATE_CLOSE && gate->state != GATE_CLOSED && gate->state != GATE_CLOSED_ERR ) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                                  ast_debug(3, "COPS Gate Close Gate ID: 0x%x TrId: %i CMTS: %s\n", gateid, recvtrid, cmts->name);</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                                   if (subreason) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                                                gate->state = GATE_CLOSED_ERR;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                                               PKTCCOPS_DESTROY_CURRENT_GATE;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                                  } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                                                gate->state = GATE_CLOSED;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                                           PKTCCOPS_DESTROY_CURRENT_GATE;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                                  }</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                                       break;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                          } else if (scommand == PKTCCOPS_SCOMMAND_GATE_OPEN && gate->state == GATE_ALLOCATED) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                                       ast_debug(3, "COPS Gate Open Gate ID: 0x%x TrId: %i CMTS: %s\n", gateid, recvtrid, cmts->name);</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                                    gate->state = GATE_OPEN;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                                     if (gate->gate_open) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                                               ast_debug(3, "Calling GATE-OPEN callback function\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                                                gate->gate_open(gate);</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                                               gate->gate_open = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                                      }</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                                       break;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                          }</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                       }</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                               }</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                               AST_LIST_TRAVERSE_SAFE_END;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                             AST_LIST_UNLOCK(&gate_list);</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                        } else if (scommand == PKTCCOPS_SCOMMAND_GATE_SET_ACK || scommand == PKTCCOPS_SCOMMAND_GATE_SET_ERR || scommand == PKTCCOPS_SCOMMAND_GATE_INFO_ACK || scommand == PKTCCOPS_SCOMMAND_GATE_INFO_ERR || scommand == PKTCCOPS_SCOMMAND_GATE_DELETE_ACK) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                           AST_LIST_LOCK(&gate_list);</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                          AST_LIST_TRAVERSE_SAFE_BEGIN(&gate_list, gate, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                      if (gate->cmts == cmts && gate->trid == recvtrid) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                               gate->gateid = gateid;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                               gate->checked = time(NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                          if (scommand == PKTCCOPS_SCOMMAND_GATE_SET_ACK) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                                       ast_debug(3, "COPS Gate Set Ack Gate ID: 0x%x TrId: %i CMTS: %s\n", gateid, recvtrid, cmts->name);</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                                 gate->state = GATE_ALLOCATED;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                                        if (gate->got_dq_gi) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                                               gate->got_dq_gi(gate);</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                                               gate->got_dq_gi = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                                      }</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                               } else if (scommand == PKTCCOPS_SCOMMAND_GATE_SET_ERR) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                                        ast_debug(3, "COPS Gate Set Error TrId: %i ErrorCode: 0x%.8x CMTS: %s\n ", recvtrid, pktcerror, cmts->name);</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                                       gate->state = GATE_ALLOC_FAILED;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                                     if (gate->got_dq_gi) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                                               gate->got_dq_gi(gate);</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                                               gate->got_dq_gi = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                                      }</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                                       PKTCCOPS_DESTROY_CURRENT_GATE;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                          } else if (scommand == PKTCCOPS_SCOMMAND_GATE_INFO_ACK) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                                       ast_debug(3, "COPS Gate Info Ack Gate ID: 0x%x TrId: %i CMTS: %s\n", gateid, recvtrid, cmts->name);</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                                } else if (scommand == PKTCCOPS_SCOMMAND_GATE_INFO_ERR) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                                       ast_debug(3, "COPS Gate Info Error Gate ID: 0x%x TrId: %i CMTS: %s\n", gateid, recvtrid, cmts->name);</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                                      gate->state = GATE_ALLOC_FAILED;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                                     PKTCCOPS_DESTROY_CURRENT_GATE;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                          } else if (scommand == PKTCCOPS_SCOMMAND_GATE_DELETE_ACK) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                                     ast_debug(3, "COPS Gate Deleted Gate ID: 0x%x TrId: %i CMTS: %s\n", gateid, recvtrid, cmts->name);</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                                 gate->state = GATE_DELETED;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                                  PKTCCOPS_DESTROY_CURRENT_GATE;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                          }</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                               gate->in_transaction = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                            break;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                  }</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                               }</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                               AST_LIST_TRAVERSE_SAFE_END;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                             AST_LIST_UNLOCK(&gate_list);</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                        }</span><br><span style="color: hsl(0, 100%, 40%);">-                                                               }</span><br><span style="color: hsl(0, 100%, 40%);">-                                                               pobject = pobject->next;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                     }</span><br><span style="color: hsl(0, 100%, 40%);">-                                               }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                                               if (recmsg->opcode == 6 && recmsg->object && recmsg->object->cnum == 11 && recmsg->object->ctype == 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                      ast_debug(3, "COPS: Client open %s\n", cmts->name);</span><br><span style="color: hsl(0, 100%, 40%);">-                                                        sendmsg->msg = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                 sendmsg->verflag = 0x10;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                     sendmsg->opcode = 7; /* Client Accept */</span><br><span style="color: hsl(0, 100%, 40%);">-                                                     sendmsg->clienttype = 0x8008; /* =PacketCable */</span><br><span style="color: hsl(0, 100%, 40%);">-                                                     sendmsg->length = COPS_HEADER_SIZE + COPS_OBJECT_HEADER_SIZE + 4;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                    sendmsg->object = ast_malloc(sizeof(struct pktcobj));</span><br><span style="color: hsl(0, 100%, 40%);">-                                                        sendmsg->object->length = 4 + COPS_OBJECT_HEADER_SIZE;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                    sendmsg->object->cnum = 10; /* keppalive timer*/</span><br><span style="color: hsl(0, 100%, 40%);">-                                                  sendmsg->object->ctype = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                       sendmsg->object->contents = ast_malloc(sizeof(uint32_t));</span><br><span style="color: hsl(0, 100%, 40%);">-                                                 *((uint32_t *) sendmsg->object->contents) = htonl(cmts->keepalive & 0x0000ffff);</span><br><span style="color: hsl(0, 100%, 40%);">-                                                   sendmsg->object->next = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                     cops_sendmsg(cmts->sfd, sendmsg);</span><br><span style="color: hsl(0, 100%, 40%);">-                                                    cops_freemsg(sendmsg);</span><br><span style="color: hsl(0, 100%, 40%);">-                                          } else if (recmsg->opcode == 9) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                    ast_debug(3, "COPS: Keepalive Request got echoing back %s\n", cmts->name);</span><br><span style="color: hsl(0, 100%, 40%);">-                                                 cops_sendmsg(cmts->sfd, recmsg);</span><br><span style="color: hsl(0, 100%, 40%);">-                                                     cmts->state = 2;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                     cmts->katimer = time(NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-                                          }</span><br><span style="color: hsl(0, 100%, 40%);">-                                       }</span><br><span style="color: hsl(0, 100%, 40%);">-                                       if (len <= 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                              ast_debug(3, "COPS: lost connection to %s\n", cmts->name);</span><br><span style="color: hsl(0, 100%, 40%);">-                                         close(cmts->sfd);</span><br><span style="color: hsl(0, 100%, 40%);">-                                            cmts->sfd = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-                                              cmts->state = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                                     }</span><br><span style="color: hsl(0, 100%, 40%);">-                                       cops_freemsg(recmsg);</span><br><span style="color: hsl(0, 100%, 40%);">-                           }</span><br><span style="color: hsl(0, 100%, 40%);">-                       }</span><br><span style="color: hsl(0, 100%, 40%);">-                       AST_LIST_UNLOCK(&cmts_list);</span><br><span style="color: hsl(0, 100%, 40%);">-                }</span><br><span style="color: hsl(0, 100%, 40%);">-               if (pktcreload) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       ast_debug(3, "Reloading pktccops...\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                      AST_LIST_LOCK(&gate_list);</span><br><span style="color: hsl(0, 100%, 40%);">-                  AST_LIST_LOCK(&cmts_list);</span><br><span style="color: hsl(0, 100%, 40%);">-                  pktccops_unregister_ippools();</span><br><span style="color: hsl(0, 100%, 40%);">-                  AST_LIST_TRAVERSE(&cmts_list, cmts, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-                         cmts->need_delete = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-                       }</span><br><span style="color: hsl(0, 100%, 40%);">-                       load_pktccops_config();</span><br><span style="color: hsl(0, 100%, 40%);">-                 AST_LIST_TRAVERSE_SAFE_BEGIN(&cmts_list, cmts, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-                              if (cmts && cmts->need_delete) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                     AST_LIST_TRAVERSE(&gate_list, gate, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                         if (gate->cmts == cmts) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                    ast_debug(3, "Null gate %s\n", gate->cmts->name);</span><br><span style="color: hsl(0, 100%, 40%);">-                                                       gate->cmts = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-                                           }</span><br><span style="color: hsl(0, 100%, 40%);">-                                               gate->in_transaction = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                                    }</span><br><span style="color: hsl(0, 100%, 40%);">-                                       AST_LIST_UNLOCK(&gate_list);</span><br><span style="color: hsl(0, 100%, 40%);">-                                        ast_debug(3, "removing cmts: %s\n", cmts->name);</span><br><span style="color: hsl(0, 100%, 40%);">-                                   if (cmts->sfd > 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                              close(cmts->sfd);</span><br><span style="color: hsl(0, 100%, 40%);">-                                    }</span><br><span style="color: hsl(0, 100%, 40%);">-                                       AST_LIST_REMOVE_CURRENT(list);</span><br><span style="color: hsl(0, 100%, 40%);">-                                  ast_free(cmts);</span><br><span style="color: hsl(0, 100%, 40%);">-                         }</span><br><span style="color: hsl(0, 100%, 40%);">-                       }</span><br><span style="color: hsl(0, 100%, 40%);">-                       AST_LIST_TRAVERSE_SAFE_END;</span><br><span style="color: hsl(0, 100%, 40%);">-                     AST_LIST_UNLOCK(&cmts_list);</span><br><span style="color: hsl(0, 100%, 40%);">-                        AST_LIST_UNLOCK(&gate_list);</span><br><span style="color: hsl(0, 100%, 40%);">-                        pktcreload = 2;</span><br><span style="color: hsl(0, 100%, 40%);">-         }</span><br><span style="color: hsl(0, 100%, 40%);">-               pthread_testcancel();</span><br><span style="color: hsl(0, 100%, 40%);">-   }</span><br><span style="color: hsl(0, 100%, 40%);">-       return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int restart_pktc_thread(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      if (pktccops_thread == AST_PTHREADT_STOP) {</span><br><span style="color: hsl(0, 100%, 40%);">-             return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-       if (ast_mutex_lock(&pktccops_lock)) {</span><br><span style="color: hsl(0, 100%, 40%);">-               ast_log(LOG_WARNING, "Unable to lock pktccops\n");</span><br><span style="color: hsl(0, 100%, 40%);">-            return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-       if (pktccops_thread == pthread_self()) {</span><br><span style="color: hsl(0, 100%, 40%);">-                ast_mutex_unlock(&pktccops_lock);</span><br><span style="color: hsl(0, 100%, 40%);">-           ast_log(LOG_WARNING, "Cannot kill myself\n");</span><br><span style="color: hsl(0, 100%, 40%);">-         return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-       if (pktccops_thread != AST_PTHREADT_NULL) {</span><br><span style="color: hsl(0, 100%, 40%);">-             /* Wake up the thread */</span><br><span style="color: hsl(0, 100%, 40%);">-                pthread_kill(pktccops_thread, SIGURG);</span><br><span style="color: hsl(0, 100%, 40%);">-  } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                /* Start a new monitor */</span><br><span style="color: hsl(0, 100%, 40%);">-               if (ast_pthread_create_background(&pktccops_thread, NULL, do_pktccops, NULL) < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      ast_mutex_unlock(&pktccops_lock);</span><br><span style="color: hsl(0, 100%, 40%);">-                   ast_log(LOG_ERROR, "Unable to start monitor thread.\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                      return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-       ast_mutex_unlock(&pktccops_lock);</span><br><span style="color: hsl(0, 100%, 40%);">-   return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int load_pktccops_config(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        static char *cfg = "res_pktccops.conf";</span><br><span style="color: hsl(0, 100%, 40%);">-       struct ast_config *config;</span><br><span style="color: hsl(0, 100%, 40%);">-      struct ast_variable *v;</span><br><span style="color: hsl(0, 100%, 40%);">- struct cops_cmts *cmts;</span><br><span style="color: hsl(0, 100%, 40%);">- struct cops_ippool *new_ippool;</span><br><span style="color: hsl(0, 100%, 40%);">- const char *host, *cat, *port;</span><br><span style="color: hsl(0, 100%, 40%);">-  int update;</span><br><span style="color: hsl(0, 100%, 40%);">-     int res = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-    uint16_t t1_temp, t7_temp, t8_temp;</span><br><span style="color: hsl(0, 100%, 40%);">-     uint32_t keepalive_temp;</span><br><span style="color: hsl(0, 100%, 40%);">-        unsigned int a,b,c,d,e,f,g,h;</span><br><span style="color: hsl(0, 100%, 40%);">-   struct ast_flags config_flags = {0};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    if (!(config = ast_config_load(cfg, config_flags))) {</span><br><span style="color: hsl(0, 100%, 40%);">-           ast_log(LOG_WARNING, "Unable to load config file res_pktccops.conf\n");</span><br><span style="color: hsl(0, 100%, 40%);">-               return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-       for (cat = ast_category_browse(config, NULL); cat; cat = ast_category_browse(config, cat)) {</span><br><span style="color: hsl(0, 100%, 40%);">-            if (!strcmp(cat, "general")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        for (v = ast_variable_browse(config, cat); v; v = v->next) {</span><br><span style="color: hsl(0, 100%, 40%);">-                         if (!strcasecmp(v->name, "t1")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                  t1 = atoi(v->value);</span><br><span style="color: hsl(0, 100%, 40%);">-                         } else if (!strcasecmp(v->name, "t7")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                   t7 = atoi(v->value);</span><br><span style="color: hsl(0, 100%, 40%);">-                         } else if (!strcasecmp(v->name, "t8")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                   t8 = atoi(v->value);</span><br><span style="color: hsl(0, 100%, 40%);">-                         } else if (!strcasecmp(v->name, "keepalive")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                    keepalive = atoi(v->value);</span><br><span style="color: hsl(0, 100%, 40%);">-                          } else if (!strcasecmp(v->name, "gateinfoperiod")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                       gateinfoperiod = atoi(v->value);</span><br><span style="color: hsl(0, 100%, 40%);">-                             } else if (!strcasecmp(v->name, "gatetimeout")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                  gatetimeout = atoi(v->value);</span><br><span style="color: hsl(0, 100%, 40%);">-                                } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                        ast_log(LOG_WARNING, "Unkown option %s in general section of res_ptkccops.conf\n", v->name);</span><br><span style="color: hsl(0, 100%, 40%);">-                               }</span><br><span style="color: hsl(0, 100%, 40%);">-                       }</span><br><span style="color: hsl(0, 100%, 40%);">-               } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        /* Defaults */</span><br><span style="color: hsl(0, 100%, 40%);">-                  host = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-                    port = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-                    t1_temp = t1;</span><br><span style="color: hsl(0, 100%, 40%);">-                   t7_temp = t7;</span><br><span style="color: hsl(0, 100%, 40%);">-                   t8_temp = t8;</span><br><span style="color: hsl(0, 100%, 40%);">-                   keepalive_temp = keepalive;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                     for (v = ast_variable_browse(config, cat); v; v = v->next) {</span><br><span style="color: hsl(0, 100%, 40%);">-                         if (!strcasecmp(v->name, "host")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                        host = v->value;</span><br><span style="color: hsl(0, 100%, 40%);">-                             } else if (!strcasecmp(v->name, "port")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                 port = v->value;</span><br><span style="color: hsl(0, 100%, 40%);">-                             } else if (!strcasecmp(v->name, "t1")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                   t1_temp = atoi(v->value);</span><br><span style="color: hsl(0, 100%, 40%);">-                            } else if (!strcasecmp(v->name, "t7")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                   t7_temp = atoi(v->value);</span><br><span style="color: hsl(0, 100%, 40%);">-                            } else if (!strcasecmp(v->name, "t8")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                   t8_temp = atoi(v->value);</span><br><span style="color: hsl(0, 100%, 40%);">-                            } else if (!strcasecmp(v->name, "keepalive")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                    keepalive_temp = atoi(v->value);</span><br><span style="color: hsl(0, 100%, 40%);">-                             } else if (!strcasecmp(v->name, "pool")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                 /* we weill parse it in 2nd round */</span><br><span style="color: hsl(0, 100%, 40%);">-                            } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                        ast_log(LOG_WARNING, "Unkown option %s in res_ptkccops.conf\n", v->name);</span><br><span style="color: hsl(0, 100%, 40%);">-                          }</span><br><span style="color: hsl(0, 100%, 40%);">-                       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                       update = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                     AST_LIST_TRAVERSE(&cmts_list, cmts, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-                         if (!strcmp(cmts->name, cat)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                      update = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-                                     break;</span><br><span style="color: hsl(0, 100%, 40%);">-                          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                       }</span><br><span style="color: hsl(0, 100%, 40%);">-                       if (!update) {</span><br><span style="color: hsl(0, 100%, 40%);">-                          cmts = ast_calloc(1, sizeof(*cmts));</span><br><span style="color: hsl(0, 100%, 40%);">-                            if (!cmts) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                    res = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-                                       break;</span><br><span style="color: hsl(0, 100%, 40%);">-                          }</span><br><span style="color: hsl(0, 100%, 40%);">-                               AST_LIST_INSERT_HEAD(&cmts_list, cmts, list);</span><br><span style="color: hsl(0, 100%, 40%);">-                       }</span><br><span style="color: hsl(0, 100%, 40%);">-                       if (cat) {</span><br><span style="color: hsl(0, 100%, 40%);">-                              ast_copy_string(cmts->name, cat, sizeof(cmts->name));</span><br><span style="color: hsl(0, 100%, 40%);">-                     }</span><br><span style="color: hsl(0, 100%, 40%);">-                       if (host) {</span><br><span style="color: hsl(0, 100%, 40%);">-                             ast_copy_string(cmts->host, host, sizeof(cmts->host));</span><br><span style="color: hsl(0, 100%, 40%);">-                    }</span><br><span style="color: hsl(0, 100%, 40%);">-                       if (port) {</span><br><span style="color: hsl(0, 100%, 40%);">-                             ast_copy_string(cmts->port, port, sizeof(cmts->port));</span><br><span style="color: hsl(0, 100%, 40%);">-                    } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                ast_copy_string(cmts->port, DEFAULT_COPS_PORT, sizeof(cmts->port));</span><br><span style="color: hsl(0, 100%, 40%);">-                       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                       cmts->t1 = t1_temp;</span><br><span style="color: hsl(0, 100%, 40%);">-                  cmts->t7 = t7_temp;</span><br><span style="color: hsl(0, 100%, 40%);">-                  cmts->t8 = t8_temp;</span><br><span style="color: hsl(0, 100%, 40%);">-                  cmts->keepalive = keepalive_temp;</span><br><span style="color: hsl(0, 100%, 40%);">-                    if (!update) {</span><br><span style="color: hsl(0, 100%, 40%);">-                          cmts->state = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                             cmts->sfd = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-                      }</span><br><span style="color: hsl(0, 100%, 40%);">-                       cmts->need_delete = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                       for (v = ast_variable_browse(config, cat); v; v = v->next) {</span><br><span style="color: hsl(0, 100%, 40%);">-                         /* parse ipppol when we have cmts ptr */</span><br><span style="color: hsl(0, 100%, 40%);">-                                if (!strcasecmp(v->name, "pool")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                        if (sscanf(v->value, "%3u.%3u.%3u.%3u %3u.%3u.%3u.%3u", &a, &b, &c, &d, &e, &f, &g, &h) == 8) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                            new_ippool = ast_calloc(1, sizeof(*new_ippool));</span><br><span style="color: hsl(0, 100%, 40%);">-                                                if (!new_ippool) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                      res = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                       break;</span><br><span style="color: hsl(0, 100%, 40%);">-                                          }</span><br><span style="color: hsl(0, 100%, 40%);">-                                               new_ippool->start = a << 24 | b << 16 | c << 8 | d;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                new_ippool->stop = e << 24 | f << 16 | g << 8 | h;</span><br><span style="color: hsl(0, 100%, 40%);">-                                         new_ippool->cmts = cmts;</span><br><span style="color: hsl(0, 100%, 40%);">-                                             pktccops_add_ippool(new_ippool);</span><br><span style="color: hsl(0, 100%, 40%);">-                                        } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                ast_log(LOG_WARNING, "Invalid ip pool format in res_pktccops.conf\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                                        }</span><br><span style="color: hsl(0, 100%, 40%);">-                               }</span><br><span style="color: hsl(0, 100%, 40%);">-                       }</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-       ast_config_destroy(config);</span><br><span style="color: hsl(0, 100%, 40%);">-     return res;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static char *pktccops_show_cmtses(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        struct cops_cmts *cmts;</span><br><span style="color: hsl(0, 100%, 40%);">- char statedesc[16];</span><br><span style="color: hsl(0, 100%, 40%);">-     int katimer;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    switch(cmd) {</span><br><span style="color: hsl(0, 100%, 40%);">-   case CLI_INIT:</span><br><span style="color: hsl(0, 100%, 40%);">-          e->command = "pktccops show cmtses";</span><br><span style="color: hsl(0, 100%, 40%);">-               e->usage =</span><br><span style="color: hsl(0, 100%, 40%);">-                   "Usage: pktccops show cmtses\n"</span><br><span style="color: hsl(0, 100%, 40%);">-                       "       List PacketCable COPS CMTSes.\n";</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-             return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    case CLI_GENERATE:</span><br><span style="color: hsl(0, 100%, 40%);">-              return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       ast_cli(a->fd, "%-16s %-24s %-12s %7s\n", "Name        ", "Host                ", "Status    ", "KA timer  ");</span><br><span style="color: hsl(0, 100%, 40%);">-     ast_cli(a->fd, "%-16s %-24s %-12s %7s\n", "------------", "--------------------", "----------", "-----------");</span><br><span style="color: hsl(0, 100%, 40%);">-    AST_LIST_LOCK(&cmts_list);</span><br><span style="color: hsl(0, 100%, 40%);">-  AST_LIST_TRAVERSE(&cmts_list, cmts, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-         katimer = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-           if (cmts->state == 2) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      ast_copy_string(statedesc, "Connected", sizeof(statedesc));</span><br><span style="color: hsl(0, 100%, 40%);">-                   katimer = (int) (time(NULL) - cmts->katimer);</span><br><span style="color: hsl(0, 100%, 40%);">-                } else if (cmts->state == 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       ast_copy_string(statedesc, "Connecting", sizeof(statedesc));</span><br><span style="color: hsl(0, 100%, 40%);">-          } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        ast_copy_string(statedesc, "N/A", sizeof(statedesc));</span><br><span style="color: hsl(0, 100%, 40%);">-         }</span><br><span style="color: hsl(0, 100%, 40%);">-               ast_cli(a->fd, "%-16s %-15s:%-8s %-12s %-7d\n", cmts->name, cmts->host, cmts->port, statedesc, katimer);</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-       AST_LIST_UNLOCK(&cmts_list);</span><br><span style="color: hsl(0, 100%, 40%);">-        return CLI_SUCCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static char *pktccops_show_gates(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct cops_gate *gate;</span><br><span style="color: hsl(0, 100%, 40%);">- char state_desc[16];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    switch(cmd) {</span><br><span style="color: hsl(0, 100%, 40%);">-   case CLI_INIT:</span><br><span style="color: hsl(0, 100%, 40%);">-          e->command = "pktccops show gates";</span><br><span style="color: hsl(0, 100%, 40%);">-                e->usage =</span><br><span style="color: hsl(0, 100%, 40%);">-                   "Usage: pktccops show gates\n"</span><br><span style="color: hsl(0, 100%, 40%);">-                        "       List PacketCable COPS GATEs.\n";</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-              return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    case CLI_GENERATE:</span><br><span style="color: hsl(0, 100%, 40%);">-              return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       ast_cli(a->fd, "%-16s %-12s %-12s %-10s %-10s %-10s\n" ,"CMTS", "Gate-Id","MTA", "Status", "AllocTime", "CheckTime");</span><br><span style="color: hsl(0, 100%, 40%);">-  ast_cli(a->fd, "%-16s %-12s %-12s %-10s %-10s %-10s\n" ,"--------------" ,"----------", "----------", "--------", "--------", "--------\n");</span><br><span style="color: hsl(0, 100%, 40%);">-   AST_LIST_LOCK(&cmts_list);</span><br><span style="color: hsl(0, 100%, 40%);">-  AST_LIST_LOCK(&gate_list);</span><br><span style="color: hsl(0, 100%, 40%);">-  AST_LIST_TRAVERSE(&gate_list, gate, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-         if (gate->state == GATE_ALLOC_FAILED) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      ast_copy_string(state_desc, "Failed", sizeof(state_desc));</span><br><span style="color: hsl(0, 100%, 40%);">-            } else if (gate->state == GATE_ALLOC_PROGRESS) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     ast_copy_string(state_desc, "In Progress", sizeof(state_desc));</span><br><span style="color: hsl(0, 100%, 40%);">-               } else if (gate->state == GATE_ALLOCATED) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  ast_copy_string(state_desc, "Allocated", sizeof(state_desc));</span><br><span style="color: hsl(0, 100%, 40%);">-         } else if (gate->state == GATE_CLOSED) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     ast_copy_string(state_desc, "Closed", sizeof(state_desc));</span><br><span style="color: hsl(0, 100%, 40%);">-            } else if (gate->state == GATE_CLOSED_ERR) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 ast_copy_string(state_desc, "ClosedErr", sizeof(state_desc));</span><br><span style="color: hsl(0, 100%, 40%);">-         } else if (gate->state == GATE_OPEN) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       ast_copy_string(state_desc, "Open", sizeof(state_desc));</span><br><span style="color: hsl(0, 100%, 40%);">-              } else if (gate->state == GATE_DELETED) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    ast_copy_string(state_desc, "Deleted", sizeof(state_desc));</span><br><span style="color: hsl(0, 100%, 40%);">-           } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        ast_copy_string(state_desc, "N/A", sizeof(state_desc));</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               ast_cli(a->fd, "%-16s 0x%.8x   0x%08x   %-10s %10i %10i %u\n", (gate->cmts) ? gate->cmts->name : "null" , gate->gateid, gate->mta,</span><br><span style="color: hsl(0, 100%, 40%);">-                        state_desc, (int) (time(NULL) - gate->allocated), (gate->checked) ? (int) (time(NULL) - gate->checked) : 0, (unsigned int) gate->in_transaction);</span><br><span style="color: hsl(0, 100%, 40%);">-   }</span><br><span style="color: hsl(0, 100%, 40%);">-       AST_LIST_UNLOCK(&cmts_list);</span><br><span style="color: hsl(0, 100%, 40%);">-        AST_LIST_UNLOCK(&gate_list);</span><br><span style="color: hsl(0, 100%, 40%);">-        return CLI_SUCCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static char *pktccops_show_pools(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct cops_ippool *ippool;</span><br><span style="color: hsl(0, 100%, 40%);">-     char start[32];</span><br><span style="color: hsl(0, 100%, 40%);">- char stop[32];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  switch(cmd) {</span><br><span style="color: hsl(0, 100%, 40%);">-   case CLI_INIT:</span><br><span style="color: hsl(0, 100%, 40%);">-          e->command = "pktccops show pools";</span><br><span style="color: hsl(0, 100%, 40%);">-                e->usage =</span><br><span style="color: hsl(0, 100%, 40%);">-                   "Usage: pktccops show pools\n"</span><br><span style="color: hsl(0, 100%, 40%);">-                        "       List PacketCable COPS ip pools of MTAs.\n";</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-           return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    case CLI_GENERATE:</span><br><span style="color: hsl(0, 100%, 40%);">-              return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       ast_cli(a->fd, "%-16s %-18s %-7s\n", "Start     ", "Stop      ", "CMTS    ");</span><br><span style="color: hsl(0, 100%, 40%);">-        ast_cli(a->fd, "%-16s %-18s %-7s\n", "----------", "----------", "--------");</span><br><span style="color: hsl(0, 100%, 40%);">-        AST_LIST_LOCK(&ippool_list);</span><br><span style="color: hsl(0, 100%, 40%);">-        AST_LIST_TRAVERSE(&ippool_list, ippool, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-             snprintf(start, sizeof(start), "%3u.%3u.%3u.%3u", ippool->start >> 24, (ippool->start >> 16) & 0x000000ff, (ippool->start >> 8) & 0x000000ff, ippool->start & 0x000000ff);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          snprintf(stop, sizeof(stop), "%3u.%3u.%3u.%3u", ippool->stop >> 24, (ippool->stop >> 16) & 0x000000ff, (ippool->stop >> 8) & 0x000000ff, ippool->stop & 0x000000ff);</span><br><span style="color: hsl(0, 100%, 40%);">-                ast_cli(a->fd, "%-16s %-18s %-16s\n", start, stop, ippool->cmts->name);</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-       AST_LIST_UNLOCK(&ippool_list);</span><br><span style="color: hsl(0, 100%, 40%);">-      return CLI_SUCCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static char *pktccops_gatedel(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    int found = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-  int trid;</span><br><span style="color: hsl(0, 100%, 40%);">-       uint32_t gateid;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct cops_gate *gate;</span><br><span style="color: hsl(0, 100%, 40%);">- struct cops_cmts *cmts;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- switch (cmd) {</span><br><span style="color: hsl(0, 100%, 40%);">-  case CLI_INIT:</span><br><span style="color: hsl(0, 100%, 40%);">-          e->command = "pktccops gatedel";</span><br><span style="color: hsl(0, 100%, 40%);">-           e->usage =</span><br><span style="color: hsl(0, 100%, 40%);">-                   "Usage: pktccops gatedel <cmts> <gateid>\n"</span><br><span style="color: hsl(0, 100%, 40%);">-                       "       Send Gate-Del to cmts.\n";</span><br><span style="color: hsl(0, 100%, 40%);">-            return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    case CLI_GENERATE:</span><br><span style="color: hsl(0, 100%, 40%);">-              return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (a->argc < 4)</span><br><span style="color: hsl(0, 100%, 40%);">-          return CLI_SHOWUSAGE;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   AST_LIST_LOCK(&cmts_list);</span><br><span style="color: hsl(0, 100%, 40%);">-  AST_LIST_TRAVERSE(&cmts_list, cmts, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-         if (!strcmp(cmts->name, a->argv[2])) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    ast_cli(a->fd, "Found cmts: %s\n", cmts->name);</span><br><span style="color: hsl(0, 100%, 40%);">-                 found = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-                      break;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-       AST_LIST_UNLOCK(&cmts_list);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (!found)</span><br><span style="color: hsl(0, 100%, 40%);">-             return CLI_SHOWUSAGE;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   trid = cops_trid++;</span><br><span style="color: hsl(0, 100%, 40%);">-     if (!sscanf(a->argv[3], "%x", &gateid)) {</span><br><span style="color: hsl(0, 100%, 40%);">-              ast_cli(a->fd, "bad gate specification (%s)\n", a->argv[3]);</span><br><span style="color: hsl(0, 100%, 40%);">-            return CLI_SHOWUSAGE;</span><br><span style="color: hsl(0, 100%, 40%);">-   }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       found = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-      AST_LIST_LOCK(&gate_list);</span><br><span style="color: hsl(0, 100%, 40%);">-  AST_LIST_TRAVERSE(&gate_list, gate, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-         if (gate->gateid == gateid && gate->cmts == cmts) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       found = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-                      break;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (!found) {</span><br><span style="color: hsl(0, 100%, 40%);">-           ast_cli(a->fd, "gate not found: %s\n", a->argv[3]);</span><br><span style="color: hsl(0, 100%, 40%);">-             return CLI_SHOWUSAGE;</span><br><span style="color: hsl(0, 100%, 40%);">-   }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       AST_LIST_UNLOCK(&gate_list);</span><br><span style="color: hsl(0, 100%, 40%);">-        cops_gate_cmd(GATE_DEL, cmts, trid, 0, 0, 0, 0, 0, 0, gate);</span><br><span style="color: hsl(0, 100%, 40%);">-    return CLI_SUCCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static char *pktccops_gateset(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    int foundcmts = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-      int trid;</span><br><span style="color: hsl(0, 100%, 40%);">-       unsigned int an,bn,cn,dn;</span><br><span style="color: hsl(0, 100%, 40%);">-       uint32_t mta, ssip;</span><br><span style="color: hsl(0, 100%, 40%);">-     struct cops_cmts *cmts;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- switch (cmd) {</span><br><span style="color: hsl(0, 100%, 40%);">-  case CLI_INIT:</span><br><span style="color: hsl(0, 100%, 40%);">-          e->command = "pktccops gateset";</span><br><span style="color: hsl(0, 100%, 40%);">-           e->usage =</span><br><span style="color: hsl(0, 100%, 40%);">-                   "Usage: pktccops gateset <cmts> <mta> <actcount> <bitrate> <packet size> <switch ip> <switch port>\n"</span><br><span style="color: hsl(0, 100%, 40%);">-                       "       Send Gate-Set to cmts.\n";</span><br><span style="color: hsl(0, 100%, 40%);">-            return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    case CLI_GENERATE:</span><br><span style="color: hsl(0, 100%, 40%);">-              return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (a->argc < 9)</span><br><span style="color: hsl(0, 100%, 40%);">-          return CLI_SHOWUSAGE;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   if (!strcmp(a->argv[2], "null")) {</span><br><span style="color: hsl(0, 100%, 40%);">-         cmts = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                AST_LIST_LOCK(&cmts_list);</span><br><span style="color: hsl(0, 100%, 40%);">-          AST_LIST_TRAVERSE(&cmts_list, cmts, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 if (!strcmp(cmts->name, a->argv[2])) {</span><br><span style="color: hsl(0, 100%, 40%);">-                            ast_cli(a->fd, "Found cmts: %s\n", cmts->name);</span><br><span style="color: hsl(0, 100%, 40%);">-                         foundcmts = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-                          break;</span><br><span style="color: hsl(0, 100%, 40%);">-                  }</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-               AST_LIST_UNLOCK(&cmts_list);</span><br><span style="color: hsl(0, 100%, 40%);">-                if (!foundcmts) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       ast_cli(a->fd, "CMTS not found: %s\n", a->argv[2]);</span><br><span style="color: hsl(0, 100%, 40%);">-                     return CLI_SHOWUSAGE;</span><br><span style="color: hsl(0, 100%, 40%);">-           }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       trid = cops_trid++;</span><br><span style="color: hsl(0, 100%, 40%);">-     if (sscanf(a->argv[3], "%3u.%3u.%3u.%3u", &an, &bn, &cn, &dn) != 4) {</span><br><span style="color: hsl(0, 100%, 40%);">-              ast_cli(a->fd, "MTA specification (%s) does not look like an ipaddr\n", a->argv[3]);</span><br><span style="color: hsl(0, 100%, 40%);">-            return CLI_SHOWUSAGE;</span><br><span style="color: hsl(0, 100%, 40%);">-   }</span><br><span style="color: hsl(0, 100%, 40%);">-       mta = an << 24 | bn << 16 | cn << 8 | dn;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     if (sscanf(a->argv[7], "%3u.%3u.%3u.%3u", &an, &bn, &cn, &dn) != 4) {</span><br><span style="color: hsl(0, 100%, 40%);">-              ast_cli(a->fd, "SSIP specification (%s) does not look like an ipaddr\n", a->argv[7]);</span><br><span style="color: hsl(0, 100%, 40%);">-           return CLI_SHOWUSAGE;</span><br><span style="color: hsl(0, 100%, 40%);">-   }</span><br><span style="color: hsl(0, 100%, 40%);">-       ssip = an << 24 | bn << 16 | cn << 8 | dn;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    cops_gate_cmd(GATE_SET, cmts, trid, mta, atoi(a->argv[4]), atof(a->argv[5]), atoi(a->argv[6]), ssip, atoi(a->argv[8]), NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-       return CLI_SUCCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static struct ast_cli_entry cli_pktccops[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-      AST_CLI_DEFINE(pktccops_show_cmtses, "List PacketCable COPS CMTSes"),</span><br><span style="color: hsl(0, 100%, 40%);">- AST_CLI_DEFINE(pktccops_show_gates, "List PacketCable COPS GATEs"),</span><br><span style="color: hsl(0, 100%, 40%);">-   AST_CLI_DEFINE(pktccops_show_pools, "List PacketCable MTA pools"),</span><br><span style="color: hsl(0, 100%, 40%);">-    AST_CLI_DEFINE(pktccops_gateset, "Send Gate-Set to cmts"),</span><br><span style="color: hsl(0, 100%, 40%);">-    AST_CLI_DEFINE(pktccops_gatedel, "Send Gate-Det to cmts"),</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int pktccops_add_ippool(struct cops_ippool *ippool)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       if (ippool) {</span><br><span style="color: hsl(0, 100%, 40%);">-           AST_LIST_LOCK(&ippool_list);</span><br><span style="color: hsl(0, 100%, 40%);">-                AST_LIST_INSERT_HEAD(&ippool_list, ippool, list);</span><br><span style="color: hsl(0, 100%, 40%);">-           AST_LIST_UNLOCK(&ippool_list);</span><br><span style="color: hsl(0, 100%, 40%);">-              return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-       } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                ast_log(LOG_WARNING, "Attempted to register NULL ippool?\n");</span><br><span style="color: hsl(0, 100%, 40%);">-         return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void pktccops_unregister_cmtses(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct cops_cmts *cmts;</span><br><span style="color: hsl(0, 100%, 40%);">- struct cops_gate *gate;</span><br><span style="color: hsl(0, 100%, 40%);">- AST_LIST_LOCK(&cmts_list);</span><br><span style="color: hsl(0, 100%, 40%);">-  while ((cmts = AST_LIST_REMOVE_HEAD(&cmts_list, list))) {</span><br><span style="color: hsl(0, 100%, 40%);">-           if (cmts->sfd > 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      close(cmts->sfd);</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-               ast_free(cmts);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-       AST_LIST_UNLOCK(&cmts_list);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        AST_LIST_LOCK(&gate_list);</span><br><span style="color: hsl(0, 100%, 40%);">-  while ((gate = AST_LIST_REMOVE_HEAD(&gate_list, list))) {</span><br><span style="color: hsl(0, 100%, 40%);">-           ast_free(gate);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-       AST_LIST_UNLOCK(&gate_list);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void pktccops_unregister_ippools(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct cops_ippool *ippool;</span><br><span style="color: hsl(0, 100%, 40%);">-     AST_LIST_LOCK(&ippool_list);</span><br><span style="color: hsl(0, 100%, 40%);">-        while ((ippool = AST_LIST_REMOVE_HEAD(&ippool_list, list))) {</span><br><span style="color: hsl(0, 100%, 40%);">-               ast_free(ippool);</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-       AST_LIST_UNLOCK(&ippool_list);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int load_module(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        int res;</span><br><span style="color: hsl(0, 100%, 40%);">-        AST_LIST_LOCK(&cmts_list);</span><br><span style="color: hsl(0, 100%, 40%);">-  res = load_pktccops_config();</span><br><span style="color: hsl(0, 100%, 40%);">-   AST_LIST_UNLOCK(&cmts_list);</span><br><span style="color: hsl(0, 100%, 40%);">-        if (res == -1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                return AST_MODULE_LOAD_DECLINE;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-       ast_cli_register_multiple(cli_pktccops, sizeof(cli_pktccops) / sizeof(struct ast_cli_entry));</span><br><span style="color: hsl(0, 100%, 40%);">-   restart_pktc_thread();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int unload_module(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       if (!ast_mutex_lock(&pktccops_lock)) {</span><br><span style="color: hsl(0, 100%, 40%);">-              if ((pktccops_thread != AST_PTHREADT_NULL) && (pktccops_thread != AST_PTHREADT_STOP)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 pthread_cancel(pktccops_thread);</span><br><span style="color: hsl(0, 100%, 40%);">-                        pthread_kill(pktccops_thread, SIGURG);</span><br><span style="color: hsl(0, 100%, 40%);">-                  pthread_join(pktccops_thread, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-               pktccops_thread = AST_PTHREADT_STOP;</span><br><span style="color: hsl(0, 100%, 40%);">-            ast_mutex_unlock(&pktccops_lock);</span><br><span style="color: hsl(0, 100%, 40%);">-   } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                ast_log(LOG_ERROR, "Unable to lock the pktccops_thread\n");</span><br><span style="color: hsl(0, 100%, 40%);">-           return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       ast_cli_unregister_multiple(cli_pktccops, sizeof(cli_pktccops) / sizeof(struct ast_cli_entry));</span><br><span style="color: hsl(0, 100%, 40%);">- pktccops_unregister_cmtses();</span><br><span style="color: hsl(0, 100%, 40%);">-   pktccops_unregister_ippools();</span><br><span style="color: hsl(0, 100%, 40%);">-  pktccops_thread = AST_PTHREADT_NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int reload_module(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Prohibit unloading */</span><br><span style="color: hsl(0, 100%, 40%);">-        if (pktcreload) {</span><br><span style="color: hsl(0, 100%, 40%);">-               ast_log(LOG_NOTICE, "Previous reload in progress, please wait!\n");</span><br><span style="color: hsl(0, 100%, 40%);">-           return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-       pktcreload = 1;</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_GLOBAL_SYMBOLS, "PktcCOPS manager for MGCP",</span><br><span style="color: hsl(0, 100%, 40%);">-  .support_level = AST_MODULE_SUPPORT_DEPRECATED,</span><br><span style="color: hsl(0, 100%, 40%);">- .load = load_module,</span><br><span style="color: hsl(0, 100%, 40%);">-    .unload = unload_module,</span><br><span style="color: hsl(0, 100%, 40%);">-        .reload = reload_module,</span><br><span style="color: hsl(0, 100%, 40%);">-);</span><br><span>diff --git a/res/res_pktccops.exports.in b/res/res_pktccops.exports.in</span><br><span>deleted file mode 100644</span><br><span>index 1892e5b..0000000</span><br><span>--- a/res/res_pktccops.exports.in</span><br><span>+++ /dev/null</span><br><span>@@ -1,6 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  global:</span><br><span style="color: hsl(0, 100%, 40%);">-         LINKER_SYMBOL_PREFIXast_pktccops_gate_alloc;</span><br><span style="color: hsl(0, 100%, 40%);">-    local:</span><br><span style="color: hsl(0, 100%, 40%);">-          *;</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span>diff --git a/tests/CI/buildAsterisk.sh b/tests/CI/buildAsterisk.sh</span><br><span>index 6d06f05..c4c8d51 100755</span><br><span>--- a/tests/CI/buildAsterisk.sh</span><br><span>+++ b/tests/CI/buildAsterisk.sh</span><br><span>@@ -162,7 +162,7 @@</span><br><span>          mod_disables+=" func_callcompletion func_version func_rand func_sha1 func_module func_md5"</span><br><span>                 mod_disables+=" pbx_dundi pbx_loopback"</span><br><span>            mod_disables+=" res_ael_share res_calendar res_config_ldap res_config_pgsql res_corosync"</span><br><span style="color: hsl(0, 100%, 40%);">-             mod_disables+=" res_http_post res_pktccops res_rtp_multicast res_snmp res_xmpp"</span><br><span style="color: hsl(120, 100%, 40%);">+             mod_disables+=" res_http_post res_rtp_multicast res_snmp res_xmpp"</span><br><span>         fi</span><br><span> </span><br><span>       runner menuselect/menuselect `gen_mods disable $mod_disables` menuselect.makeopts</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.asterisk.org/c/asterisk/+/19565">change 19565</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.asterisk.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.asterisk.org/c/asterisk/+/19565"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: asterisk </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I2dd4e804be9d14efaf0fd655abdddbb1a13f1c9d </div>
<div style="display:none"> Gerrit-Change-Number: 19565 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Michael Bradeen <mbradeen@sangoma.com> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>