<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>