Compare commits

...

74 Commits

Author SHA1 Message Date
Tzafrir Cohen
3693ad815b xpp_fxloader: handle empty span-type.conf
If we have /etc/dahdi/span-types.conf but it doesn't have any
line, we should avoid using the option -S to astribank_hexload.
Fix the test for this.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
(cherry picked from commit 77730a9059)
2015-06-04 16:08:25 -05:00
Tzafrir Cohen
e9a04c7a50 no astribank_is_starting with hotplug asterisk
Don't run the final astribank_is_starting if asterisk is hotpluggable.

Likewise, if there's no xpp_order file, waiting is pointless as the hook
can't count Astribanks.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
(cherry picked from commit 3f55dd78de)
2015-06-04 16:08:25 -05:00
Tzafrir Cohen
b37bcfb3b4 astribank_hook: remove useless 'time'
* 'time' was added here for debugging and never actually needed.
* It actually causes a minor bashism issue.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
(cherry picked from commit 283f01bd67)
2015-06-04 16:08:25 -05:00
Oron Peled
42f3e120ff xpp: waitfor_xpds: Always remove Astribank semaphore
If we waited -- no Astribanks are "in initialization"

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
(cherry picked from commit 631d32680f)
2015-06-04 16:08:25 -05:00
Oron Peled
48bb9e54f7 xpp/astribank_hook: remove Astribank initialization
If this is the last seen Astribank

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
(cherry picked from commit 44fe560f3b)
2015-06-04 16:08:25 -05:00
Oron Peled
605914d817 xpp: waitfor_xpds: documentation
Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
(cherry picked from commit 1a78b71fac)
2015-06-04 16:08:25 -05:00
Oron Peled
bcd25eea36 xpp: can use modern Asterisk hotplug support
* New asynchronous behavior is used only when two conditions are met:
  - Finding new $ASTERISK_SUPPORTS_DAHDI_HOTPLUG=yes in /etc/dahdi/init.conf
    This should be set only when Asterisk support hotplug and configured
    to use it (no_failed_channels==1).
  - DAHDI auto_assign_spans==0

* Adapt /usr/share/dahdi/astribank_hook:
  - Refactor old twinstar behavior into functions
  - Add new behavior in a function (just enable the Asrribank watchdog)
  - Call the correct function.

* Adapt init script:
  If asynchronous behavior is on, don't wait for all Astribanks to
  finish initialization (it's enough that we saw all/some of them)

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
Acked-by: Russ Meyerriecks <rmeyerriecks@digium.com>
(cherry picked from commit f11b937659)
2015-06-04 16:08:25 -05:00
Oron Peled
c7dc48e534 xpp: waitfor_xpds: assume astribank_is_starting exists
It's in the same package (dahdi-tools) for a long time

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
(cherry picked from commit cd6083b6ce)
2015-06-04 16:08:25 -05:00
Oron Peled
0ae73f0497 xpp: waitfor_xpds: expansion error with no ABs
Fix an exansion error in case there were no Astribanks on the system.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
(cherry picked from commit 0eb77e626e)
2015-06-04 16:08:25 -05:00
Oron Peled
93f85f7e6f xpp: astribank_is_starting: improve '-v' output
Do print a message if no semaphore exists. It means that either there
are no Astribanks, or existing Astribanks were already initialized.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
(cherry picked from commit 2e1c15baa3)
2015-06-04 16:08:25 -05:00
Russ Meyerriecks
e14958442d tonezone: Fix regression in Australian tone patch
Initialize db to 1.0 instead of doing it in a few, but not all, logic contexts.

Reported-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
Signed-off-by: Russ Meyerriecks <rmeyerriecks@digium.com>
Signed-off-by: Shaun Ruffell <sruffell@digium.com>
(cherry picked from commit 094bb2c1e8)
2015-06-04 16:08:25 -05:00
Oron Peled
f3b18f7832 xpp: revert USB "clear_halt" change and better overrides.
Why:
 * Doing "clear_halt" is normally the right thing to do on startup.
 * The original observed problem is better fixed via USB bios settings.
 * Defaulting to no "clear_halt" cause more problems on other platform
   combinations (hardware/kernel).

The change:
 * We now reverted to do "clear_halt" by default.
 * The XTALK_OPTIONS may now contain either "use-clear-halt" (the default)
   or "no-use-clear-halt" to override for debugging/testing.

Original commit: ca7c04e9cb

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
(cherry picked from commit 9aee76a3a5)
2015-06-04 16:08:25 -05:00
Tzafrir Cohen
d4537e46ce xpp: astribank_hexload: allow empty span specs
DAHDI 2.9.2 added support for -S (span specs). However if this option
was not specified, it fails to run.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
2014-08-04 09:35:52 +03:00
Tzafrir Cohen
60401c5f49 xpp_fxloader: rename variable: default_law -> law
The variable 'default_law' was the result of a partial renaming of the
original variable 'law'. Let's keep all of them in sync.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
2014-08-04 09:35:52 +03:00
Armen Karlozian
a109763160 tonezone: Fix congestion tone for Australia
The Congestion tone in Australia must be reduced by 10 to 15 dB
at every other cadence and the frequencies for both at cadences are 425 Hz.

From: Armen Karlozian <armeniki@hotmail.com>
Signed-off-by: Russ Meyerriecks <rmeyerriecks@digium.com>
2014-08-01 16:04:00 -05:00
Shaun Ruffell
6c40704fec zonedata: Ensure all zones have a default DAHDI_TONE_DIALRECALL.
The default 'us' tone is most likely better than silence when Asterisk tries to
generate the recall tone on a DAHDI channel.

Internal-Issue-ID: DAHTOOL-63
Reported-By: Igor Kravets
Signed-off-by: Shaun Ruffell <sruffell@digium.com>
Signed-off-by: Russ Meyerriecks <rmeyerriecks@digium.com>
2014-08-01 15:53:48 -05:00
Russ Meyerriecks
95e9dd71d8 dahdi_cfg: Reduce mass ioctls on non-existing channels
Logic was calling DAHDI_SPECIFY ioctl on all channels up to maximum channel
limit. Added a short circuit to prevent the ioctl on channels that aren't
configured.

Signed-off-by: Russ Meyerriecks <rmeyerriecks@digium.com>
Acked-by: Shaun Ruffell <sruffell@digium.com>
2014-07-23 16:53:38 -05:00
Russ Meyerriecks
df47721962 dahdi_cfg: minor: Rename fo_real to dry_run
Minor readability change

Signed-off-by: Russ Meyerriecks <rmeyerriecks@digium.com>
Acked-by: Shaun Ruffell <sruffell@digium.com>
2014-07-23 16:52:59 -05:00
Russ Meyerriecks
4e14561508 wcte43xp: Teach tools about te436 and te236 products
Signed-off-by: Russ Meyerriecks <rmeyerriecks@digium.com>
Signed-off-by: Shaun Ruffell <sruffell@digium.com>
2014-07-18 10:41:54 -05:00
Shaun Ruffell
49361e5ce7 dahdi_cfg: Warn if idle bits are set on invalid channel type.
Hopefully will save a little time in the future if anyone ever types into
/etc/dahdi/system.conf:

  bchan=1-15,17-30:1101

when they meant:

  cas=1-15,17-30:1101

in the future.

Signed-off-by: Shaun Ruffell <sruffell@digium.com>
Signed-off-by: Russ Meyerriecks <rmeyerriecks@digium.com>
2014-07-09 15:55:37 -05:00
Shaun Ruffell
8045f7f493 dahdi_cfg: Unlink semaphore on early exit.
If dahdi_cfg is terminated while holding the named semaphore, it is possible to
leave it behind and all subsequenct invocations of dahdi_cfg will block waiting
for it.

Signed-off-by: Shaun Ruffell <sruffell@digium.com>
Signed-off-by: Russ Meyerriecks <rmeyerriecks@digium.com>
2014-07-07 17:06:16 -05:00
Tzafrir Cohen
64e7c688d3 Makefile: A typo in a comment
Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
2014-06-30 13:47:23 +03:00
Oron Peled
b28ec382bb added autoconfig.h to .gitignore
Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
2014-06-29 16:34:24 +03:00
Oron Peled
412c3f0fe3 xpp: support per-port E1/T1 EC
* Added optional '-S <span-spec>' argument to astribank_hexload:
  - Allow passing PRI span specification to EC firmware loader.
  - The span specifications is whitespace/comma separate list
    of items.
  - Each item is: <span>:<type> (Example: 3:T1)
  - The <span> may use shell-like globbing (e.g: *:E1 or [12]:T1)
  - Any span not matched in the span specification will be set
    as without the new '-S' option (i.e: depends on the '-A' option).

* Adapted xpp_fxloader:
  - Read specification for both device label and wildcard from
    /etc/dahdi/span-types.conf
  - If the result is non-empty, pass it as '-S <span-spec>' to
    the EC firmware loader.
2014-06-29 16:34:21 +03:00
Oron Peled
fc459c374c xpp: set EC firmware according to PRI settings:
* Read first from modern configuration files
  (/etc/dahdi/span-types.conf)
  - Support either exact label match or complete '*' match in the
    configuration file.

* Fallback to legacy /etc/dahdi/xpp.conf

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
2014-06-29 16:34:17 +03:00
Oron Peled
ca09f327ed xpp: better dahdi_registration
Improvements to the xpp tool dahdi_registration:

* Use the new xpp driver with support for dahdi_registration sysfs
  attribute in each device.

* Wait for UDEV to finish handling span assignments (via
  dahdi_waitfor_span_assignments).

* Still supports legacy drivers without this, by falling back
  to old style iterative "registration" on each xpd.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
2014-06-29 16:30:34 +03:00
Tzafrir Cohen
b1d55683ae xpp: Don't generate .depends if there's no libusb
Creating the The .depends file requires libusb support.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
Acked-by: Russ Meyerriecks <rmeyerriecks@digium.com>
2014-06-10 12:41:43 +03:00
Oron Peled
9285e86492 xpp: better error checking (echo_loader)
Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
2014-05-11 19:07:40 +03:00
Oron Peled
ca7c04e9cb xpp: fix usb "clear_halt" problem
* Don't use "usb_clear_halt" by default anymore
   - It caused problems with specific devices in the past
   - Now it cause problems with specific servers as well (64 bits, USB3)

 * Add an "XTALK_OPTIONS" environment variable to pass options:
   - Use it to implement a "use-clear-halt" boolean option that
     restore original behavior.
   - Also use it for "no-lock" option which replace the legacy
     environment variable "XUSB_NOLOCK".
2014-05-11 18:03:11 +03:00
Oron Peled
ae02edacb4 xpp: safer compilation
* Compile with "-Wall -Werror"
* Better dependency calculation:
  - Explicit listing of sources, don't use wildcards.
  - Pass various CFLAGS to dependency calculation as well.
  - Make sure a failure is propagated

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
2014-05-11 18:03:11 +03:00
Shaun Ruffell
2abfd165ae system.conf.sample: Remove reference to single frequency signalling.
Single frequency signalling has not been supported in dahdi_cfg since the switch
to DAHDI. Before DAHDI, in the Zaptel days, it was only suported in the
ztcfg_dude utility which wasn't mainlined. So this removes references to those
signalling modes unless support is added back into the driver.

Internal-Issue-ID: DAHLIN-335
Signed-off-by: Shaun Ruffell <sruffell@digium.com>
2014-05-05 09:45:02 -05:00
Oron Peled
1e6b2741db dahdi_genconf: remove hard-coded E1 default
* The "spantypes" generator had E1 default if no 'line-mode' parameter
  was passed.

* As a result the new logic in "dahdi_span_types dumpconfig" had no
  effect when called from dahdi_genconf, as it was always called
  with "--line-mode=" argument.

* Now "dahdi_genconf spantype" behaves just like
  "dahdi_span_types dumpconfig":
  - The "--line-mode=" forces generation of provided line-mode (E1/J1/T1)
  - Without this option, the generated config matches the current spans
    state according to new dahd_span_types default logic:
    - Wildcard rule if all spans have same line-mode.
    - Uncommented specific matches if spans have different line-modes.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
Acked-by: Russ Meyerriecks <rmeyerriecks@digium.com>
2014-04-30 22:51:58 +03:00
Oron Peled
794c8eb048 xpp: waitfor_xpds: handle missing serial numbers
Fixes a regression since 949ea4ca9f
(2.7.0) - allows using an Astribank with no serial.

* Some of the olderst Astribanks don't have a serial number burned in
  them. Thus there is no serial attribute for the sysfs USB device node.

* waitfor_xpds identifies the Astribanks by their serial numbers.

* An lone Astribank without serial number would thus block waitfor_xpds
  (until timeout).

* Now we warn about them.

* We also try to handle it gracefully. As long as there's only one
  of thease, it would be counted as "NO-SERIAL".

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
2014-04-30 22:48:06 +03:00
Oron Peled
ffe36c63e0 xpp: dahdi_registration: force re-assignment
* The system state causing the bug:
  - DAHDI has auto_assign_spans==1
  - No /etc/dahdi/assigned-spans.conf

* The bug scenario:
  - During initial device detection, they are assigned by
    DAHDI driver.
  - Later we run "dahdi_span_assignment remove"
  - Then, a "dahdi_registration on" would not assign any span.

* The fix:
  - Using the '-R' option, force "dahdi_registration on" to also
    do "dahdi_span_assignment auto" on relevant devices.
  - This is the way it's called by /usr/share/dahdi/dahdi_auto_assign_compat

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
Acked-by: Shaun Ruffell <sruffell@digium.com>
2014-04-30 22:46:41 +03:00
Oron Peled
f2628eeedd improved dahdi_span_types dumpconfig
* Better defaults:
  - A wildcard match:
    - If '--line-mode' option is given, generate a wildcard entry.
      (existing behavior).

    - Otherwise, if *all spans* are of the same type (E1/T1),
      generate a wildcard entry for this type.
      This is the most common use-case and now it work without
      any command line flags.

    - Otherwise (mixed E1/T1 spans), do not generate a wildcard entry.
      This isn't common case (except from our labs), but regardless
      without '--line-mode' any guess could be wrong.

  - Specific device matches:
    - If all spans are of the same type, generate commented out
      specific entries (for manual overrides).

    - If spans have mixed E1/T1 types, generate specific entries
      In this case, specific entries MUST NOT be commented out
      otherwise, the configuration file is wrong!

* Generated header with better organization:
  - Shows what is generated:
    - Generating wildcard / Not generating wildcard
    - Generating specific lines / Generating *commented-out* specific lines

  - For each decision, show *why* it was taken.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
Acked-by: Russ Meyerriecks <rmeyerriecks@digium.com>
2014-04-01 21:23:28 +03:00
Oron Peled
1292ea9078 registration-order: Added dahdi_auto_assign_compat
Maintains the original registration order as was before span
assignments. Should allow seemless trannsition to
dahdi.auto_assign_spans=0

* The idea:
  - We stop handling in udev the case of missing
    /etc/dahdi/assigned-spans.conf
  - Instead we rely on "registration_time" dahdi_device attribute from
    DAHDI-linux
  - Then, we can sort the devices and assign their spans in
    /etc/init.d/dahdi
* Mechanics:
  - From /etc/init.d/dahdi, we run a new 'dahdi_auto_assign_compat'
    script (after "waitfor_xpds" etc.)
  - In this script we "auto" assign spans of non-Astribank devices
  - In the end of the script we run "dahdi_registration" which
    does the same for Astribank devices.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
Acked-by: Russ Meyerriecks <rmeyerriecks@digium.com>
2014-03-25 14:51:29 +02:00
Oron Peled
cfee27106b hotplug: call handle_device.d/ actions for remove
* Original actions didn't care about remove (10-span-types, 20-span-assignments)
* But others need to know about removals too.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
Acked-by: Russ Meyerriecks <rmeyerriecks@digium.com>
2014-03-25 14:48:09 +02:00
Shaun Ruffell
066fa2aff3 dahdi_cfg: error()->perror() when sem_open fails.
This fixes a confusing error message. When sem_open failed, the system.conf line
number was being printed and the system error code was not.

Signed-off-by: Shaun Ruffell <sruffell@digium.com>
2014-02-12 11:56:00 -06:00
Aslan Laoz
bce5afacf1 waitfor_xpds: handle the case of a failing AB
If an Astribank failed initialization, don't keep waiting for it.
2014-02-07 14:23:19 +02:00
Tzafrir Cohen
dd752529f0 auto_assign_spans may be true even if not '1'
auto_assign_spans is an int and may have legal values other than 1. It
is legal (though pointless) to use: modprobe dahdi auto_assign_spans=3.
Any value != 0 is true.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
Acked-by: Russ Meyerriecks <rmeyerriecks@digium.com>
2014-02-07 14:22:49 +02:00
Shaun Ruffell
27d07446ef hotplug: Check for auto_assign_spans only when ACTION is add.
Removes a potentially confusing error message. This is a reapplication of
(4f259cd569 "dahdi_handle_device, dahdi_span_config: Check for
auto_assign_spans only when ACTION is add.") which appears to have been
accidentally removed when moving the hotplug scripts into a subdirectory.

From the original commit:

When dahdi.ko is unloaded, it may be possible for the driver to be removed from
the kernel before the udev scripts are run.  When this happens, you'll see
messages like the following which are not accurate:

    'dahdi_handle_device'[24567]: Old driver (no auto_assign_spans parameter). Skip /devices/pci0000:00/0000:00:1e.0/0000:11:01.0/pci:0000:11:01.0

Now instead you will see:

    'dahdi_handle_device'[28008]: remove: /devices/pci0000:00/0000:00:1e.0/0000:11:01.0/pci:0000:11:01.0

Also, all the udev events will be logged in the system log even when they are
ignored because of legacy auto span assignment. This will help show what is
going on during the transition period to full udev configuration of spans.

Signed-off-by: Shaun Ruffell <sruffell@digium.com>
Acked-by: Oron Peled <oron.peled@xorcom.com>
2014-01-31 16:08:21 -06:00
Shaun Ruffell
8e2a5def27 hotplug: Do not run auto span configuration if spans are auto assigned.
This reapplies the change made in commit (6ed0adc08 "dahdi_span_config: Do not run auto
span configuration if spans are auto assigned.") which appears to have been
accidentally removed in (7f826a7d35 "hotplug modularization: split logic to
scriptlets").

To rationale from commit 6ed0adc08:

I have seen cases were users run:

  # modprobe <driver>; dahdi_cfg -c <custom config file>

and the spans end up misconfigured because dahdi_span_assignments ends up
running, via udev, after the user configured the span the way it wanted.

dahdi_span_assignments now looks at auto_assign_spans module parameter on
dahdi.ko, like dahdi_handle_device already does, to determine if legacy or udev
based configuration is being done.

Signed-off-by: Shaun Ruffell <sruffell@digium.com>
2014-01-31 11:16:08 -06:00
Tzafrir Cohen
e553ffde2b README: udev hooks run scripts from directories
Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
2014-01-28 11:42:33 +02:00
Tzafrir Cohen
d1fb614ac8 hotplug: document asterisk scriptlet
A well-behaving distribution may choose not to install
span_config.d/50-asterisk as part of dahdi-tools, as it belongs in
asterisk. Still, it would be nice to be able to keep it as a documented
usage example. So just writ where this file needs to go and what it
does.

No other change: it is still installed by default.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
2014-01-28 11:32:31 +02:00
Tzafrir Cohen
98ecc272d1 hyphen/minus fixes in man pages
in groff '-' creates a hyphen and for a minus (path, option, or similar)
you need '\-'.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
2014-01-27 20:29:04 +02:00
Russ Meyerriecks
91768d360c dahdi.init: Don't exit on lack of /etc/dahdi/system.conf
auto_spans and dahdi_cfg -c are valid config methods which may not have a
/etc/dahdi/system.conf. We already check for the existance of the dahdi modules
before the case start, so I think it's safe to remove this section.

Signed-off-by: Russ Meyerriecks <rmeyerriecks@digium.com>
Acked-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
2014-01-23 16:25:56 -06:00
Tzafrir Cohen
63842cc4f3 bash_completion: fix dahdi_genconf
Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
2014-01-23 23:16:55 +02:00
Tzafrir Cohen
b8d1e467e4 dahdi_perl: fix regression with an AB with no modules
Fixes a regression introduced in
3572bb5a13 (before 2.7.0) - most of the
dahdi_perl tools will fail for an Astribank with no modules claiming
"No XPDs for '/sys/bus/astribanks/devices/xbus-00'"

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
2014-01-23 22:32:45 +02:00
Tzafrir Cohen
de1ee8494a programmable bash completion for some commands
Programmable bash completion for dahdi_span_assignments,
dahdi_span_types and dahdi_genconf.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
Acked-By: Russ Meyerriecks <rmeyerriecks@digium.com>
2014-01-23 22:30:47 +02:00
Tzafrir Cohen
d3feed5c4c dahdi_span_types: hush warning of missing attribute
Don't warn when a sysfs attribute does not exist.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
Acked-By: Russ Meyerriecks <rmeyerriecks@digium.com>
2014-01-23 21:33:10 +02:00
Oron Peled
b621c02b7f Change span-type.conf generation policy
* Add '--line-mode=<E1|T1|J1>' option to dahdi_span_types:
  - Will first generate a wildcard entry (* *:<type>)
  - All later entries will be commented-out.
  - Manually uncommenting any of them will create an "override"
    (e.g: mixed system with all spans T1, but some E1)

* Now dahdi_genconf does not generate span-types.conf by default:
  - Added '--line-mode=<E1|T1|J1>' option to trigger generation
  - This parameter will be passed to "dahdi_span_types dumpconfig"
  - Also explicit specification of 'spantypes' as an argument will
    trigger a similar generation (with a default of 'E1').
  - The line-mode may also be passed to the generator directly
    with identical results. Example:
          dahdi_genconf spantypes=line-mode=T1

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
Acked-By: Russ Meyerriecks <rmeyerriecks@digium.com>
2014-01-23 21:32:14 +02:00
Oron Peled
451a8b4d6f dahdi_span_types: allow defaults + overrides
* Allow wildcards for both device and span number (as before).
  Example:
     *        *:T1

* But now we are carefull to follow strict order in the configuration
  file. This means, if there are multiple matches -- last one wins.

* So we can use specialisation:
     *        *:T1	# Everything is T1
     FOO      [34]:T1	# Except spans 3,4 on the FOO device

* Added --dry-run and --verbose options.

* Updated the man-page:
  - Fixed "registered" => "assigned".
  - Use "line mode" for E1/J1/T1.
  - Document current changes.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
Acked-By: Russ Meyerriecks <rmeyerriecks@digium.com>
2014-01-23 21:28:59 +02:00
Tzafrir Cohen
09fd3f53b1 dahdi_span_assignments.8: s/register/assign/
* Use the term "assignment" instead of "registration" (for spans).
* Further fixes.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
Acked-By: Russ Meyerriecks <rmeyerriecks@digium.com>
2014-01-23 21:27:58 +02:00
Oron Peled
c3b020a155 new "dahdi_waitfor_span_assignments" tool
* Allows waiting until all spans are "assigned" or "unassigned"
* Current implementation use a polling loop with sleep
* Future implementation may block on sysfs attribute
  (like waitfor_xpds is blocking on sysfs Astribanks attribute)

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
Acked-by: Russ Meyerriecks <rmeyerriecks@digium.com>
2014-01-23 12:35:59 +02:00
Oron Peled
7f826a7d35 hotplug modularization: split logic to scriptlets
* Device related operations are ordered in /usr/share/dahdi/handle_device.d/
* Span related operations are ordered in /usr/share/dahdi/span_config.d/
* In the future, span_config.d/50-asterisk should be moved to Asterisk.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
Acked-by: Russ Meyerriecks <rmeyerriecks@digium.com>
2014-01-23 12:35:59 +02:00
Oron Peled
cdedf024ae hotplug modularization: move sources to a subdir
Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
Acked-by: Russ Meyerriecks <rmeyerriecks@digium.com>
2014-01-23 12:35:59 +02:00
Russ Meyerriecks
a6203e151f wcte13xp: Teach tools about te131 te132 products
Signed-off-by: Russ Meyerriecks <rmeyerriecks@digium.com>
2014-01-22 17:45:58 -06:00
Shaun Ruffell
69ce6f07e0 dahdi_cfg: Allow dynamic spans to handle udev based span assignment.
Prior to this commit, if auto_assign_spans was set to 0, it was possible to
get in an endless loop creating and destroying spans. The primary reason was
that all dynamic spans are destroyed and recreated each time dahdi_cfg runs, BUT
dahdi_cfg was run each time a new span showed up in udev when auto_assign_spans
was set to 0.

Now dahdi_cfg will only destroy and recreate dynamic spans if dahdi_cfg is run
without a specifc span number. Also, while creating dynamic spans, dahdi_cfg
will pause for up to one second for the span to be assigned in order to ensure
that the spans are numbered consistently when auto span assignment is
configured.

Signed-off-by: Shaun Ruffell <sruffell@digium.com>
Signed-off-by: Russ Meyerriecks <rmeyerriecks@digium.com>
2014-01-22 12:58:57 -06:00
Shaun Ruffell
9989b8779c dahdi_cfg: Add semaphore to prevent parallel execution.
When dahdi is configured for fully dynamic configuration on a device and
span basis via sysfs and udev it is possible for multiple instances of
dahdi_cfg to be run in parallel on different spans. If this happens it
is possible to see errors on the console that tone zones are already
registered since the check for the existence of a tone zone and the
re-registering needs to be atomic.

dahdi_cfg will now prevent itself from running in parallel.

Signed-off-by: Shaun Ruffell <sruffell@digium.com>
Signed-off-by: Russ Meyerriecks <rmeyerriecks@digium.com>
2014-01-22 12:58:57 -06:00
Shaun Ruffell
a4f79134c9 dahdi_handle_device: Auto assign only the device being added.
Eliminates trying to add spans multiple times as seen below:

    'dahdi_handle_device'[21993]: add: /devices/dynamic:loc:1
    'dahdi_handle_device'[21991]: add: /devices/dynamic:loc:0
    'dahdi_handle_device'[22001]: auto-assign /sys/bus/dahdi_devices/devices/dynamic:loc:0
    'dahdi_handle_device'[22001]: auto-assign /sys/bus/dahdi_devices/devices/dynamic:loc:1
    'dahdi_handle_device'[21999]: auto-assign /sys/bus/dahdi_devices/devices/dynamic:loc:0
    'dahdi_handle_device'[21999]: auto-assign /sys/bus/dahdi_devices/devices/dynamic:loc:1
    kernel: [ 3348.312534] dahdi_devices dynamic:loc:0: local span 1 is already assigned span 1
    kernel: [ 3348.312552] dahdi_devices dynamic:loc:1: local span 1 is already assigned span 2

Signed-off-by: Shaun Ruffell <sruffell@digium.com>
Acked-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
2014-01-20 19:22:57 +02:00
Shaun Ruffell
d8074f434f dahdi_span_types: Show location of configuration file in help message.
Makes similar in for the dahdi_span_assignments in that the location of the
default configuration file is shown in the help screen.

Signed-off-by: Shaun Ruffell <sruffell@digium.com>
Acked-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
2014-01-20 19:22:57 +02:00
Shaun Ruffell
15875924f0 dahdi_genconf: Add 'modules', 'spantypes', and 'assignedspans' to list of available generators.
This is a documentation change, that hopefully will help until I can remember
the names of the new generators.

Signed-off-by: Shaun Ruffell <sruffell@digium.com>
Acked-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
2014-01-20 19:22:57 +02:00
Tzafrir Cohen
a5bf1d3a2e dahdi_genconf: don't generate spantypes by default
A sane value for span-types.conf is either "all E1" or "all T1". Either
way it is not hardware-dependent, and hence no point in regenerating on
when the hardware changes.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
2014-01-20 19:22:57 +02:00
Tzafrir Cohen
bf960799ea span_types/assignments: no * in device list
If there are no dahdi devices, $devbase/* expans to have a literal '*',
which leads to warnings such as:
/usr/sbin/dahdi_span_types: 1: cd: can't cd to /sys/bus/dahdi_devices/devices/*

Let's just avoid those.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
2014-01-20 19:22:03 +02:00
Shaun Ruffell
4f259cd569 dahdi_handle_device, dahdi_span_config: Check for auto_assign_spans only when ACTION is add.
When dahdi.ko is unloaded, it may be possible for the driver to be removed from
the kernel before the udev scripts are run.  When this happens, you'll see
messages like the following which are not accurate:

    'dahdi_handle_device'[24567]: Old driver (no auto_assign_spans parameter). Skip /devices/pci0000:00/0000:00:1e.0/0000:11:01.0/pci:0000:11:01.0

Now instead you will see:

    'dahdi_handle_device'[28008]: remove: /devices/pci0000:00/0000:00:1e.0/0000:11:01.0/pci:0000:11:01.0

Also, all the udev events will be logged in the system log even when they are
ignored because of legacy auto span assignment. This will help show what is
going on during the transition period to full udev configuration of spans.

Signed-off-by: Shaun Ruffell <sruffell@digium.com>
Acked-by: Oron Peled <oron.peled@xorcom.com>
2014-01-08 17:56:52 -06:00
Tzafrir Cohen
4d5ca04ad6 README: Update the install targets
Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
2013-12-30 19:24:23 +02:00
Tzafrir Cohen
2d3580a3db README: document initialization
Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
2013-12-30 19:12:59 +02:00
Tzafrir Cohen
d96be70986 README: indentation level for config samples
Indent the configuration samples one level deeper

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
2013-12-29 20:32:12 +02:00
Tzafrir Cohen
41a725adea .gitignore: more generated files
Ignore test binaries and files generated by 'make docs'

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
2013-12-29 13:53:53 +02:00
Shaun Ruffell
6ed0adc086 dahdi_span_config: Do not run auto span configuration if spans are auto assigned.
I have seen cases were users run:

  # modprobe <driver>; dahdi_cfg -c <custom config file>

and the spans end up misconfigured because dahdi_span_assignments ends up
running, via udev, after the user configured the span the way it wanted.

dahdi_span_assignments now looks at auto_assign_spans module parameter on
dahdi.ko, like dahdi_handle_device already does, to determine if legacy or udev
based configuration is being done.

Signed-off-by: Shaun Ruffell <sruffell@digium.com>
Acked-by: Oron Peled <oron.peled@xorcom.com>
2013-12-21 00:02:22 -06:00
Tzafrir Cohen
5e75fa48f4 dahdi.rules: use += for RUN
Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
Acked-by: Shaun Ruffell <sruffell@digium.com>
Acked-by: Russ Meyerriecks <rmeyerriecks@digium.com>
2013-12-12 23:47:50 +02:00
Tzafrir Cohen
4ab8e95d0b dahdi.rules: Replace SYSFS with ATTRS
SYSFS has been deprecated. Use ATTRS.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
Acked-by: Shaun Ruffell <sruffell@digium.com>
Acked-by: Russ Meyerriecks <rmeyerriecks@digium.com>
2013-12-12 23:47:50 +02:00
Shaun Ruffell
5ca600c7c7 dahdi_cfg: Wait for all spans to be assigned.
When auto span assignment is disabled, it's possible that simply running

  # /etc/init.d/dahdi restart

Will fail since dahdi_cfg can run in parallel with udev scripts that are
assigning spans, which results in /etc/dahdi/system.conf describing spans that
do not exist in the system.

This change sets up dahdi_cfg, when run without the -C or -S options, to look in
sysfs and make sure all spans for each device are assigned.  dahdi_cfg will wait
5 seconds for span assignment to happen before proceeding normally.

Signed-off-by: Shaun Ruffell <sruffell@digium.com>
Acked-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
Acked-by: Russ Meyerriecks <rmeyerriecks@digium.com>
2013-12-12 09:08:51 -06:00
Oron Peled
98736e1add Makefile: do install all man-pages
Fixes a regression in 2.8 (ffced0ca) in the main Makefile:
MAN_PAGES gets assigned twice and thus most man pages will not get
installed.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
Acked-by: Russ Meyerriecks <rmeyerriecks@digium.com>
2013-12-09 22:57:41 +02:00
47 changed files with 1936 additions and 422 deletions

15
.gitignore vendored
View File

@@ -1,10 +1,14 @@
*.o
.*.o.d
.*.lo.d
*.asciidoc
*.html
build_tools/menuselect-deps
autoconfig.h
config.log
config.status
dahdi_cfg
dahdi_diag
dahdi_maint
dahdi_monitor
dahdi_scan
@@ -12,11 +16,22 @@ dahdi_speed
dahdi_test
dahdi_tool
fxotune
fxstest
genconf_parameters.sample
hdlcgen
hdlcstress
hdlctest
hdlcverify
libtonezone.a
libtonezone.so
makeopts
patgen
patlooptest
pattest
sethdlc
timertest
tonezone.lo
tonezones.txt
version.c
xpp/.depend
xpp/.octasic.depend

View File

@@ -60,6 +60,8 @@ MODULES_FILE = /etc/dahdi/modules
GENCONF_FILE = /etc/dahdi/genconf_parameters
MODPROBE_FILE = /etc/modprobe.d/dahdi.conf
BLACKLIST_FILE = /etc/modprobe.d/dahdi.blacklist.conf
BASH_COMP_DIR = /etc/bash_completion.d
BASH_COMP_FILE = $(BASH_COMP_DIR)/dahdi
NETSCR_DIR := $(firstword $(wildcard $(DESTDIR)/etc/sysconfig/network-scripts ))
ifneq (,$(NETSCR_DIR))
@@ -103,12 +105,23 @@ endif
ifeq (1,$(PBX_HDLC))
BINS += sethdlc
endif
ASSIGNED_DATA_SCRIPTS:=dahdi_handle_device dahdi_span_config
ASSIGNED_UTILS:=dahdi_span_assignments dahdi_span_types
ASSIGNED_DATA_SCRIPTS:=\
dahdi_handle_device \
dahdi_span_config \
dahdi_auto_assign_compat \
span_config.d/10-dahdi-cfg \
span_config.d/20-fxotune \
span_config.d/50-asterisk \
handle_device.d/10-span-types \
handle_device.d/20-span-assignments
ASSIGNED_UTILS:=dahdi_span_assignments dahdi_span_types \
dahdi_waitfor_span_assignments
ASSIGNED_CONF:=assigned-spans.conf.sample span-types.conf.sample
MAN_PAGES:=$(wildcard $(BINS:%=doc/%.8))
MAN_PAGES:=$(wildcard $(ASSIGNED_UTILS:%=doc/%.8))
MAN_PAGES:= \
$(wildcard $(BINS:%=doc/%.8)) \
$(wildcard $(ASSIGNED_UTILS:%=doc/%.8))
TEST_BINS:=patgen pattest patlooptest hdlcstress hdlctest hdlcgen hdlcverify timertest dahdi_maint
# All the man pages. Not just installed ones:
@@ -167,7 +180,7 @@ $(LTZ_SO): $(LTZ_SO_OBJS)
$(CC) $(CFLAGS) -shared -Wl,-soname,$(LTZ_SO).$(LTZ_SO_MAJOR_VER).$(LTZ_SO_MINOR_VER) -o $@ $^ -lm
dahdi_cfg: $(LTZ_A)
dahdi_cfg: LIBS+=-lm
dahdi_cfg: LIBS+=-lm -lpthread
dahdi_pcap:
$(CC) $(CFLAGS) dahdi_pcap.c -lpcap -o $@ $<
@@ -195,12 +208,12 @@ genconf_parameters.sample: xpp/genconf_parameters
README.html: README system.conf.asciidoc init.conf.asciidoc tonezones.txt \
UPGRADE.txt genconf_parameters.asciidoc assigned-spans.conf.asciidoc \
span-types.conf.asciidoc
$(ASCIIDOC) -n -a toc -a toclevels=3 $<
$(ASCIIDOC) -n -a toc -a toclevels=4 $<
README.Astribank.html: xpp/README.Astribank
$(ASCIIDOC) -o $@ -n -a toc -a toclevels=4 $<
# on Debian: this requires the full groof, not just groff-base.
# on Debian: this requires the full groff, not just groff-base.
%.8.html: %.8
man -Thtml $^ >$@
@@ -230,9 +243,11 @@ ifeq (,$(wildcard $(DESTDIR)$(CONFIG_FILE)))
$(INSTALL) -m 644 system.conf.sample $(DESTDIR)$(CONFIG_FILE)
endif
install -d $(DESTDIR)$(DATA_DIR)
install $(ASSIGNED_DATA_SCRIPTS) $(DESTDIR)$(DATA_DIR)/
tar cf - -C hotplug $(ASSIGNED_DATA_SCRIPTS) | tar xf - -C $(DESTDIR)$(DATA_DIR)/
install $(ASSIGNED_UTILS) $(DESTDIR)/$(BIN_DIR)/
install -m 644 $(ASSIGNED_CONF) $(DESTDIR)/$(CONFIG_DIR)/
install -d $(DESTDIR)$(BASH_COMP_DIR)
install -m 644 dahdi-bash-completion $(DESTDIR)$(BASH_COMP_FILE)
install-libs: libs
$(INSTALL) -d -m 755 $(DESTDIR)/$(LIB_DIR)

148
README
View File

@@ -49,15 +49,18 @@ There are some make targets that are provided to build or install just
parts of DAHDI:
. Build targets:
- make: Build DAHDI user-space programs. partial
- make: Build DAHDI user-space programs and libraries. partial
targets of it:
* make 'utilname': builds 'utilname' alone (e.g: `make dahdi_diag`)
* make utils: Build libtonezone.
* make utils: Build just the programs.
* make libs: Build libtonezone.
* make tests: Build testing binaries.
. Install targets:
- make install: Installs user space tools into /usr/sbin/ (TODO - list
partial targets)
- make config: should be run once to configure
- make install: Install everything. Sub-targets of it:
* make install-utils: Installs most things.
* make install-libs: Installs libtonezone.
- make config: install configuration files (overriding existing ones).
- make install-test: Install testing binaries.
Installation to a Subtree
@@ -117,29 +120,29 @@ set at the beginning of the init.d script.
Reference Configuration
~~~~~~~~~~~~~~~~~~~~~~~
Sample system.conf
~~~~~~~~~~~~~~~~~~
^^^^^^^^^^^^^^^^^^
include::system.conf.asciidoc[]
Sample init.conf
~~~~~~~~~~~~~~~~
^^^^^^^^^^^^^^^^
include::init.conf.asciidoc[]
Sample genconf_parameters
~~~~~~~~~~~~~~~~~~~~~~~~~
^^^^^^^^^^^^^^^^^^^^^^^^^
FIXME: still not properly formatted.
include::genconf_parameters.asciidoc[]
Sample assigned-spans.conf
~~~~~~~~~~~~~~~~~~~~~~~~~~
^^^^^^^^^^^^^^^^^^^^^^^^^^
include::assigned-spans.conf.asciidoc[]
Sample span-types.conf
~~~~~~~~~~~~~~~~~~~~~~
^^^^^^^^^^^^^^^^^^^^^^
include::span-types.conf.asciidoc[]
@@ -212,6 +215,131 @@ that is included in the ppp/ subdirectory. To install it:
CONFIG_HDLC .
Initialization
--------------
This section documents the start up sequence of the DAHDI modules.
There are generally two options: explicit (using an init script) and
implicit (run from UDEV hook scripts).
Explicit
~~~~~~~~
The dahdi init scripts does the following tasks:
* Loading the module dahdi and any other module listed in
/etc/dahdi/modules.
* For xpp (Astribanks) - some specific initializations. See
README.Astribank.
* Runs link:doc/dahdi_cfg.8.html[dahdi_cfg] after all modules were
loaded.
* A number of other tools may need to be run:
** link:doc/fxotune.8.html[fxotune]
** dahdihpec_enable
Only at this point Asterisk (or any other user of DAHDI) can be run.
Implicit
~~~~~~~~
(Also known as "hot-plug" or "pinned-spans". This requires:
* dahdi >= 2.8.0
* Setting the module parameter auto_assign_spans of dahdi to 0
* (Recommended) Asterisk >= 12 - which supports "dahdi create channels".
When a device driver of a DAHDI device finishes initialization, it
creates a dahdi_device kernel object. A dahdi_device represents a single
DAHDI device (such as a PCI card) and may have several spans. If the
value of auto_assign_spans is 1 when dahdi_device is created, spans are
assigned automatically - each new span gets the first available span
number and range of channels. However if it is set to 0, spans will not
get assigned, and user space programs need to assign them. The
low-level interface for doing so is explained in the section "Span
Assignment" in the README of DAHDI-Linux.
New Devices
^^^^^^^^^^^
When a kernel object is created or destroyed, the kernel sends an event
to user space. Those events are normally handled by udevd. Configurations
for udevd ("udev rules") may be placed in /etc/udev/rules.d or
/lib/udev/rules.d. This package installs rules that instruct udevd to
run the script `/usr/share/dahdi/dahdi_handle_device` on each new
device, which runs all the scripts in `/usr/share/dahdi/handle_device.d`.
Those scripts will:
* If `/etc/dahdi/span-types.conf` exists, apply it to the device. It is
used for E1/T1/J1 settings. See
<<_sample_span_types_conf,sample span-types.conf>>.
* If `/etc/dahdi/assigned-spans.conf` exists, assign the span according
to it (if it is not specified there: don't assign it).
used for E1/T1/J1 settings. See
<<_sample_assigned_spans_conf,sample assigned-spans.conf>>.
* But if that file does not exist, assign the span to the first
available place.
This script mainly uses the commands
link:doc/dahdi_span_types.8.html[dahdi_span_types] and
link:doc/dahdi_span_assignments.8.html[dahdi_span_assignments].
DAHDI devices are listed under `/sys/bus/dahdi_devices/devices`.
If you want to disable running this script, add the following line to
`/etc/dahdi/init.conf`:
.............................
DAHDI_UDEV_DISABLE_DEVICES=yes
.............................
New Spans
^^^^^^^^^
Once a span is assigned, a kernel object will appear for it. It will be
listed under its device. As a new kernel object was created, an event is
sent to udev.
The standard DAHDI udev rules instruct udevd to run the script
`/usr/share/dahdi/dahdi_span_config` which runs all the scripts in
`/usr/share/dahdi/span_config.d`. Those script configures the new
span:
* If system.conf does not exist, generates a temporary configuration
for the span using link:doc/dahdi_genconf.8.html[dahdi_genconf
system].
* Runs link:doc/dahdi_cfg.8.html[dahdi_cfg] on the new span (using `-S`
and -C`).
* Runs `asterisk -rx 'dahdi create channels'` to add the new channels
and spans to Asterisk (if they were configured in advance).
If you want to disable running this script, add the following line to
`/etc/dahdi/init.conf`:
.............................
DAHDI_UDEV_DISABLE_SPANS=yes
.............................
New Channels
^^^^^^^^^^^^
DAHDI channels have their own representation in the kernel. The standard
udev rules that dahdi-tools includes for them, however, don't run a
script for each device. Each DAHDI channel creates a block device file
at /dev/dahdi/chan/'span'/'rel-chan', where 'span' and 'rel-chan' are
each three-digit numbers (e.g: 035). 'span' is the span number and
'rel-chan' is the channel number relative to the span.
The udev rules generate the following extra symlinks under /dev/dahdi:
* /dev/dahdi/'num' - the channel number. As it was originally (but
continues beyond 250).
* /dev/dahdi/devices/'hardware_id'/'rel-span'/'rel-chan' - if the DAHDI
device has a hardware ID field, provide listing of the device's span
and channels.
* /dev/dahdi/devices/@'hardware_id'/'rel-span'/'rel-chan' - likewise for
the connector field. It has a "@" prefix.
include::UPGRADE.txt[]

133
dahdi-bash-completion Normal file
View File

@@ -0,0 +1,133 @@
# Check for bash
[ -z "$BASH_VERSION" ] && return
__dahdi_span_assignments() {
local cur prev has_cmd i
COMPREPLY=()
cur=${COMP_WORDS[COMP_CWORD]}
prev=${COMP_WORDS[COMP_CWORD-1]}
has_cmd=0
for (( i=0; i < COMP_CWORD; i++)); do
case "${COMP_WORDS[$i]}" in
add | auto | dumpconfig | list | remove)
has_cmd=1
break
;;
esac
done
case "$prev" in
-k | --key) COMPREPLY=( $(compgen -W 'devpath hwid location' -- $cur) ) ;;
*)
case "$cur" in
-*) COMPREPLY=( ${COMPREPLY[@]} $(compgen -W \
'-h -k -n -v --help --key --dry-run --verbose' -- $cur ) )
;;
*)
if [ "$has_cmd" = 1 ]; then
COMPREPLY=( ${COMPREPLY[@]} $(shopt -s nullglob; \
echo /sys/bus/dahdi_devices/devices/* ) )
else
COMPREPLY=( ${COMPREPLY[@]} $(compgen -W \
'add auto dumpconfig list remove' -- $cur) )
fi
;;
esac
;;
esac
}
complete -F __dahdi_span_assignments dahdi_span_assignments
__dahdi_span_types() {
local cur prev has_cmd i
COMPREPLY=()
cur=${COMP_WORDS[COMP_CWORD]}
prev=${COMP_WORDS[COMP_CWORD-1]}
has_cmd=0
for (( i=0; i < COMP_CWORD; i++)); do
case "${COMP_WORDS[$i]}" in
dumpconfig | list | set)
has_cmd=1
break
;;
esac
done
case "$prev" in
-k | --key) COMPREPLY=( $(compgen -W 'devpath hwid location' -- $cur) ) ;;
--line-type) COMPREPLY=( $(compgen -W 'E1 J1 T1' -- $cur) ) ;;
*)
case "$cur" in
-*) COMPREPLY=( ${COMPREPLY[@]} $(compgen -W \
'-h -k -n -v --help --key --dry-run --line-type --verbose' -- $cur ) )
;;
*)
if [ "$has_cmd" = 1 ]; then
# FIXME: check if devices are settable?
COMPREPLY=( ${COMPREPLY[@]} $( \
grep -l '[EJT]1' /sys/devices/pci0000:00/0000:00:10.4/usb1/1-1/xbus-00/*/spantype 2>/dev/null | sed -e 's|/spantype||') )
else
COMPREPLY=( ${COMPREPLY[@]} $(compgen -W \
'dumpconfig list set' -- $cur) )
fi
;;
esac
;;
esac
}
complete -F __dahdi_span_types dahdi_span_types
__dahdi_genconf() {
local cur
COMPREPLY=()
prev=${COMP_WORDS[COMP_CWORD-1]}
cur=${COMP_WORDS[COMP_CWORD]}
case "$prev" in
--line-type) COMPREPLY=( $(compgen -W 'E1 J1 T1' -- $cur) ) ;;
*)
case "$cur" in
-*) COMPREPLY+=( $(compgen -W '-F -v -V --freepbx --version --verbose --line-type' -- $cur ) ) ;;
*)
COMPREPLY+=( $(compgen -W "$( perl -e 'my $file = "\u$ARGV[0]";
# Complete module name. Translate the case of the
# first letter
my @pats = map {"$_/Dahdi/Config/Gen/$file*.pm"} @INC;
foreach (@pats) {
foreach(glob) {
s|.*/||;
s|.pm$||;
s|^(.)|lc($1)|e;
print "$_ "
}
}')" -- $cur ) )
;;
esac
;;
esac
}
complete -F __dahdi_genconf dahdi_genconf
__dahdi_cfg() {
local cur prev
COMPREPLY=()
cur=${COMP_WORDS[COMP_CWORD]}
prev=${COMP_WORDS[COMP_CWORD-1]}
case "$prev" in
-c) COMPREPLY=( $(compgen -f -- $cur) ) ;;
-S) COMPREPLY=( $(ls -d /sys/bus/dahdi_spans/devices/* 2>/dev/null | sed -e 's/.*-//') ) ;;
# FIXME: A similar completion for -C (<chan1>-<chan2>)
*)
COMPREPLY=( ${COMPREPLY[@]} $(compgen -W \
'-c -C -f -h -s -S -t -v ' -- $cur ) )
;;
esac
}
# Disable until -c works properly
#complete -F __dahdi_cfg dahdi_cfg

View File

@@ -144,15 +144,18 @@ hotplug_exit_after_load() {
# Initialize the Xorcom Astribank (xpp/) using perl utiliites:
xpp_startup() {
if [ "$ASTERISK_SUPPORTS_DAHDI_HOTPLUG" = yes ]; then
aas_param='/sys/module/dahdi/parameters/auto_assign_spans'
aas=`cat "$aas_param" 2>/dev/null`
if [ "$aas" = 0 ]; then
echo 1>&2 "Don't wait for Astribanks (use Asterisk hotplug-support)"
return 0
fi
fi
# do nothing if there are no astribank devices:
if ! /usr/share/dahdi/waitfor_xpds; then return 0; fi
hotplug_exit_after_load
# overriding locales for the above two, as perl can be noisy
# when locales are missing.
# No register all the devices if they didn't auto-register:
LC_ALL=C dahdi_registration on
}
@@ -237,11 +240,6 @@ if [ ! -x "$DAHDI_CFG" ]; then
exit 0
fi
if [ ! -f /etc/dahdi/system.conf ]; then
echo "/etc/dahdi/system.conf not found. Nothing to do."
exit 0
fi
RETVAL=0
# See how we were called.
@@ -268,6 +266,9 @@ case "$1" in
xpp_startup
# Assign all spans that weren't handled via udev + /etc/dahdi/assigned-spans.conf
/usr/share/dahdi/dahdi_auto_assign_compat
if [ $system = debian ]; then
echo -n "Running dahdi_cfg: "
$DAHDI_CFG_CMD 2> /dev/null && echo -n "done"

View File

@@ -8,11 +8,11 @@ SUBSYSTEM=="dahdi", OWNER="asterisk", GROUP="asterisk", MODE="0660"
SUBSYSTEM=="dahdi_channels", SYMLINK+="dahdi/%m"
# Add persistant names as well
SUBSYSTEM=="dahdi_channels", SYSFS{hardware_id}!="", SYMLINK+="dahdi/devices/%s{hardware_id}/%s{local_spanno}/%n"
SUBSYSTEM=="dahdi_channels", SYSFS{location}!="", SYMLINK+="dahdi/devices/@%s{location}/%s{local_spanno}/%n"
SUBSYSTEM=="dahdi_channels", ATTRS{hardware_id}!="", SYMLINK+="dahdi/devices/%s{hardware_id}/%s{local_spanno}/%n"
SUBSYSTEM=="dahdi_channels", ATTRS{location}!="", SYMLINK+="dahdi/devices/@%s{location}/%s{local_spanno}/%n"
LABEL="dahdi_add_end"
# hotplug scripts
SUBSYSTEM=="dahdi_devices", RUN="%E{DAHDI_TOOLS_ROOTDIR}/usr/share/dahdi/dahdi_handle_device"
SUBSYSTEM=="dahdi_spans", RUN="%E{DAHDI_TOOLS_ROOTDIR}/usr/share/dahdi/dahdi_span_config"
SUBSYSTEM=="dahdi_devices", RUN+="%E{DAHDI_TOOLS_ROOTDIR}/usr/share/dahdi/dahdi_handle_device"
SUBSYSTEM=="dahdi_spans", RUN+="%E{DAHDI_TOOLS_ROOTDIR}/usr/share/dahdi/dahdi_span_config"

View File

@@ -29,13 +29,18 @@
#include <stdio.h>
#include <getopt.h>
#include <signal.h>
#include <string.h>
#include <stdarg.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <semaphore.h>
#include <errno.h>
#include <dirent.h>
#include <stdbool.h>
#include <dahdi/user.h>
#include "tonezone.h"
@@ -104,7 +109,7 @@ static int fiftysixkhdlc[DAHDI_MAX_CHANNELS];
static int spans=0;
static int fo_real = 1;
static int dry_run = 0;
static int verbose = 0;
@@ -137,6 +142,97 @@ static const char *laws[] = {
"A-law"
};
static bool _are_all_spans_assigned(const char *device_path)
{
char attribute[1024];
int res;
FILE *fp;
int span_count;
DIR *dirp;
struct dirent *dirent;
snprintf(attribute, sizeof(attribute) - 1,
"%s/span_count", device_path);
fp = fopen(attribute, "r");
if (NULL == fp) {
fprintf(stderr, "Failed to open '%s'.\n", attribute);
return false;
}
res = fscanf(fp, "%d", &span_count);
fclose(fp);
if (EOF == res) {
fprintf(stderr, "Failed to read '%s'.\n", attribute);
return false;
}
dirp = opendir(device_path);
while (span_count) {
dirent = readdir(dirp);
if (NULL == dirent)
break;
if (!strncmp("span-", dirent->d_name, 5)) {
--span_count;
}
}
closedir(dirp);
return (span_count > 0) ? false : true;
}
/**
* are_all_spans_assigned - Look in sysfs to see if all spans for a device are assigned.
*
* Returns true if there are $span_count child spans of all devices, or false
* otherwise.
*/
static bool are_all_spans_assigned(void)
{
DIR *dirp;
struct dirent *dirent;
bool res = true;
char device_path[1024];
dirp = opendir("/sys/bus/dahdi_devices/devices");
if (!dirp) {
/* If we cannot open dahdi_devices, either dahdi isn't loaded,
* or we're using an older version of DAHDI that doesn't use
* sysfs. */
return true;
}
while (true && res) {
dirent = readdir(dirp);
if (NULL == dirent)
break;
if (!strcmp(dirent->d_name, ".") ||
!strcmp(dirent->d_name, ".."))
continue;
snprintf(device_path, sizeof(device_path)-1,
"/sys/bus/dahdi_devices/devices/%s", dirent->d_name);
res = _are_all_spans_assigned(device_path);
}
closedir(dirp);
errno = 0;
return res;
}
static bool wait_for_all_spans_assigned(unsigned long timeout_sec)
{
bool all_assigned = are_all_spans_assigned();
unsigned int timeout = 10*timeout_sec;
while (!all_assigned && --timeout) {
usleep(100000);
all_assigned = are_all_spans_assigned();
}
return all_assigned;
}
static const char *sigtype_to_str(const int sig)
{
switch (sig) {
@@ -666,7 +762,16 @@ static int chanconfig(char *keyword, char *args)
} else {
fprintf(stderr, "Huh? (%s)\n", keyword);
}
if (is_digital)
if (cc[x].sigtype != DAHDI_SIG_CAS &&
cc[x].sigtype != DAHDI_SIG_DACS &&
cc[x].sigtype != DAHDI_SIG_DACS_RBS) {
if (NULL != idle) {
fprintf(stderr, "WARNING: idlebits are not valid on %s channels.\n", sig[x]);
}
}
if (is_digital)
chan2span[x] = current_span;
else
current_span = 0;
@@ -714,21 +819,22 @@ static int setfiftysixkhdlc(char *keyword, char *args)
return 0;
}
static void apply_fiftysix(void)
static int apply_fiftysix(void)
{
int x;
int rate;
int chanfd;
for (x = 1; x < DAHDI_MAX_CHANNELS; x++) {
if (skip_channel(x))
if (skip_channel(x) || !cc[x].sigtype)
continue;
chanfd = open("/dev/dahdi/channel", O_RDWR);
if (chanfd == -1) {
fprintf(stderr,
"Couldn't open /dev/dahdi/channel: %s\n",
strerror(errno));
exit(-1);
return -1;
}
if (ioctl(chanfd, DAHDI_SPECIFY, &x)) {
@@ -749,6 +855,7 @@ static void apply_fiftysix(void)
}
close(chanfd);
}
return 0;
}
static int setechocan(char *keyword, char *args)
@@ -1444,12 +1551,27 @@ static int span_restrict(char *str)
return 1;
}
static const char *SEM_NAME = "dahdi_cfg";
static sem_t *lock = SEM_FAILED;
static void signal_handler(int signal)
{
if (SEM_FAILED != lock) {
sem_unlink(SEM_NAME);
}
/* The default handler should have been restored before this handler was
* called, so we can let the "normal" processing finish the cleanup. */
raise(signal);
}
int main(int argc, char *argv[])
{
int c;
char *buf;
char *key, *value;
int x,found;
int exit_code = 0;
struct sigaction act;
while((c = getopt(argc, argv, "fthc:vsd::C:S:")) != -1) {
switch(c) {
@@ -1469,7 +1591,7 @@ int main(int argc, char *argv[])
force++;
break;
case 't':
fo_real = 0;
dry_run = 1;
break;
case 's':
stopmode = 1;
@@ -1495,6 +1617,15 @@ int main(int argc, char *argv[])
fprintf(stderr, "%s\n", dahdi_tools_version);
}
if (!restrict_channels && !only_span) {
bool all_assigned = wait_for_all_spans_assigned(5);
if (!all_assigned) {
fprintf(stderr,
"Timeout waiting for all spans to be assigned.\n");
}
}
if (fd == -1) fd = open(MASTER_DEVICE, O_RDWR);
if (fd < 0) {
error("Unable to open master device '%s'\n", MASTER_DEVICE);
@@ -1553,18 +1684,48 @@ finish:
if (verbose) {
printconfig(fd);
}
if (!fo_real)
exit(0);
if (dry_run)
exit(0);
if (debug & DEBUG_APPLY) {
printf("About to open Master device\n");
fflush(stdout);
}
for (x=0;x<numdynamic;x++) {
/* destroy them all */
ioctl(fd, DAHDI_DYNAMIC_DESTROY, &zds[x]);
sigemptyset(&act.sa_mask);
act.sa_handler = signal_handler;
act.sa_flags = SA_RESETHAND;
if (sigaction(SIGTERM, &act, NULL) == -1) {
perror("Failed to install SIGTERM handler.");
exit(1);
}
if (sigaction(SIGINT, &act, NULL) == -1) {
perror("Failed to install SIGINT handler.");
exit(1);
}
lock = sem_open(SEM_NAME, O_CREAT, O_RDWR, 1);
if (SEM_FAILED == lock) {
perror("Unable to create 'dahdi_cfg' mutex");
exit_code = 1;
goto release_sem;
}
if (-1 == sem_wait(lock)) {
perror("Failed to wait for 'dahdi_cfg' mutex");
exit_code = 1;
goto unlink_sem;
}
if (!restrict_channels && !only_span) {
for (x=0;x<numdynamic;x++) {
/* destroy them all */
ioctl(fd, DAHDI_DYNAMIC_DESTROY, &zds[x]);
}
}
if (stopmode) {
for (x=0;x<spans;x++) {
if (only_span && lc[x].span != only_span)
@@ -1572,10 +1733,12 @@ finish:
if (ioctl(fd, DAHDI_SHUTDOWN, &lc[x].span)) {
fprintf(stderr, "DAHDI shutdown failed: %s\n", strerror(errno));
close(fd);
exit(1);
exit_code = 1;
goto release_sem;
}
}
exit(1);
exit_code = 1;
goto release_sem;
}
for (x=0;x<spans;x++) {
if (only_span && lc[x].span != only_span)
@@ -1583,16 +1746,32 @@ finish:
if (ioctl(fd, DAHDI_SPANCONFIG, lc + x)) {
fprintf(stderr, "DAHDI_SPANCONFIG failed on span %d: %s (%d)\n", lc[x].span, strerror(errno), errno);
close(fd);
exit(1);
exit_code = 1;
goto release_sem;
}
}
for (x=0;x<numdynamic;x++) {
if (ioctl(fd, DAHDI_DYNAMIC_CREATE, &zds[x])) {
fprintf(stderr, "DAHDI dynamic span creation failed: %s\n", strerror(errno));
close(fd);
exit(1);
if (!restrict_channels && !only_span) {
sem_post(lock);
for (x=0;x<numdynamic;x++) {
if (ioctl(fd, DAHDI_DYNAMIC_CREATE, &zds[x])) {
fprintf(stderr, "DAHDI dynamic span creation failed: %s\n", strerror(errno));
close(fd);
exit_code = 1;
goto release_sem;
}
wait_for_all_spans_assigned(1);
}
if (-1 == sem_wait(lock)) {
perror("Failed to wait for 'dahdi_cfg' mutex after creating dynamic spans");
exit_code = 1;
goto unlink_sem;
}
}
for (x=1;x<DAHDI_MAX_CHANNELS;x++) {
struct dahdi_params current_state;
int master;
@@ -1715,7 +1894,8 @@ finish:
" to channel 16 of an E1 CAS span\n");
}
close(fd);
exit(1);
exit_code = 1;
goto release_sem;
}
ae[x].chan = x;
@@ -1726,7 +1906,8 @@ finish:
if (ioctl(fd, DAHDI_ATTACH_ECHOCAN, &ae[x])) {
fprintf(stderr, "DAHDI_ATTACH_ECHOCAN failed on channel %d: %s (%d)\n", x, strerror(errno), errno);
close(fd);
exit(1);
exit_code = 1;
goto release_sem;
}
}
if (0 == numzones) {
@@ -1753,7 +1934,8 @@ finish:
if (ioctl(fd, DAHDI_DEFAULTZONE, &deftonezone)) {
fprintf(stderr, "DAHDI_DEFAULTZONE failed: %s (%d)\n", strerror(errno), errno);
close(fd);
exit(1);
exit_code = 1;
goto release_sem;
}
}
for (x=0;x<spans;x++) {
@@ -1762,9 +1944,18 @@ finish:
if (ioctl(fd, DAHDI_STARTUP, &lc[x].span)) {
fprintf(stderr, "DAHDI startup failed: %s\n", strerror(errno));
close(fd);
exit(1);
exit_code = 1;
goto release_sem;
}
}
apply_fiftysix();
exit(0);
exit_code = apply_fiftysix();
release_sem:
if (SEM_FAILED != lock)
sem_post(lock);
unlink_sem:
if (SEM_FAILED != lock)
sem_unlink(SEM_NAME);
exit(exit_code);
}

View File

@@ -141,7 +141,7 @@ fi
if [ "$#" -gt 0 ]; then
DEVICES="$@"
else
DEVICES=`echo $devbase/*`
DEVICES=`ls -d $devbase/* 2>/dev/null`
fi
# Beware of special characters in attributes

View File

@@ -27,6 +27,19 @@
# - "@location" - Location attribute from sysfs (embeded inside '<>')
# - "/devpath" - The sysfs absolute devpath
#
# * Wildcard are allowed in the configuration file:
# - In the device specifiers (keys)
# - In the span numbers
# - Example for "match-all": * *:T1
#
# * During "set":
# - If there are multiple matches, for a span, all are applied
# - They are always applied in their order in the configuration file
# - This means the last match wins
# - Example:
# * *:T1 # All span on all devices are T1
# usb:X1234567 [34]:E1 # Except spans 3,4 on specific device
#
# * During "dumpconfig", for each device we take the first available key:
# - The preference is: "hwid" or else "@location" or else "/devpath"
# - This can be overriden via the SPAN_ASSIGNMENTS_KEY environment variable
@@ -34,6 +47,8 @@
#
# Command line options:
# - The '-h|--help' show a usage message.
# - The '-v|--verbose' show debugging messages (on stderr)
# - The '-n|--dry-run' During "set", only show what would be done
# - The '-k <key>|--key <key>' overrides the SPAN_ASSIGNMENTS_KEY environment
# variable.
#
@@ -53,18 +68,21 @@ SPAN_ASSIGNMENTS_KEY=${SPAN_ASSIGNMENTS_KEY:-hwid}
usage() {
echo >&2 "Usage: $0 [options] action [devpath ...]"
echo >&2 " action:"
echo >&2 " set - set spans to E1/T1 according to configuration"
echo >&2 " set - set spans to E1/T1 according to /etc/dahdi/span-types.conf"
echo >&2 " list - human-readable list of all spans"
echo >&2 " dumpconfig - dump current state as new configuration"
echo >&2 " dumpconfig - dump current state in /etc/dahdi/span-types.conf format"
echo >&2 ""
echo >&2 " options:"
echo >&2 " -h|--help - Show this help"
echo >&2 " -v|--verbose' - Show debugging messages (on stderr)"
echo >&2 " -n|--dry-run' - During 'set', only show what would be done"
echo >&2 " -k|--key <k> - Override prefered key during dumpconfig action"
echo >&2 " --line-mode <m> - Set default line mode to <m> (E1/T1/J1)"
exit 1
}
# Parse command line options
TEMP=`getopt -o hk: --long help,key: -n "$0" -- "$@"`
TEMP=`getopt -o hnvk: --long help,dry-run,verbose,key:,line-mode: -n "$0" -- "$@"`
if [ $? != 0 ]; then
echo >&2 "Bad options"
usage
@@ -78,11 +96,24 @@ while true ; do
-h|--help)
usage
;;
-n|--dry-run)
shift
dry_run=true
;;
-v|--verbose)
shift
verbose=true
;;
-k|--key)
SPAN_ASSIGNMENTS_KEY="$2"
shift
shift
;;
--line-mode)
DEFAULT_LINE_MODE="$2"
shift
shift
;;
--)
shift
break
@@ -106,7 +137,17 @@ case "$SPAN_ASSIGNMENTS_KEY" in
hwid|location|devpath)
;;
*)
echo >&2 "Bad SPAN_ASSIGNMENTS_KEY='$SPAN_ASSIGNMENTS_KEY' (should be: hwid|location|devpath)"
echo >&2 "Bad --key='$SPAN_ASSIGNMENTS_KEY' (should be: hwid|location|devpath)"
usage
;;
esac
# Validate DEFAULT_LINE_MODE
case "$DEFAULT_LINE_MODE" in
E1|T1|J1|'')
;;
*)
echo >&2 "Bad --line-mode='$DEFAULT_LINE_MODE' (should be: E1|T1|J1)"
usage
;;
esac
@@ -120,12 +161,12 @@ fi
if [ "$#" -gt 0 ]; then
DEVICES="$@"
else
DEVICES=`echo $devbase/*`
DEVICES=`ls -d $devbase/* 2>/dev/null`
fi
# Beware of special characters in attributes
attr_clean() {
cat "$1" | tr -d '\n' | tr '!' '/' | tr -c 'a-zA-Z0-9/:.-' '_'
cat "$1" 2>/dev/null | tr -d '\n' | tr '!' '/' | tr -c 'a-zA-Z0-9/:.-' '_'
}
show_spantypes() {
@@ -138,21 +179,66 @@ show_spantypes() {
cat "$device/spantype" | while read st; do
case "$st" in
*:[ETJ]1)
printf "%-10s %-20s %s\n" \
"$st" "[$hardware_id]" "$location"
printf "%-10s %-20s %-30s %s\n" \
"$st" "[$hardware_id]" "$location" \
"$devpath"
;;
esac
done | sort -n
done
done
}
list_pri_spantypes() {
find $DEVICES -follow -maxdepth 1 -name spantype | \
xargs cat | \
sed -n '/:[ETJ]1$/s/^.*://p' | \
sort -u | \
tr '\n' ' ' | \
sed -e 's/^ *//' -e 's/ *$//'
}
dump_config() {
pri_spantypes=`list_pri_spantypes`
num_spantypes=`echo "$pri_spantypes" | wc -w`
gen_default=''
echo '#'
echo "# Autogenerated by $0 on `date`"
echo "# Map PRI DAHDI devices to span types for E1/T1/J1"
echo "#"
echo "# Summary:"
if [ "$DEFAULT_LINE_MODE" != '' ]; then
gen_default="$DEFAULT_LINE_MODE"
echo "# * Generating wildcard match of $gen_default."
echo "# - Was run with '--line-mode=$DEFAULT_LINE_MODE'"
elif [ "$num_spantypes" -eq 1 ]; then
gen_default="$pri_spantypes"
echo "# * Generating wildcard match of $gen_default."
echo "# - Spans were $pri_spantypes"
else
echo "# * Not generating wildcard match."
echo "# - Was run without '--line-mode' option and span were of mixed types [$pri_spantypes]"
fi
echo "#"
if [ "$num_spantypes" -eq 1 ]; then
echo "# * Generating a list of commented out configurations for spans."
echo "# - Spans were $pri_spantypes"
echo "# - Uncomment for specific overrides"
else
echo "# * Generating a list of specific span configurations."
echo "# - Spans were of mixed types: $pri_spantypes"
fi
echo "#"
echo ''
fmt="%-65s %s\n"
printf "$fmt" '# @location/hardware_id' 'span_type'
fmt="%-65s %s"
printf "$fmt\n" '# @location/hardware_id' 'span_type'
if [ "$gen_default" != '' ]; then
printf "$fmt\t\t# Wildcard line-mode" "*" "*:$gen_default"
echo ""
fi
echo ""
for device in $DEVICES
do
devpath=`cd "$device" && pwd -P`
@@ -169,14 +255,18 @@ dump_config() {
cat "$device/spantype" | while read st; do
case "$st" in
*:[ETJ]1)
printf "$fmt" "$id" "$st"
if [ "$num_spantypes" -eq 1 ]; then
printf "#$fmt\n" "$id" "$st"
else
printf "$fmt\n" "$id" "$st"
fi
;;
*)
#echo "# Skipped local span `echo $st | sed 's/:/ -- /'`"
;;
esac
done | sort -n
#echo ''
echo ''
done
}
@@ -185,70 +275,78 @@ filter_conf() {
sed -e 's/#.*//' -e '/^[ \t]*$/d' "$DAHDISPANTYPESCONF"
}
conf_spans() {
hardware_id="$1"
location="$2"
devpath="$3"
filter_conf | (
# Collect device spans
# in a subshell, so $SPANS is not lost
SPANS=''
while read id spans; do
handle_span() {
device="$1"
spantype="$2"
attr_file="$device/spantype"
devpath=`cd "$device" && pwd -P`
devname=`echo "$device" | sed "s,$devbase/,,"`
location='@'`attr_clean "$device/location"`
hardware_id=`attr_clean "$device/hardware_id"`
spanno=`echo "$spantype" | cut -d: -f1`
#echo >&2 "DEBUG: $device $spanno ($spantype)"
filter_conf | while read id span_spec; do
sn=`echo "$span_spec" | cut -d: -f1`
val=`echo "$span_spec" | cut -d: -f2`
case "$spanno" in
$sn)
;;
*)
#echo >&2 "no-match($device $spanno): $sn"
continue
;;
esac
found=no
# GLOBBING
case "$location" in
$id)
#echo >&2 "match($id): $spans"
SPANS="$SPANS $spans"
#echo >&2 "match($id): $span_spec"
found=yes
;;
esac
case "$hardware_id" in
$id)
#echo >&2 "match([$id]): $spans"
SPANS="$SPANS $spans"
#echo >&2 "match([$id]): $span_spec"
found=yes
;;
esac
case "$devpath" in
$id)
#echo >&2 "match([$id]): $spans"
SPANS="$SPANS $spans"
#echo >&2 "match([$id]): $span_spec"
found=yes
;;
esac
done
echo "$SPANS"
)
}
device_set_spantype() {
device="$1"
attr_file="$device/spantype"
devpath=`cd "$device" && pwd -P`
location='@'`attr_clean "$device/location"`
hardware_id=`attr_clean "$device/hardware_id"`
spanspecs=`conf_spans "$hardware_id" "$location" "$devpath"`
#echo >&2 "MATCHED($device): $spanspecs"
cut -d: -f1 "$attr_file" | while read spanno; do
for sp in $spanspecs
do
s=`echo "$sp" | cut -d: -f1`
v=`echo "$sp" | cut -d: -f2`
case "$spanno" in
$s)
#echo >&2 "conf($attr_file): $spanno:$v"
echo "$spanno:$v" > "$attr_file"
;;
esac
done
if [ "$found" = 'yes' ]; then
if [ "$dry_run" = 'true' -o "$verbose" = 'true' ]; then
echo >&2 "Set $devname span $spanno = $val"
fi
if [ "$dry_run" != 'true' ]; then
echo "$spanno:$val" > "$attr_file"
fi
fi
done
}
set_spantypes() {
set_all_devices() {
if [ ! -f "$DAHDISPANTYPESCONF" ]; then
echo >&2 "$0: Missing configuration '$DAHDISPANTYPESCONF'"
exit 1
fi
for device in $DEVICES
do
device_set_spantype "$device"
devname=`echo "$device" | sed "s,$devbase/,,"`
cat "$device/spantype" | while read spantype; do
case "$spantype" in
*:[ETJ]1)
handle_span "$device" "$spantype"
;;
*)
if [ "$dry_run" = 'true' -o "$verbose" = 'true' ]; then
echo >&2 "Skipping non-E1/T1/J1 span ($devname -- $spantype)"
fi
;;
esac
done
done
}
@@ -260,7 +358,7 @@ dumpconfig)
dump_config
;;
set)
set_spantypes
set_all_devices
;;
*)
usage

73
dahdi_waitfor_span_assignments Executable file
View File

@@ -0,0 +1,73 @@
#! /bin/sh
usage() {
echo >&2 "Usage: $0 {assigned|unassigned}"
echo >&2 "# wait until all spans known are assigned/unassigned"
exit 1
}
TIMEOUT=5 # How much time to wait for spans
if [ "$#" -lt 1 ]; then
usage
fi
wanted_event="$1"
shift
case "$wanted_event" in
assigned)
;;
unassigned)
;;
*)
usage
;;
esac
devbase='/sys/bus/dahdi_devices/devices'
spans_of() {
dev="$1"
wc -l < "$dev/spantype"
}
assigned_spans_of() {
dev="$1"
ls -d "$dev/span-"* 2>/dev/null | wc -l
}
waitfor_span_assignments() {
wanted_state="$1"
device_list=`ls -d "$devbase/"* 2> /dev/null`
finished=''
count="$TIMEOUT"
echo -n "Waiting for spans to become $wanted_state: "
while [ "$count" -gt 0 ]; do
finished='yes'
for dev in $device_list
do
spans=`spans_of "$dev"`
assigned_spans=`assigned_spans_of "$dev"`
if [ "$wanted_state" = 'assigned' -a "$assigned_spans" -ne "$spans" ]; then
finished='no'
elif [ "$wanted_state" = 'unassigned' -a "$assigned_spans" -ne 0 ]; then
finished='no'
fi
done
if [ "$finished" = 'yes' ]; then
break
else
sleep 1
echo -n "."
fi
count=`expr "$count" - 1`
done
if [ "$finished" = 'yes' ]; then
echo "done"
else
echo "timeout"
fi
}
waitfor_span_assignments "$wanted_event"

View File

@@ -4,7 +4,7 @@
dahdi_cfg \- configures DAHDI kernel modules from /etc/dahdi/system.conf
.SH SYNOPSIS
.B dahdi_cfg [\-c \fICFG_FILE\fB] [\-S\fINUM\fB [-S\fICHANS\fB]] [\-s] [\-f] [\-t] [\-v [\-v ... ] ]
.B dahdi_cfg [\-c \fICFG_FILE\fB] [\-S\fINUM\fB [\-S\fICHANS\fB]] [\-s] [\-f] [\-t] [\-v [\-v ... ] ]
.B dahdi_cfg \-h

View File

@@ -43,11 +43,11 @@ Insert an error of a specific type
.SH EXAMPLES
Enable network line loopback on span 1:
dahdi_maint -s 1 --loopback networkline
dahdi_maint \-s 1 \-\-loopback networkline
Disable network line loopback on span 1:
dahdi_maint -s 1 --loopback off
dahdi_maint \-s 1 \-\-loopback off
.SH SEE ALSO

View File

@@ -35,7 +35,7 @@ Normally there's a different option that you need that implies it.
.B \-o
.RS
Plays the output to OSS (/dev/dsp). Requires -m not to be used.
Plays the output to OSS (/dev/dsp). Requires \-m not to be used.
.RE
.B \-v
@@ -44,7 +44,7 @@ Display Visual audio levels. With two v-s, Verbose mode is enabled, that
shows the actual levels as numbers. Note that this requires a terminal
wider than 80 columns to be properly displayed.
Implies -m.
Implies \-m.
.RE
.B \-f \fIFILE
@@ -62,14 +62,14 @@ to a file.
.RS
Record the content of the Rx channel to a file.
Implies -m.
Implies \-m.
.RE
.B \-R \fIFILE
.RS
Record the content of the R channel before the echo canceler to a file.
Implies -m.
Implies \-m.
.RE
.B \-s \fIFILE
@@ -87,47 +87,47 @@ canceler to a file.
.RS
Record the content of the Tx channel to a file.
Implies -m.
Implies \-m.
.RE
.B \-T \fIFILE
.RS
Record the content of the Tx channel before the echo canceler to a file.
Implies -m.
Implies \-m.
.RE
.SH EXAMPLES
Visualize audio levels on DAHDI channel 2:
dahdi_monitor 2 -v
dahdi_monitor 2 \-v
Record channel 3 to a file:
dahdi_monitor 3 -f output.raw
dahdi_monitor 3 \-f output.raw
This will create a raw PCM file (signed-linear, 8kHz, mono, 16 bits per
sample). Both the Tx and Rx will be multiplexed in a single channel.
It can be converted to a WAV file using e.g.:
sox -s -c1 -2 -r8000 output.raw output.wav
sox \-s \-c1 \-2 \-r8000 output.raw output.wav
Record Tx and Rx of channel 5 to separate files. This time directly to
WAV files:
dahdi_monitor 5 -r output_rx.wav -t output_tx.wav
dahdi_monitor 5 \-r output_rx.wav \-t output_tx.wav
Record channel 8 to a stereo file (Tx and Rx on its two channels):
dahdi_monitor 8 -s output.raw
dahdi_monitor 8 \-s output.raw
Converting it to a WAV file:
sox -s -c2 -2 -r8000 output.raw output.wav
sox \-s \-c2 \-2 \-r8000 output.raw output.wav

View File

@@ -1,55 +1,82 @@
.TH "SPAN_ASSIGNMENTS" "8" "13 Oct 2013" "" ""
.TH "DAHDI_SPAN_ASSIGNMENTS" "8" "23 Jan 2014" "" ""
.SH NAME
dahdi_span_assignments \- handle DAHDI spans registration
dahdi_span_assignments \- handle DAHDI spans assignments
.SH SYNOPSIS
.B dahdi_span_assignments [\-v|\-\-verbose] [\-n|\-\-dry\-run] <add|remove> \fIdevpath
\fB[\fIdevpath \fB...]
.B dahdi_span_assignments [\-v|\-\-verbose] [\-n|\-\-dry\-run] <add|remove|auto> \fB[\fIdevpath\fB...]
.B dahdi_span_assignments [\-v|\-\-verbose] [\-n|\-\-dry\-run] auto
.B dahdi_span_assignments [\-v|\-\-verbose] list
.B dahdi_span_assignments [\-v|\-\-verbose] list \fB[\fIdevpath\fB...]
.B dahdi_span_assignments [\-v|\-\-verbose] [\-k|\-\-key \fIkey\fB] dumpconfig
.B dahdi_span_assignments \-h|\-\-help
.SH DESCRIPTION
Channels in DAHDI devices (such as DAHDI PCI cards) are groups to logical
units called "spans" (for example: a port in a digital card is a span).
When the kernel module parameter \fBdahdi.auto_assign_span\fR is unset,
DAHDI devices (such as DAHDI PCI cards) that register with DAHDI don't
register their spans (e.g.: each digital port is normally a span) with
DAHDI. This allows user-space to order DAHDI to register them to specific
span and channel numbers. This allows registering different spans out of
order.
DAHDI devices that register with DAHDI don't cause their spans to be
automatically assigned.
This allows user-space to order DAHDI to assign them to specific span
and channel numbers. That way, specific spans on specific DAHDI devices
may be assigned with specific span and channel numbers \fBregardless\fR
of the registration order of the hardware (or if all hardware is present
at all).
.B dahdi_span_assignments
is used to register those spans or to help creating the configuration
file used in their registration:
.B /etc/dahdi/assigned-spans.conf .
is used to assign those spans or to help creating the configuration
file used in their assignment:
.B /etc/dahdi/assigned\-spans.conf .
.SH OPTIONS
.SH SUB-COMMANDS
There are several sub-commands:
There are several sub-commands.
.B add \fIdevpath \fB[\fIdevpath \fB...]
All sub-commands take an optional list of paths to SysFS nodes of
devices. If given, the command will only operate on those DAHDI
devices. The default is to operate on all devices (which would normally
be the sane case when running from the command-line).
.B add \fB[\fIdevpath \fB...]
.RS
Parameters are paths (in SysFS) to DAHDI devices with unregistered
spans. The command will register with DAHDI according to according to
configuration in \fBassigned-spans.conf\fR.
Applies to all devices or to those listed on the command line.
Parameters are paths (in SysFS) to DAHDI devices with unassigned
spans.
The command will assign spans with DAHDI according to
configuration in \fBassigned\-spans.conf\fR.
If no line matches the span, or if the assignment for it fails (it is
not available) it will remain unassigned.
If any of the span settings fails (the span number or range of channels
is already in use), the program will print a message, but continue
applying the others. In such a case you should fix assigned\-spans.conf
and re-run \fBadd\fR (or run \fBauto\fR to give those channels the
first available range and regenerate the file with 'dahdi_genconf
assignedspans').
.RE
.B remove \fIdevpath \fB[\fIdevpath \fB...]
.B remove \fB[\fIdevpath \fB...]
.RS
Parameters are paths (in SysFS) to DAHDI devices with registered
spans. The command will unregister with DAHDI.
Applies to all devices or to those listed on the command line.
Parameters are paths (in SysFS) to DAHDI devices with assigned
spans.
The command will un-assign them.
.RE
.B auto
.B auto \fB[\fIdevpath \fB...]
.RS
Register all non-registered spans. Each span registers to first
available span number and channel numbers, as if
\fBdahdi.auto_assign_span\fR was set.
Applies to all devices or to those listed on the command line.
Parameters are paths (in SysFS) to DAHDI devices with unassigned
spans.
Each span is assigned to first available span number and channel
numbers, as if \fBdahdi.auto_assign_span\fR was set. The configuration
file doesn't affect these assignments.
.RE
.B list
@@ -59,14 +86,16 @@ List all spans in the system.
.B dumpconfig
.RS
List all registered spans in the system in a format fit to be used in
\fBassigned-spans.conf\fR. Use this to generate a configuration file after
you have (perhaps manually) registered all existing spans.
List all assigned spans in the system in a format fit to be used in
\fBassigned\-spans.conf\fR. Use this to generate a configuration file after
you have (automatically or manually) assigned all existing spans.
.B dahdi_genconf assignedspans
uses this command internally.
.RE
.SH OPTIONS
.B \-v \-\-verbose
.RS
Verbose output.
@@ -74,7 +103,7 @@ Verbose output.
.B \-n \-\-dry\-run
.RS
Don't register / unregister spans. Only print commands used to do so.
Don't assign / un-assign spans. Only print commands used to do so.
.RE
.B \-k \fIkey
@@ -101,9 +130,9 @@ Path in SysFS to the device node.
.RE
.RE
.SH CONFIGURATOIN
.B assigned-spans.conf
is a file with lines specifying registration of spans.
.SH CONFIGURATION
.B /etc/dahdi/assigned\-spans.conf
is a file with lines specifying assignment of spans.
Empty lines or lines beginning with '#' are ignored.
@@ -112,7 +141,7 @@ Each line is in the format of:
.I ID spanspec ...
The \fIID\fR field specifies the DAHDI device and the \fIspanspecs\fR
define how to register its spans. A line may have multiple
define how to assign its spans. A line may have multiple
\fIspanspecs\fR in a single line (though dumpconfig generates a
configuration with one per line).
@@ -132,12 +161,12 @@ The value in this field is matched (when the commands \fBadd\fR and
See above for their descriptions. The value may include shell wildcards:
*, ? and [], which are used in the match. The values to be matched are
first cleaned up: '!' is replaced with '/' and any character beyond
"a-zA-Z0-9/:.-" is removed.
"a\-zA\-Z0\-9/:.\-" is removed.
.SS Span Specification
Each line should have one or more span specifications: this is the value
used to register a span with DAHDI in the SysFS interface. A
used to assign a span with DAHDI in the SysFS interface. A
specification has three colon-separated numbers:
.I rel_span_no:span_no:first_chan
@@ -159,7 +188,7 @@ The desired DAHDI span number. Must be available.
.B first_chan
.RS
The desired DAHDI channel number for the first DAHDI channel in the span.
All channels of the span will be registered following it and hence that
All channels of the span will be assigned following it and hence that
space must be available.
.RE
@@ -168,13 +197,13 @@ space must be available.
.B DAHDICONFDIR
.RS
The directory in which assigned-spans.conf resides. /etc/dahdi if not
The directory in which assigned\-spans.conf resides. /etc/dahdi if not
overridden from the environment.
.RE
.B DAHDISASSIGNEDSPANSCONF
.RS
The path to assigned-spans.conf resides. /etc/dahdi/assigned-spans.conf if
The path to assigned-spans.conf resides. /etc/dahdi/assigned\-spans.conf if
not overridden from the environment.
.RE
@@ -187,7 +216,7 @@ environment.
.SH FILES
.B /etc/dahdi/assigned-spans.conf
.B /etc/dahdi/assigned\-spans.conf
.RS
The default location for the configuration file.
.RE

View File

@@ -1,44 +1,73 @@
.TH "SPAN_TYPES" "8" "13 Oct 2013" "" ""
.TH "DAHDI_SPAN_TYPES" "8" "23 Jan 2014" "" ""
.SH NAME
dahdi_span_types \- set DAHDI spans properties before registration (E1/T1)
dahdi_span_types \- set line modes of DAHDI spans before assignment
.SH SYNOPSIS
.B dahdi_span_types <list|dumpconfig|set> [\fIdevpath \fB[\fIdevpath \fB...]]
.B dahdi_span_types [\fIoptions\fB] <list|dumpconfig|set> \fB[\fIdevpath \fB...]
.SH DESCRIPTION
The span type (E1/T1/J1) must be set to a span before registering it
with DAHDI, as E1 spans use more channels. \fBdahdi_span_types\fR applies the
span type configuration to an unregistered span.
The span type (the line mode: E1/T1/J1) must be set to a span before
DAHDI assigns it a span number, as E1 spans use more channels.
\fBdahdi_span_types\fR applies the span type configuration to an
un-assigned span.
Using it only makes sense when the kernel module parameter
\fBdahdi.auto_assign_span\fR is unset, otherwise the DAHDI spans register
automatically.
\fBdahdi.auto_assign_span\fR is unset, otherwise DAHDI automatically
assign span numbers during device registration.
.SH OPTIONS
.B dahdi_span_types
takes a command and an optional list of devices. If no device is given,
the command is applied to all devices.
The device is marked as a path in the SysFS tree.
.SH OPTIONS
.B \-h|\-\-help
.RS
Output usage message and exit
.RE
.B \-n|\-\-dry\-run
.RS
During \fB"set"\fR operation, only show what would be done, without actually
changing anything.
.RE
.B \-v|\-\-verbose
.RS
During \fB"set"\fR operation, show the actions that are being performed.
.RE
.BI \-\-line\-mode= <E1|T1|J1>
.RS
During \fB"dumpconfig"\fR operation, force special generation mode:
.IP \(bu 3
First, generates a "wildcard" entry with the fiven \fBline\-mode\fR.
.IP \(bu 3
Comment out all span entries. Each of them may be manually un-commented
to override the "wildcard".
.RE
.SH SUB-COMMANDS
.B set
.RS
Reads settings from \fBspan-types.conf\fR and applies them to the
Reads settings from \fBspan\-types.conf\fR and applies them to the
device(s) specified in the command line (or all devices, if none
specified).
.RE
.B list
.RS
List types for all spans in the system which may be set with dahdi_span_types
(E1/T1/J1 spans).
List line modes for all spans in the system which may be set with
dahdi_span_types (E1/T1/J1 spans).
.RE
.B dumpconfig
.RS
List types for the spans in a format fit to be used in
\fBspan-types.conf\fR. Use this to generate a configuration file after
\fBspan\-types.conf\fR. Use this to generate a configuration file after
you have (perhaps manually) set all existing spans.
.B dahdi_genconf spantypes
@@ -46,8 +75,9 @@ uses this command internally.
.RE
.SH CONFIGURATION
.B span-types.conf
is a file with lines specifying registration of spans.
.SS General structure
.B span\-types.conf
is a file with lines specifying line modes of spans.
Empty lines or lines beginning with '#' are ignored.
@@ -56,7 +86,7 @@ Each line is in the format of:
.I ID spanspec ...
The \fIID\fR field specifies the DAHDI device and the \fIspanspecs\fR
define how to register its spans. A line may have multiple
define the line modes of its spans. A line may have multiple
\fIspanspecs\fR in a single line (though dumpconfig generates a
configuration with one per line).
@@ -66,8 +96,8 @@ software readable serial number or whatever) or the location in which
it is installed on the system. The former makes it simpler to change
connector / slot whereas the latter makes it simpler to replace a unit.
The value in this field is matched (when the commands \fBadd\fR and
\fBremove\fR) are used) to the following values:
The value in this field is matched (when the command \fBset\fR is
used) to the following values:
\fIhwid\fR
\fB@\fIlocation\fR
@@ -75,22 +105,28 @@ The value in this field is matched (when the commands \fBadd\fR and
See above for their descriptions. The value may include shell wildcards:
*, ? and [], which are used in the match. The values to be matched are
first cleaned up: '!' is replaced with '/' and any character beyond
"a-zA-Z0-9/:.-" is removed.
first cleaned up: '!' is replaced with '/' and any character not in
"a\-zA\-Z0\-9/:.\-" is replaced by "_".
Note that while span\-types.conf allows an arbitrarily-complex
combination of E1, J1 and T1 ports, it would normally have just a single
wildcard line setting the line mode (the first line in the example below).
.SS Span Specification
Each line should have one or more span specifications: this is the value
used to register a span with DAHDI in the SysFS interface. A
specification has three colon-separated numbers:
used to set span type with DAHDI in the SysFS interface. A
specification has two colon-separated fields:
.I rel_span_no:span_type
for instance, the following are four span specifications specify ports 1 and 2 as E1 and ports 3 and 4 as T1: [12]:E1 [34]:T1 .
for instance, the following are four span specifications specify ports 1
and 2 as E1 and ports 3 and 4 as T1: [12]:E1 [34]:T1 .
.B rel_span_no
.RS
The relative number of the span in the device. E.g.: port number.
This field may contain shell wildcards (*, ? and [])
.RE
.B span_type
@@ -98,25 +134,40 @@ The relative number of the span in the device. E.g.: port number.
E1/T1/J1
.RE
.SS Multiple matches
During \fBset\fR operation, the \fBdahdi_span_types\fR applies all
matching settings to a span. This is done in the order of lines in the
configuration files.
Thus, if there are multiple matches to a span -- the last match
will \fIwin\fR (all will be applied to the kernel in order. The last
one in the file will be applied last).
Example:
.EX
* *:T1 # All spans on all devices will be T1
usb:X1234567 [34]:E1 # Except spans 3,4 on the device which will be E1
.EE
.SH ENVIRONMENT
.B DAHDICONFDIR
.RS
The directory in which span-types.conf resides. /etc/dahdi if not
The directory in which span\-types.conf resides. /etc/dahdi if not
overridden from the environment.
.RE
.B DAHDISPANTYPESCONF
.RS
The path to span-types.conf resides. /etc/dahdi/span-types.conf if
The path to span\-types.conf resides. /etc/dahdi/span\-types.conf if
not overridden from the environment.
.RE
.SH FILES
.B /etc/dahdi/span-types.conf
.B /etc/dahdi/span\-types.conf
.RS
The default location for the configuration file.
.RE
@@ -129,8 +180,8 @@ files, among others:
.B spantype
.RS
read/write file. Reading from it returns current configuration for spans
of the device. Span-specifications can be written to it to change types
(but only for a span that is not registered).
of the device. Span-specifications can be written to it to change line
modes (but only for a span that is not assigned yet).
.RE

View File

@@ -0,0 +1,49 @@
.TH "DAHDI_WAITFOR_SPAN_ASSIGNMENTS" "8" "22 Jan 2014" "" ""
.SH NAME
dahdi_waitfor_span_assignments \- wait for DAHDI spans to get (un)assigned
.SH SYNOPSIS
.B dahdi_span_assignments assigned
.B dahdi_span_assignments unassigned
.SH DESCRIPTION
DAHDI spans get assigned / unassigned asynchronously.
.B dahdi_span_assignments
is a helper script that allows running commands after all the spans have
been assigned or unassigned.
It takes a single command: \fBassigned\fR or \fBunassigned\fR and waits
(up until a timeout of 5 seconds) for all the DAHDI spans in the system
to do so.
Note that if the system has a span that will not get assigned
automatically (e.g.: it's not in assigned\-spans.conf), this program
does not know and will wait until a timeout.
.SH EXAMPLES
modprobe wctdm24xxp
dahdi_waitfor_span_assignments assigned
do_something
dahdi_span_assignments add
dahdi_waitfor_span_assignments assigned
do_something_else
dahdi_span_assignments remove
dahdi_span_assignments unassigned
do_something_completely_different
.SH SEE ALSO
dahdi_span_assignments(8)
.SH AUTHOR
dahdi_waitfor_span_assignments was written by Oron Peled. This manual
page was written by Tzafrir Cohen. Permission is granted to copy,
distribute and/or modify this document under the terms of the GNU
General Public License, Version 2 any later version published by the
Free Software Foundation.

View File

@@ -0,0 +1,25 @@
#! /bin/sh
devdir='/sys/bus/dahdi_devices/devices'
# DAHDI is loaded?
if [ ! -d "$devdir" ]; then
exit 0
fi
devices_by_registration_time() {
grep -H '' $devdir/*/registration_time 2>/dev/null | \
sed 's,/registration_time:,\t,' | \
sort -k 2,2
}
# First assign non-Astribank devices
devices_by_registration_time | \
grep -v '/astribanks:' | \
while read devpath time; do
echo >&2 "D: auto '$devpath'"
dahdi_span_assignments auto "$devpath"
done
# Now handle Astribanks
LC_ALL=C dahdi_registration -Rv on

View File

@@ -20,6 +20,7 @@ exec 2> /dev/null
# Our directory in the beginning, so we can use local lab setup
PATH="$dir:/usr/sbin:/sbin:/usr/bin:/bin"
export PATH
set -e
@@ -35,44 +36,50 @@ if [ "$DAHDI_UDEV_DISABLE_DEVICES" = 'yes' ]; then
exit 0
fi
# Check if we can safely do our job
if [ ! -f /sys/module/dahdi/parameters/auto_assign_spans ]; then
echo "Old driver (no auto_assign_spans parameter). Skip $DEVPATH" | $LOGGER
exit 0
fi
if [ `cat /sys/module/dahdi/parameters/auto_assign_spans` -eq 1 ]; then
echo "auto_assign_spans=1. Skip $DEVPATH" | $LOGGER
exit 0
fi
# Can we pass a different value so we can use
# alternate (testing) configuration?
# Meanwhile, make it hard-coded.
DAHDICONFDIR='/etc/dahdi'
export DAHDICONFDIR
run_parts() {
# Have our internal "run-parts" (adapted from Fedora),
# as implementations differ
for i in `LC_ALL=C; ls -d $dir/handle_device.d/*[!~,] 2>/dev/null` ; do
[ -d "$i" ] && continue
[ ! -x "$i" ] && continue
# Don't run *.{rpmsave,rpmorig,rpmnew,swp,cfsaved} files
case "$i" in
*.cfsaved|*.rpmsave|*.rpmorig|*.rpmnew|*.swp|*,v)
continue
;;
esac
echo "D: Running '$i'"
"$i"
done
}
case "$ACTION" in
add)
echo "$ACTION: $DEVPATH" | $LOGGER
# Can have alternate dahdi configuration directory for debugging
# export DAHDICONFDIR="/tmp/xortel/dahdi"
# Don't block udev for too long
(
if [ -r "$DAHDICONFDIR/span-types.conf" ]; then
dahdi_span_types set "/sys$DEVPATH"
fi
if [ -r "$DAHDICONFDIR/assigned-spans.conf" ]; then
dahdi_span_assignments add "/sys$DEVPATH"
else
# No configuration. No order guaranteed
dahdi_span_assignments auto
fi
) 2>&1 < /dev/null | $LOGGER &
# Check if we can safely do our job
if [ ! -f /sys/module/dahdi/parameters/auto_assign_spans ]; then
echo "Old driver (no auto_assign_spans parameter). Skip $DEVPATH" | $LOGGER
exit 0
fi
if [ `cat /sys/module/dahdi/parameters/auto_assign_spans` -ne 0 ]; then
echo "auto_assign_spans=1. Skip $DEVPATH" | $LOGGER
exit 0
fi
# Background run -- don't block udev
run_parts 2>&1 < /dev/null | $LOGGER &
;;
remove)
# Nothing to do yet...
echo "$ACTION: $DEVPATH" | $LOGGER
# Background run -- don't block udev
run_parts 2>&1 < /dev/null | $LOGGER &
;;
*)
echo "UNHANDLED: $ACTION: $DEVPATH" | $LOGGER

View File

@@ -20,6 +20,7 @@ exec 2> /dev/null
# Our directory in the beginning, so we can use local lab setup
PATH="$dir:/usr/sbin:/sbin:/usr/bin:/bin"
export PATH
set -e
@@ -41,52 +42,49 @@ fi
DAHDICONFDIR='/etc/dahdi'
export DAHDICONFDIR
run_dahdi_cfg() {
echo "dahdi_cfg: span $spanno <$basechan-$endchan> ($DEVPATH)"
dahdi_cfg -c "$cfg_file" -S "$spanno" -C "$basechan-$endchan"
}
configure_span() {
span_devpath="$1"
# Sanity check
checkit=`"dahdi_cfg" --help 2>&1 | grep -- '-S' | wc -l`
if [ "$checkit" != 1 ]; then
echo "Bad dahdi_cfg (no -S support). Skipping"
exit 0
fi
# Set variables
spanno=`echo "$span_devpath" | sed 's,.*/span-,,'`
basechan=`cat "$span_devpath/basechan"`
channels=`cat "$span_devpath/channels"`
endchan=`expr "$basechan" + "$channels" - 1`
# Configure DAHDI
cfg_file="$DAHDICONFDIR/system.conf"
if [ -r "$cfg_file" ]; then
run_dahdi_cfg
else
echo "Using auto-generated config for dahdi_cfg"
cfg_file='-'
DAHDI_CONF_FILE="$cfg_file" dahdi_genconf system | run_dahdi_cfg
fi
fxotune_cfg='/etc/fxotune.conf'
if [ -r "$fxotune_cfg" ]; then
echo "fxotune: span $spanno <$basechan-$endchan> ($DEVPATH)"
fxotune -s -b "$basechan" -e "$endchan"
fi
# Add to asterisk
asterisk -rx "dahdi create channels $basechan $endchan"
run_parts() {
# Have our internal "run-parts" (adapted from Fedora),
# as implementations differ
for i in `LC_ALL=C; ls -d $dir/span_config.d/*[!~,] 2>/dev/null` ; do
[ -d "$i" ] && continue
[ ! -x "$i" ] && continue
# Don't run *.{rpmsave,rpmorig,rpmnew,swp,cfsaved} files
case "$i" in
*.cfsaved|*.rpmsave|*.rpmorig|*.rpmnew|*.swp|*,v)
continue
;;
esac
#echo "D: Running '$i'"
"$i"
done
}
case "$ACTION" in
add)
echo "$ACTION: $DEVPATH" | $LOGGER
# Can have alternate dahdi configuration directory for debugging
# export DAHDICONFDIR="/tmp/xortel/dahdi"
configure_span "/sys$DEVPATH" 2>&1 | $LOGGER
# Old driver. These scripts probably won't work anyway.
if [ ! -f /sys/module/dahdi/parameters/auto_assign_spans ]; then
if [ -f /sys/module/dahdi ]; then
$LOGGER "Old driver (no auto_assign_spans parameter). Skip $DEVPATH"
exit 0
fi
fi
if [ $(cat /sys/module/dahdi/parameters/auto_assign_spans) -ne 0 ]; then
$LOGGER "auto_assign_spans=1. Skip $DEVPATH"
exit 0
fi
# Set variables
span_devpath="/sys$DEVPATH"
SPANNO=`echo "$span_devpath" | sed 's,.*/span-,,'`
BASECHAN=`cat "$span_devpath/basechan"`
CHANNELS=`cat "$span_devpath/channels"`
ENDCHAN=`expr "$BASECHAN" + "$CHANNELS" - 1`
export SPANNO BASECHAN CHANNELS ENDCHAN
# Background run -- don't block udev
run_parts 2>&1 < /dev/null | $LOGGER &
;;
remove|online|offline)
# Nothing to do yet...

View File

@@ -0,0 +1,12 @@
#! /bin/sh
case "$ACTION" in
add)
;;
*)
exit 0
esac
if [ -r "$DAHDICONFDIR/span-types.conf" ]; then
dahdi_span_types set "/sys$DEVPATH"
fi

View File

@@ -0,0 +1,15 @@
#! /bin/sh
case "$ACTION" in
add)
;;
*)
exit 0
esac
# For now, handle only spans in assigned-spans.conf
# We leave other cases to /etc/init.d/dahdi, so
# legacy ordering can be preserved.
if [ -r "$DAHDICONFDIR/assigned-spans.conf" ]; then
dahdi_span_assignments add "/sys$DEVPATH"
fi

View File

@@ -0,0 +1,28 @@
#! /bin/sh
if [ "$ACTION" != 'add' ]; then
# Nothing to do here
exit 0
fi
# Sanity check
checkit=`"dahdi_cfg" --help 2>&1 | grep -- '-S' | wc -l`
if [ "$checkit" != 1 ]; then
echo "Bad dahdi_cfg (no -S support). Skipping"
exit 0
fi
run_dahdi_cfg() {
echo "dahdi_cfg: span $SPANNO <$BASECHAN-$ENDCHAN> ($DEVPATH)"
dahdi_cfg -c "$cfg_file" -S "$SPANNO" -C "$BASECHAN-$ENDCHAN"
}
# Configure DAHDI
cfg_file="$DAHDICONFDIR/system.conf"
if [ -r "$cfg_file" ]; then
run_dahdi_cfg
else
echo "Using auto-generated config for dahdi_cfg"
cfg_file='-'
DAHDI_CONF_FILE="$cfg_file" dahdi_genconf system | run_dahdi_cfg
fi

View File

@@ -0,0 +1,12 @@
#! /bin/sh
if [ "$ACTION" != 'add' ]; then
# Nothing to do here
exit 0
fi
fxotune_cfg='/etc/fxotune.conf'
if [ -r "$fxotune_cfg" ]; then
echo "fxotune: span $SPANNO <$BASECHAN-$ENDCHAN> ($DEVPATH)"
fxotune -s -b "$BASECHAN" -e "$ENDCHAN"
fi

View File

@@ -0,0 +1,14 @@
#! /bin/sh
# This file, if installed under /usr/share/dahdi/span_config.d/ , will
# attempt to add a newly-generated span to a running copy of Asterisk.
# Asterisk has to be running (if not: it will pick the span on its
# startup), and has to have the channels already configured.
if [ "$ACTION" != 'add' ]; then
# Nothing to do here
exit 0
fi
# Add to asterisk
asterisk -rx "dahdi create channels $BASECHAN $ENDCHAN"

View File

@@ -17,6 +17,7 @@
#XPP_FIRMWARE_DIR=/usr/share/dahdi
#XPP_HOTPLUG_DISABLED=yes
#XPP_HOTPLUG_DAHDI=yes
#ASTERISK_SUPPORTS_DAHDI_HOTPLUG=yes
# Disable udev handling:
#DAHDI_UDEV_DISABLE_DEVICES=yes

View File

@@ -15,6 +15,8 @@ wct4xxp
# Digium TE435
# Digium TE235
# Digium TE436
# Digium TE236
wcte43x
# Digium TE120P: PCI single-port T1/E1/J1
@@ -24,6 +26,8 @@ wcte12xp
# Digium TE131: PCI-Express single-port T1/E1/J1
# Digium TE132: PCI single-port T1/E1/J1
# Digium TE133: PCI-Express single-port T1/E1/J1 with hardware echocan
# Digium TE134: PCI single-port T1/E1/J1 with hardware echocan
wcte13xp
# Digium T100P: PCI single-port T1

View File

@@ -4,7 +4,7 @@
# This file is parsed by the DAHDI Configurator, dahdi_cfg
#
# Span Configuration
# ^^^^^^^^^^^^^^^^^^
# ++++++++++++++++++
# First come the span definitions, in the format
#
# span=<span num>,<timing source>,<line build out (LBO)>,<framing>,<coding>[,yellow]
@@ -69,7 +69,7 @@
#span=3,0,0,ccs,hdb3,crc4
#
# Dynamic Spans
# ^^^^^^^^^^^^^
# +++++++++++++
# Next come the dynamic span definitions, in the form:
#
# dynamic=<driver>,<address>,<numchans>,<timing>
@@ -87,7 +87,7 @@
# have the non-zero value.
#
# Channel Configuration
# ^^^^^^^^^^^^^^^^^^^^^
# +++++++++++++++++++++
# Next come the definitions for using the channels. The format is:
# <device>=<channel list>
#
@@ -111,17 +111,6 @@
# Channel(s) are signalled using FXO Groundstart protocol.
# fxoks::
# Channel(s) are signalled using FXO Koolstart protocol.
# sf::
# Channel(s) are signalled using in-band single freq tone.
# Syntax as follows:
#
# channel# => sf:<rxfreq>,<rxbw>,<rxflag>,<txfreq>,<txlevel>,<txflag>
#
# rxfreq is rx tone freq in Hz, rxbw is rx notch (and decode)
# bandwith in hz (typically 10.0), rxflag is either 'normal' or
# 'inverted', txfreq is tx tone freq in hz, txlevel is tx tone
# level in dbm, txflag is either 'normal' or 'inverted'. Set
# rxfreq or txfreq to 0.0 if that tone is not desired.
#
# unused::
# No signalling is performed, each channel in the list remains idle
@@ -204,7 +193,7 @@
#dacsrbs=1-24:48
#
# Tone Zone Data
# ^^^^^^^^^^^^^^
# ++++++++++++++
# Finally, you can preload some tone zones, to prevent them from getting
# overwritten by other users (if you allow non-root users to open /dev/dahdi/*
# interfaces anyway. Also this means they won't have to be loaded at runtime.
@@ -232,7 +221,7 @@ loadzone = us
defaultzone=us
#
# PCI Radio Interface
# ^^^^^^^^^^^^^^^^^^^
# +++++++++++++++++++
# (see http://www.zapatatelephony.org/app_rpt.html)
#
# The PCI Radio Interface card interfaces up to 4 two-way radios (either
@@ -298,7 +287,7 @@ defaultzone=us
#channels=1-4
#
# Overiding PCM encoding
# ^^^^^^^^^^^^^^^^^^^^^^
# ++++++++++++++++++++++
# Usually the channel driver sets the encoding of the PCM for the
# channel (mulaw / alaw. That is: g711u or g711a). However there are
# some cases where you would like to override that. 'mulaw' and 'alaw'
@@ -313,7 +302,7 @@ defaultzone=us
#deflaw=5
#
# Echo Cancellers
# ^^^^^^^^^^^^^^^
# +++++++++++++++
# DAHDI uses modular echo cancellers that are configured per channel. The echo
# cancellers are compiled and installed as part of the dahdi-linux package.
# You can specify in this file the echo canceller to be used for each

View File

@@ -89,18 +89,20 @@ static int build_tone(void *data, size_t size, struct tone_zone_sound *t, int *c
int firstnobang = -1;
int freq1, freq2, time;
int modulate = 0;
float db = 1.0;
float gain;
int used = 0;
dup = strdup(t->data);
s = strtok(dup, ",");
while(s && strlen(s)) {
/* Handle optional ! which signifies don't start here*/
if (s[0] == '!')
if (s[0] == '!') {
s++;
else if (firstnobang < 0) {
} else if (firstnobang < 0) {
PRINT_DEBUG("First no bang: %s\n", s);
firstnobang = *count;
}
if (sscanf(s, "%d+%d/%d", &freq1, &freq2, &time) == 3) {
/* f1+f2/time format */
PRINT_DEBUG("f1+f2/time format: %d, %d, %d\n", freq1, freq2, time);
@@ -118,6 +120,15 @@ static int build_tone(void *data, size_t size, struct tone_zone_sound *t, int *c
} else if (sscanf(s, "%d/%d", &freq1, &time) == 2) {
PRINT_DEBUG("f1/time format: %d, %d\n", freq1, time);
freq2 = 0;
} else if (sscanf(s, "%d@/%d", &freq1, &time) == 2) {
/* The "@" character has been added to enable an
* approximately -20db tone generation of any frequency This has been done
* primarily to generate the Australian congestion tone.
* Example: "425/375,0/375,425@/375,0/375"
*/
PRINT_DEBUG("f1 reduced amplitude/time format: %d, %d\n", freq1,time);
db = 0.3;
freq2 = 0;
} else if (sscanf(s, "%d", &freq1) == 1) {
PRINT_DEBUG("f1 format: %d\n", freq1);
firstnobang = *count;
@@ -137,7 +148,7 @@ static int build_tone(void *data, size_t size, struct tone_zone_sound *t, int *c
td = data;
/* Bring it down -8 dbm */
gain = pow(10.0, (LEVEL - 3.14) / 20.0) * 65536.0 / 2.0;
gain = db*(pow(10.0, (LEVEL - 3.14) / 20.0) * 65536.0 / 2.0);
td->fac1 = 2.0 * cos(2.0 * M_PI * (freq1 / 8000.0)) * 32768.0;
td->init_v2_1 = sin(-4.0 * M_PI * (freq1 / 8000.0)) * gain;

View File

@@ -54,7 +54,8 @@ OCT_DEFINES = \
-DcOCT6100_MAX_ECHO_CHANNELS=672 \
-DcOCT6100_MAX_MIXER_EVENTS=1344
ECHO_LOADER = echo_loader.o
ECHO_LOADER_SRC = echo_loader.c parse_span_specs.c
ECHO_LOADER = $(ECHO_LOADER_SRC:.c=.o)
endif
%.8: %
@@ -71,12 +72,33 @@ PERL_SCRIPTS = \
PERL_MANS = $(PERL_SCRIPTS:%=%.8)
XTALK_OBJS = xtalk/xtalk.o xtalk/xusb.o xtalk/xlist.o xtalk/debug.o
ASTRIBANK_OBJS = astribank_usb.o mpptalk.o $(XTALK_OBJS)
# List all our sources
XUSB_SRCS = xtalk/xusb.c xtalk/xlist.c xtalk/debug.c
XTALK_SRCS = xtalk/xtalk.c
MPPTALK_SRCS = mpptalk.c
ASTRIBANK_SRCS = astribank_usb.c
ABHEXLOAD_SRCS = astribank_hexload.c hexfile.c pic_loader.c
ABTOOL_SRCS = astribank_tool.c
ABALLOW_SRCS = astribank_allow.c astribank_license.c
ABHEXLOAD_OBJS = astribank_hexload.o hexfile.o pic_loader.o $(ECHO_LOADER) $(ASTRIBANK_OBJS) $(OCT_HERE_OBJS)
ABTOOL_OBJS = astribank_tool.o $(ASTRIBANK_OBJS)
ABALLOW_OBJS = astribank_allow.o astribank_license.o $(ASTRIBANK_OBJS)
SRCS = \
$(XUSB_SRCS) \
$(XTALK_SRCS) \
$(MPPTALK_SRCS) \
$(ASTRIBANK_SRCS) \
$(ABHEXLOAD_SRCS) \
$(ABTOOL_SRCS) \
$(ABALLOW_SRCS) \
$(ECHO_LOADER_SRC)
# Derive object files from source list
XUSB_OBJS = $(XUSB_SRCS:.c=.o)
XTALK_OBJS = $(XTALK_SRCS:.c=.o) $(XUSB_OBJS)
MPPTALK_OBJS = $(MPPTALK_SRCS:.c=.o) $(XTALK_OBJS)
ASTRIBANK_OBJS = $(ASTRIBANK_SRCS:.c=.o) $(MPPTALK_OBJS)
ABHEXLOAD_OBJS = $(ABHEXLOAD_SRCS:.c=.o) $(ASTRIBANK_OBJS) $(ECHO_LOADER) $(OCT_HERE_OBJS)
ABTOOL_OBJS = $(ABTOOL_SRCS:.c=.o) $(ASTRIBANK_OBJS)
ABALLOW_OBJS = $(ABALLOW_SRCS:.c=.o) $(ASTRIBANK_OBJS)
TARGETS = .perlcheck astribank_is_starting
PROG_INSTALL = astribank_is_starting
@@ -124,7 +146,7 @@ ifneq (,$(PERLLIBDIR))
done
endif
CFLAGS += -I. -Ixtalk
CFLAGS += -I. -Ixtalk -Wall -Werror
astribank_hexload: $(ABHEXLOAD_OBJS)
astribank_hexload: LIBS+=$(EXTRA_LIBS) $(USB_LIB)
@@ -170,8 +192,11 @@ clean:
$(RM) .depend .octasic.depend *.o xtalk/*.o $(OCT_HERE_OBJS) $(TARGETS)
.PHONY: depend
ifeq (1,$(PBX_USB))
depend: .depend
.depend: *.c *.h xtalk/*.c xtalk/*.h
@$(CC) $(CFLAGS) -MM *.c xtalk/*.c > $@ || rm -f $@
.depend: *.c *.h xtalk/*.c
@echo "Calculating dependencies"
@if ! $(CC) $(CFLAGS) $(OCT_CFLAGS) -MM $(SRCS) > $@; then $(RM) $@; exit 1; fi
include .depend
endif

View File

@@ -7,7 +7,7 @@ astribank_hexload \- Xorcom Astribank (xpp) firmware loader
.B astribank_hexload \-D \fIdevice-path\fR \-p [\fIoptions\fR] \fIhexfile1 .. hexfile4\fR
.B astribank_hexload \-D \fIdevice-path\fR \-O [-A] [\fIoptions\fR] \fIimagefile\fR
.B astribank_hexload \-D \fIdevice-path\fR \-O [-A] [-S \fIspan-specs\fR] [\fIoptions\fR] \fIimagefile\fR
.B astribank_hexload \-D \fIdevice-path\fR \-o [\fIoptions\fR]
@@ -29,7 +29,7 @@ It can be used to load either an FPGA firmware or a PIC
firmware. It is normally run by the script xpp_fxloader.
.SH OPTIONS
.B \-D
.B \-D
.I device-path
.RS
Required. The device to read from/write to. This is
@@ -95,13 +95,38 @@ use for BRI and E1. If not set, the default mu-Law (G.711u), which is
what you'd normally use for FXS, FXO and T1.
.RE
.B \-S \fIspan-specs\fR
.RS
This option should only be used when loading Octasic echo canceller firmware
and only if the first Astribank module is PRI.
Its goal is to allow specifying different \fIline-mode\fR (E1/T1/J1) in different
ports of the PRI module. \fBastribank_hexload\fR use the \fIspan-specs\fR argument
to select aLaw/uLaw for each of the PRI ports in the module.
The \fIspan-specs\fR is a list of items separated by whitespace or commas.
Each item is composed of a port selector, colon and a \fIline-mode\fR specifier.
This syntax follows the syntax of specifiers in \fB/etc/dahdi/span-types.conf\fR.
Examples:
.RS
3:E1 \- The 3'rd port is E1.
*:T1 \- Any unspecified port is T1 (wildcard match).
1:T1,2:T1,*:E1 \- First and second ports are T1, the rest are E1.
.RE
If the \fB\-S\fR is not given, the PRI default is determined by the existance of the \fB\-A-fR option.
.RE
.SH SEE ALSO
fxload(8), lsusb(8), astribank_tool(8)
.SH AUTHOR
This manual page was written by Tzafrir Cohen <tzafrir.cohen@xorcom.com> .
Permission is granted to copy, distribute and/or modify this document under
the terms of the GNU General Public License, Version 2 any
the terms of the GNU General Public License, Version 2 any
later version published by the Free Software Foundation.
On Debian systems, the complete text of the GNU General Public

View File

@@ -39,6 +39,7 @@
#define DBG_MASK 0x80
#define MAX_HEX_LINES 64000
#define HAVE_OCTASIC 1
#define DEF_SPAN_SPEC_FORMAT "*:%c1" /* %c: 'E' or 'T' */
static char *progname;
@@ -50,6 +51,7 @@ static void usage()
#if HAVE_OCTASIC
fprintf(stderr, "\t\t[-O] # Load Octasic firmware\n");
fprintf(stderr, "\t\t[-o] # Show Octasic version\n");
fprintf(stderr, "\t\t[-S <pri-spec>] # Set PRI type specification string\n");
#endif
fprintf(stderr, "\t\t[-F] # Load FPGA firmware\n");
fprintf(stderr, "\t\t[-p] # Load PIC firmware\n");
@@ -164,11 +166,13 @@ int main(int argc, char *argv[])
int opt_ecver = 0;
#if HAVE_OCTASIC
int opt_alaw = 0;
const char *span_spec = NULL;
char def_span_spec[sizeof(DEF_SPAN_SPEC_FORMAT)];
#endif
int opt_dest = 0;
int opt_sum = 0;
enum dev_dest dest = DEST_NONE;
const char options[] = "vd:D:EFOopA";
const char options[] = "vd:D:EFOopAS:";
int iface_num;
int ret;
@@ -210,6 +214,9 @@ int main(int argc, char *argv[])
case 'A':
opt_alaw = 1;
break;
case 'S':
span_spec = optarg;
break;
#endif
case 'p':
opt_pic = 1;
@@ -247,6 +254,13 @@ int main(int argc, char *argv[])
ERR("Missing device path.\n");
usage();
}
# ifdef HAVE_OCTASIC
if (!span_spec) {
snprintf(def_span_spec, sizeof(def_span_spec),
DEF_SPAN_SPEC_FORMAT, opt_alaw? 'E' : 'T');
span_spec = def_span_spec;
}
#endif
if(opt_dest) {
/*
* MPP Interface
@@ -290,7 +304,7 @@ int main(int argc, char *argv[])
}
#if HAVE_OCTASIC
} else if (opt_echo) {
if((ret = load_echo(astribank, argv[optind], opt_alaw)) < 0) {
if((ret = load_echo(astribank, argv[optind], opt_alaw, span_spec)) < 0) {
ERR("%s: Loading ECHO's failed\n", devpath);
return 1;
}

View File

@@ -16,6 +16,8 @@ PATH="$dir:/usr/sbin:/sbin:/usr/bin:/bin"
set -e
LOCK="/var/lock/twinstar_startup"
[ -r /etc/dahdi/init.conf ] && . /etc/dahdi/init.conf
# For lab testing
@@ -32,17 +34,38 @@ if [ "$XPP_HOTPLUG_DAHDI" != yes ]; then
fi
export XPPORDER_CONF="$dahdi_conf/xpp_order"
if [ ! -r "$XPPORDER_CONF" ]; then
(
echo "Skip($ACTION): No '$XPPORDER_CONF'"
echo "Removing uneeded startup semaphore"
astribank_is_starting -v -r 2>&1
) 2>&1 | $LOGGER
exit 0
fi
export DAHDI_CFG_CMD="dahdi_cfg -c $dahdi_conf/system.conf"
export CALLED_FROM_ATRIBANK_HOOK=yes
can_full_async() {
# Can we work aynchronously:
# - Need modern Asterisk that accept hotplug DAHDI devices.
# - Need DAHDI with "auto_assign_spans" == 0
if [ "$ASTERISK_SUPPORTS_DAHDI_HOTPLUG" = yes ]; then
aas_param='/sys/module/dahdi/parameters/auto_assign_spans'
aas=`cat "$aas_param" 2>/dev/null`
if [ "$aas" = 0 ]; then
return 0
else
$LOGGER "No async operation ($aas_param != 0)"
fi
else
$LOGGER "No async operation (ASTERISK_SUPPORTS_DAHDI_HOTPLUG!=yes)"
fi
return 1
}
check_xpporder_conf() {
if [ ! -r "$XPPORDER_CONF" ]; then
(
echo "Skip($ACTION): No '$XPPORDER_CONF'"
echo "Removing uneeded startup semaphore"
astribank_is_starting -v -r 2>&1
) 2>&1 | $LOGGER
exit 0
fi
}
clean_lines() {
sed -e 's/#.*//' -e 'y/\t/ /' -e 's/^ *//' -e 's/ *$//' -e '$s/$/\n/' "$XPPORDER_CONF"
}
@@ -64,10 +87,6 @@ matched_devices() {
done
}
NUM_WANTED=`clean_lines | sed '/^$/d' | wc -l`
NUM_GOOD=`matched_devices | wc -l`
LOCK="/var/lock/twinstar_startup"
# Wait until udev finished processing our requests
# so we know the device files were actually created
# before trying dahdi_cfg et-al.
@@ -77,10 +96,10 @@ wait_for_udev() {
echo "Waiting for udev to settle down..."
if [ -x /sbin/udevsettle ]; then
# Old system, stand-alone udevsettle command
time /sbin/udevsettle --timeout="$UDEV_SETTLE_MAX_TIME"
/sbin/udevsettle --timeout="$UDEV_SETTLE_MAX_TIME"
elif [ -x /sbin/udevadm ]; then
# Assume modern system, udevadm has settle parameter
if ! time /sbin/udevadm settle --timeout="$UDEV_SETTLE_MAX_TIME"
if ! /sbin/udevadm settle --timeout="$UDEV_SETTLE_MAX_TIME"
then
echo "udevadm failed ($?)."
echo "Fallback to sleep $UDEV_SETTLE_MAX_TIME seconds."
@@ -110,13 +129,9 @@ start_dahdi() {
rm -f "$LOCK"
}
#echo "$0: $ACTION($XBUS_NAME)" | $LOGGER
case "$ACTION" in
add)
;;
remove)
;;
online)
old_synchronous_start() {
NUM_GOOD=`matched_devices | wc -l`
NUM_WANTED=`clean_lines | sed '/^$/d' | wc -l`
echo "$ACTION($XBUS_NAME): $NUM_GOOD/$NUM_WANTED from $XPPORDER_CONF" | $LOGGER
if [ "$NUM_GOOD" -eq "$NUM_WANTED" ]; then
(
@@ -142,8 +157,11 @@ online)
fi
) < /dev/null 2>&1 | $LOGGER &
fi
;;
offline)
}
old_synchronous_stop() {
NUM_GOOD=`matched_devices | wc -l`
NUM_WANTED=`clean_lines | sed '/^$/d' | wc -l`
echo "$ACTION($XBUS_NAME): $NUM_GOOD/$NUM_WANTED from $XPPORDER_CONF" | $LOGGER
if [ "$NUM_GOOD" -eq 0 ]; then
echo "All Astribanks offline" | $LOGGER
@@ -152,6 +170,59 @@ offline)
fi
rm -f "$LOCK"
fi
}
ab_list() {
find /sys/devices -name idVendor 2>/dev/null | \
xargs grep -H 'e4e4' 2>/dev/null | \
sed -e 's/idVendor.*/idProduct/' | xargs grep -H '11[3456]' | \
sed 's,/[^/]*$,,' || :
}
tws_watchdog_enable() {
devdir="/sys$DEVPATH"
label=`cat "$devdir/label"`
connector=`cat "$devdir/connector"`
xbus=`echo "$devdir" | sed 's,.*/,,'`
prefix="${xbus}: [${label}] @${connector}"
TWS_NOAUTOJUMPFILE="$TWS_DIR/twinstar_no_autojump"
if [ -e "$TWS_NOAUTOJUMPFILE" ]; then
$LOGGER "$prefix: ignore wd (found $TWS_NOAUTOJUMPFILE)"
else
# Re-arm Astribank watchdog
transportdir="$devdir/transport"
busnum=`cat "$transportdir/busnum" 2>/dev/null || :`
devnum=`cat "$transportdir/devnum" 2>/dev/null || :`
devaddr=`printf "%03d/%03d" "$busnum" "$devnum"`
$LOGGER "$prefix: enabling twinstar watchdog"
astribank_tool -D "$devaddr" -w 1 2>&1 | $LOGGER
fi
}
#echo "$0: $ACTION($XBUS_NAME)" | $LOGGER
case "$ACTION" in
add)
;;
remove)
ab=`ab_list | wc -l`
if [ "$ab" -eq 0 ]; then
$LOGGER "$prefix: No more Astribanks -- remove astribank_is_starting semaphore"
astribank_is_starting -v -r 2>&1 | $LOGGER
fi
;;
online)
if can_full_async; then
tws_watchdog_enable
else
old_synchronous_start
fi
;;
offline)
if can_full_async; then
: # Nothing to do
else
old_synchronous_stop
fi
;;
*)
echo "$0: Unknown ACTION='$ACTION'" | $LOGGER

View File

@@ -125,6 +125,8 @@ static int absem_detected(void)
if((absem = absem_get(0)) < 0) {
if(debug)
fprintf(stderr, "%s: absem does not exist\n", progname);
if(verbose)
printf("No Astribanks are initializing\n");
return absem;
}
if(debug)

View File

@@ -11,17 +11,30 @@ use strict;
use File::Basename;
BEGIN { my $dir = dirname($0); unshift(@INC, "$dir", "$dir/perl_modules"); }
use Getopt::Std;
use Getopt::Long;
use Dahdi;
use Dahdi::Xpp;
use Dahdi::Config::Gen;
use Dahdi::Config::Params;
Getopt::Long::Configure ("bundling");
my $version = '1'; # Functionality version (integer)
my $revision = '$Revision$';
my %opts;
sub usage {
warn "Usage: $0 [options] <generators>\n";
warn " Options:\n";
warn " --line-mode=<E1|T1|J1> - Also generate span-types.conf with default line mode\n";
warn " -F|--freepbx - Modify configuration for Freepbx (skip FXS channels)\n";
warn " -v|--verbose - Be versbose, show generated files\n";
warn " -V|--version - Show version and exit\n";
warn " -h|--help - Show this message\n";
exit 1;
}
sub set_defaults {
my $default_file = $ENV{GENCONF_PARAMETERS} || "/etc/dahdi/genconf_parameters";
my $params = Dahdi::Config::Params->new($default_file);
@@ -44,20 +57,33 @@ sub spans_prep($@) {
}
}
sub munge_spantypes {
if ($opts{'line-mode'}) {
print "Will generate span-types.conf with line-mode=$opts{'line-mode'}\n"
if $opts{'verbose'};
return "spantypes=line-mode=$opts{'line-mode'}";
} else {
print "Will generate span-types.conf\n" if $opts{'verbose'};
return "spantypes";
}
}
sub generator_list($) {
my $gconfig = shift || die;
my @genlist;
if (@ARGV) {
for my $gen (@ARGV) {
$gen = munge_spantypes() if $gen eq 'spantypes';
push @genlist, $gen;
}
} else {
# No files given. Use the defaults.
@genlist = ('spantypes', 'assignedspans', 'system', 'chandahdi');
@genlist = ('assignedspans', 'system', 'chandahdi');
if($gconfig->{'pri_connection_type'} eq 'R2') {
push @genlist, 'unicall';
}
push(@genlist, munge_spantypes()) if $opts{'line-mode'};
}
return @genlist;
}
@@ -93,7 +119,16 @@ sub generate_files($@) {
}
}
getopts('vVF', \%opts) || die "$0: Bad option\n";
GetOptions(\%opts,
"line-mode=s",
"h|help",
"v|verbose",
"V|version",
"F|freepbx",
) or usage;
usage if $opts{h};
if($opts{'V'}) {
my $revstr = $revision;
$revstr =~ s/[^$]*\$[^:]+:\s*//;
@@ -141,7 +176,9 @@ as specified by the generator arguments. Each generator is a perl class
in Dahdi::Config::Gen namespace. The generator names on the command line
are the class names in lowercase.
The following generators are currently implemented: system, chandahdi, unicall, users.
The following generators are currently implemented: system, modules, spantypes,
assignedspans, chandahdi, unicall, users.
For further documentation on each, please user perldoc on the relevant
class. E.g: C<perldoc Dahdi::Config::Gen::Chandahdi>
@@ -154,19 +191,27 @@ a comma separated list of options to the generator name. E.g:
=over 4
=item -V
=item -V --version
Version -- print version string and exit.
=item -v
=item -v --verbose
Verbose -- sets the C<'verbose'> option for all generators.
=item -F
=item -F --freepbx
Freepbx -- sets the C<'freepbx'> option for all generators.
Currently, chandahdi is affected.
=item --line-mode=I<mode>
I<mode> may be E1, J1 or T1.
Enables the generator B<spantypes> and the option B<line-mode> to it.
(Equivalent to the option C<--line-mode> to C<dahdi_span_types>). This
will generate a C<span-types.conf> file with a single wildcard line
setting the line mode to I<mode>.
=back

View File

@@ -35,12 +35,17 @@ my %opts;
getopts('vRs:', \%opts) || usage;
my $dahdi_autoreg = check_param('/sys/module/xpp/parameters/dahdi_autoreg') eq 'Y';
my $auto_assign_spans = check_param('/sys/module/dahdi/parameters/auto_assign_spans') eq '1';
my $auto_assign_spans = check_param('/sys/module/dahdi/parameters/auto_assign_spans') ne '0';
my $assigned_spans_config = $ENV{'ASSIGNED_SPANS_CONF_FILE'} || '/etc/dahdi/assigned-spans.conf';
my $span_types_config = $ENV{'SPAN_TYPES_CONF_FILE'} || '/etc/dahdi/span-types.conf';
my $have_assigned_spans_config = -f $assigned_spans_config || 0;
my $have_span_types_config = -f $span_types_config || 0;
# Spans will be auto-assigned by default if either:
# - Driver $auto_assign_spans them or
# - Udev script see that we $have_span_types_config and it "add" them
my $default_auto_assign = $auto_assign_spans || $have_assigned_spans_config;
my $sorter;
my $sort_order = $opts{'s'};
if(defined $sort_order) {
@@ -69,8 +74,6 @@ if(defined($on)) { # Translate to booleans
$should_output = 0 unless $verbose;
}
undef $on if $dahdi_autoreg and not $opts{'R'};
sub state2str($) {
return (shift)?"on":"off";
}
@@ -79,35 +82,41 @@ sub myprintf {
printf @_ if $should_output;
}
my @spans = Dahdi::spans;
foreach my $xbus (Dahdi::Xpp::xbuses($sorter)) {
myprintf "%-10s\t%3s-%s\t%s\n",
$xbus->name, $xbus->xpporder, $xbus->label, $xbus->connector;
next unless $xbus->status eq 'CONNECTED';
foreach my $xpd (Dahdi::Xpp::Xpd::telephony_devs($xbus->xpds())) {
my $prev = $xpd->dahdi_registration($on);
if(!defined($prev)) { # Failure
printf "%s: Failed %s\n", $xpd->fqn, $!;
next;
}
myprintf "\t%-10s: ", $xpd->fqn;
if(!defined($on)) { # Query only
my ($span) = grep { $_->name eq $xpd->fqn } @spans;
my $spanstr = ($span) ? ("Span " . $span->num) : "";
myprintf "%s %s\n", state2str($prev), $spanstr ;
next;
}
myprintf "%3s ==> %3s\n", state2str($prev), state2str($on);
my $prev = $xbus->dahdi_registration($on);
if(!defined($prev)) { # Failure
printf STDERR "%s: Failed %s\n", $xbus->name, $!;
next;
}
if (defined($on) && $on && ! $have_assigned_spans_config && ! $auto_assign_spans) {
# Emulate /etc/dahdi/assigned-spans.conf:
# - We iterate over $xbus according to /etc/dahdi/xpp_order
# - We "auto" assign all spans of current $xbus
my $devpath = sprintf "/sys/bus/dahdi_devices/devices/astribanks:xbus-%02d", $xbus->num;
my @cmd = ('dahdi_span_assignments', 'auto', $devpath);
system @cmd;
warn "Failed '@cmd' (status=$?)\n" if $?;
my $reg_str;
if (defined $on) {
$reg_str = ($on) ? "registering" : "unregistering";
} else {
$reg_str = ($prev) ? "registered" : "unregistered";
}
myprintf "%-10s\t%3s-%s\t%s (%s)\n",
$xbus->name, $xbus->xpporder, $xbus->label, $xbus->connector,
$reg_str;
next unless $xbus->status eq 'CONNECTED';
# Only assign if no default assignment, or forced by '-R' option
if (defined($on) && $on) {
if ($opts{'R'} || ! $default_auto_assign) {
# Emulate /etc/dahdi/assigned-spans.conf:
# - We iterate over $xbus according to /etc/dahdi/xpp_order
# - We "auto" assign all spans of current $xbus
my $devpath = sprintf "/sys/bus/dahdi_devices/devices/astribanks:xbus-%02d", $xbus->num;
my @cmd = ('dahdi_span_assignments', 'auto', $devpath);
system @cmd;
warn "Failed '@cmd' (status=$?)\n" if $?;
}
# wait for UDEV to do its stuff
system "dahdi_waitfor_span_assignments assigned";
}
foreach my $xpd (Dahdi::Xpp::Xpd::telephony_devs($xbus->xpds())) {
my $spanno = $xpd->xpd_getattr('span');
myprintf "\t%-10s: ", $xpd->fqn;
my $spanstr = ($spanno) ? ("Span " . $spanno) : "unassigned";
myprintf "%s\n", $spanstr ;
}
}
myprintf "# Sorted: $sort_order\n" if defined $sort_order;

View File

@@ -31,6 +31,7 @@
#include "echo_loader.h"
#include "debug.h"
#include <oct6100api/oct6100_api.h>
#include "parse_span_specs.h"
#define DBG_MASK 0x03
#define TIMEOUT 1000
@@ -362,7 +363,7 @@ int load_file(char *filename, unsigned char **ppBuf, UINT32 *pLen)
DBG("Loading %s file...\n", filename);
pFile = fopen(filename, "rb");
if (pFile == NULL) {
ERR("fopen\n");
ERR("fopen: %s\n", strerror(errno));
return -ENODEV;
}
@@ -378,7 +379,11 @@ int load_file(char *filename, unsigned char **ppBuf, UINT32 *pLen)
} else {
DBG("allocated mem for pbyFileData\n");
}
fread(pbyFileData, 1, *pLen, pFile);
if (fread(pbyFileData, 1, *pLen, pFile) != *pLen) {
fclose(pFile);
ERR("fread: %s\n", strerror(errno));
return -ENODEV;
}
fclose(pFile);
DBG("Successful loading %s file into memory "
"(size = %d, DUMP: first = %02X %02X, last = %02X %02X)\n",
@@ -556,7 +561,7 @@ inline int get_ver(struct astribank_device *astribank)
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
UINT32 init_octasic(char *filename, struct astribank_device *astribank, int is_alaw)
UINT32 init_octasic(char *filename, struct astribank_device *astribank, struct span_specs *span_specs)
{
int cpld_ver;
struct echo_mod *echo_mod;
@@ -576,6 +581,8 @@ UINT32 init_octasic(char *filename, struct astribank_device *astribank, int is_a
/* Channel resources.*/
tOCT6100_CHANNEL_OPEN ChannelOpen;
UINT32 ulChanHndl;
enum tdm_codec tdm_codec;
int spanno;
if (test_send(astribank) < 0)
return cOCT6100_ERR_FATAL;
@@ -725,7 +732,17 @@ UINT32 init_octasic(char *filename, struct astribank_device *astribank, int is_a
/* Set the channel to work at the echo cancellation mode.*/
ChannelOpen.ulEchoOperationMode = cOCT6100_ECHO_OP_MODE_NORMAL;
pcmLaw = (is_alaw ? cOCT6100_PCM_A_LAW: cOCT6100_PCM_U_LAW);
spanno = nChan % 4;
assert(spanno >= 0 && spanno < MAX_SPANNO);
tdm_codec = span_specs->span_is_alaw[spanno];
if (tdm_codec == TDM_CODEC_UNKNOWN) {
AB_ERR(astribank, "Calculated bad alaw/ulaw on channel %d\n", nChan);
return cOCT6100_ERR_FATAL;
}
if (nChan < 4)
AB_INFO(astribank, "ECHO PRI port %d = %s\n", spanno+1, (tdm_codec == TDM_CODEC_ALAW) ? "alaw" : "ulaw");
pcmLaw = ((tdm_codec == TDM_CODEC_ALAW) ? cOCT6100_PCM_A_LAW: cOCT6100_PCM_U_LAW);
/* Configure the TDM interface.*/
ChannelOpen.TdmConfig.ulRinPcmLaw = pcmLaw;
@@ -821,15 +838,22 @@ UINT32 init_octasic(char *filename, struct astribank_device *astribank, int is_a
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
int load_echo(struct astribank_device *astribank, char *filename, int is_alaw)
int load_echo(struct astribank_device *astribank, char *filename, int default_is_alaw, const char *span_spec)
{
int ret;
UINT32 octasic_status;
struct span_specs *span_specs;
AB_INFO(astribank, "Loading ECHOCAN Firmware: %s (%s)\n",
filename, (is_alaw) ? "alaw" : "ulaw");
span_specs = parse_span_specifications(span_spec, default_is_alaw);
if (!span_specs) {
AB_ERR(astribank, "ECHO parsing span specs failed\n");
return -EFAULT;
}
AB_INFO(astribank, "Loading ECHOCAN Firmware: %s (default %s)\n",
filename, (default_is_alaw) ? "alaw" : "ulaw");
usb_buffer_init(astribank, &usb_buffer);
octasic_status = init_octasic(filename, astribank, is_alaw);
octasic_status = init_octasic(filename, astribank, span_specs);
free_span_specifications(span_specs);
if (octasic_status != cOCT6100_ERR_OK) {
AB_ERR(astribank, "ECHO %s burning failed (%08X)\n",
filename, octasic_status);

View File

@@ -26,7 +26,7 @@
#include "astribank_usb.h"
int spi_send(struct astribank_device *astribank, uint16_t addr, uint16_t data, int recv_answer, int ver);
int load_echo(struct astribank_device *astribank, char *filename, int is_alaw);
int load_echo(struct astribank_device *astribank, char *filename, int is_alaw, const char *span_spec);
int echo_ver(struct astribank_device *astribank);
#endif /* ECHO_LOADER_H */

152
xpp/parse_span_specs.c Normal file
View File

@@ -0,0 +1,152 @@
/*
* Written by Oron Peled <oron@actcom.co.il>
* Copyright (C) 2014, Xorcom
*
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <limits.h>
#include <regex.h>
#include <fnmatch.h>
#include <sys/time.h>
#include "parse_span_specs.h"
void free_span_specifications(struct span_specs *span_specs)
{
if (span_specs) {
if (span_specs->buf)
free(span_specs->buf);
free(span_specs);
}
}
static enum tdm_codec is_alaw_span_type(const char *span_type)
{
assert(span_type);
if (strcmp(span_type, "E1") == 0)
return TDM_CODEC_ALAW;
else if (strcmp(span_type, "T1") == 0)
return TDM_CODEC_ULAW;
return TDM_CODEC_UNKNOWN;
}
struct span_specs *parse_span_specifications(const char *spec_string, int default_is_alaw)
{
struct span_specs *span_specs;
char *p;
int spanno;
int i;
if (!spec_string)
return NULL;
/* Allocate and Initialize */
span_specs = calloc(sizeof(char *), MAX_SPANNO);
if (!span_specs)
goto err;
for (spanno = 0; spanno < MAX_SPANNO; spanno++)
span_specs->span_is_alaw[spanno] = TDM_CODEC_UNKNOWN;
span_specs->buf = strdup(spec_string);
if (!span_specs->buf)
goto err;
for (i = 0;; i++) {
char *curr_item;
char *tokenize_key;
char *key;
char *value;
enum tdm_codec is_alaw;
int matched;
/* Split to items */
p = (i == 0) ? span_specs->buf : NULL;
p = strtok_r(p, " \t,", &curr_item);
if (!p)
break;
/* Split to <span>:<type> */
key = strtok_r(p, ":", &tokenize_key);
if (!key) {
fprintf(stderr,
"Missing ':' (item #%d inside '%s')\n",
i+1, spec_string);
goto err;
}
value = strtok_r(NULL, ":", &tokenize_key);
if (!value) {
fprintf(stderr,
"Missing value after ':' (item #%d inside '%s')\n",
i+1, spec_string);
goto err;
}
/* Match span specification and set alaw/ulaw */
is_alaw = is_alaw_span_type(value);
if (is_alaw == TDM_CODEC_UNKNOWN) {
fprintf(stderr,
"Illegal span type '%s' (item #%d inside '%s')\n",
value, i+1, spec_string);
goto err;
}
matched = 0;
for (spanno = 0; spanno < MAX_SPANNO; spanno++) {
char tmpbuf[BUFSIZ];
snprintf(tmpbuf, sizeof(tmpbuf), "%d", spanno + 1);
if (fnmatch(p, tmpbuf, 0) == 0) {
matched++;
span_specs->span_is_alaw[spanno] = is_alaw;
}
}
if (!matched) {
fprintf(stderr,
"Span specification '%s' does not match any span (item #%d inside '%s')\n",
key, i+1, spec_string);
goto err;
}
}
/* Set defaults */
for (spanno = 0; spanno < MAX_SPANNO; spanno++) {
if (span_specs->span_is_alaw[spanno] == TDM_CODEC_UNKNOWN) {
span_specs->span_is_alaw[spanno] = default_is_alaw;
}
}
return span_specs;
err:
free_span_specifications(span_specs);
return NULL;
}
void print_span_specifications(struct span_specs *span_specs, FILE *output)
{
int spanno;
if (!span_specs)
return;
for (spanno = 0; spanno < MAX_SPANNO; spanno++) {
enum tdm_codec is_alaw;
is_alaw = span_specs->span_is_alaw[spanno];
fprintf(output, "%d %s\n",
spanno+1, (is_alaw == TDM_CODEC_ALAW) ? "alaw" : "ulaw");
}
}

43
xpp/parse_span_specs.h Normal file
View File

@@ -0,0 +1,43 @@
#ifndef PARSE_SPAN_SPECS_H
#define PARSE_SPAN_SPECS_H
/*
* Written by Oron Peled <oron@actcom.co.il>
* Copyright (C) 2014, Xorcom
*
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
#define MAX_SPANNO 4 /* E1/T1 spans -- always in first unit. 1-based */
enum tdm_codec {
TDM_CODEC_UNKNOWN,
TDM_CODEC_ULAW,
TDM_CODEC_ALAW,
};
struct span_specs {
char *buf;
enum tdm_codec span_is_alaw[MAX_SPANNO];
};
struct span_specs *parse_span_specifications(const char *spec_string, int default_is_alaw);
void free_span_specifications(struct span_specs *span_specs);
void print_span_specifications(struct span_specs *span_specs, FILE *output);
#endif /* PARSE_SPAN_SPECS_H */

View File

@@ -29,13 +29,22 @@ sub generate($$$) {
system "which dahdi_span_types > /dev/null 2>&1";
return if $?;
warn "Empty configuration -- no spans\n" unless @spans;
my $line_mode = $genopts->{'line-mode'};
my $cmd;
if (defined $line_mode) {
$line_mode =~ /^[ETJ]1$/ or die "Bad line-mode='$line_mode'\n";
$cmd = "dahdi_span_types --line-mode=$line_mode dumpconfig > $file";
printf("Generating $file (with default line-mode %s)\n", $line_mode)
if $genopts->{verbose};
} else {
$cmd = "dahdi_span_types dumpconfig > $file";
printf("Generating $file (no --line-mode override)\n")
if $genopts->{verbose};
}
rename "$file", "$file.bak"
or $! == 2 # ENOENT (No dependency on Errno.pm)
or die "Failed to backup old config: $!\n";
#$gconfig->dump;
print "Generating $file\n" if $genopts->{verbose};
my $cmd = "dahdi_span_types dumpconfig > $file";
system $cmd;
die "Command failed (status=$?): '$cmd'" if $?;
}
@@ -61,3 +70,17 @@ Generate the F</etc/dahdi/span-types.conf>.
This is the configuration for dahdi_span_types.
Its location may be overriden via the environment variable F<SPAN_TYPES_CONF_FILE>.
You would normally run:
dahdi_genconf --line-mode=<line_mode>
which is a short for:
dahdi_genconf spantypes=line-mode=<line_mode>
This is done by running:
dahdi_span_types dumpconfig --line-mode=line_mode>
where I<line_mode> is the module parameter, and defaults to B<E1> if not
given (running C<dahdi_genconf spantypes>).

View File

@@ -94,8 +94,8 @@ my %pci_ids = (
'd161:8001' => { DRIVER => 'wcte12xp', DESCRIPTION => 'Wildcard TE122' },
# from wcte13xp
'd161:800a' => { DRIVER => 'wcte13xp', DESCRIPTION => 'Wildcard TE133' },
'd161:800b' => { DRIVER => 'wcte13xp', DESCRIPTION => 'Wildcard TE134' },
'd161:800a' => { DRIVER => 'wcte13xp', DESCRIPTION => 'Wildcard TE131/TE133' },
'd161:800b' => { DRIVER => 'wcte13xp', DESCRIPTION => 'Wildcard TE132/TE134' },
# from wcaxx
'd161:800c' => { DRIVER => 'wcaxx', DESCRIPTION => 'Digium A8A' },
@@ -105,6 +105,7 @@ my %pci_ids = (
# from wcte435/235
'd161:800e' => { DRIVER => 'wcte43x', DESCRIPTION => 'Wildcard TE435/235' },
'd161:8013' => { DRIVER => 'wcte43x', DESCRIPTION => 'Wildcard TE436/236' },
# from wcb4xxp
'd161:b410' => { DRIVER => 'wcb4xxp', DESCRIPTION => 'Digium Wildcard B410P' },

View File

@@ -144,9 +144,9 @@ my @pri_strings = (
'Wildcard TE120P', # wcte12xp
'Wildcard TE121', # wcte12xp
'Wildcard TE122', # wcte12xp
'Wildcard TE133', # wcte13xp
'Wildcard TE134', # wcte13xp
'T[248]XXP \(PCI\) Card ', # wct4xxp
'Wildcard TE131/TE133', # wcte13xp
'Wildcard TE132/TE134', # wcte13xp
'T[248]XXP \(PCI\) Card ', # wct4xxp
'WCTE43X \(PCI\) Card ', # wcte43xp
'WCTE23X \(PCI\) Card ', # wcte43xp
'R[24]T1 \(PCI\) Card', # rxt1

View File

@@ -110,9 +110,7 @@ sub read_xpdnames($) {
sub read_num($) {
my $self = shift or die;
my $xbus_dir = $self->sysfs_dir;
my @xpdnames = read_xpdnames($xbus_dir);
my $first = shift @xpdnames or die "No XPDs for '$xbus_dir'\n";
$first =~ /^(\d+\d+).*/;
$xbus_dir =~ /.*-(\d\d)$/;
return $1;
}
@@ -148,6 +146,40 @@ sub new($$) {
return $self;
}
sub dahdi_registration($$) {
my $xbus = shift;
my $on = shift;
my $result;
my $file = sprintf("%s/dahdi_registration", $xbus->sysfs_dir);
# Handle old drivers without dahdi_registration xbus attribute
if (! -f $file) {
warn "Old xpp driver without dahdi_registration support. Emulating it using xpd/span support\n";
my @xpds = sort { $a->id <=> $b->id } $xbus->xpds();
my $prev;
foreach my $xpd (@xpds) {
$prev = $xpd->dahdi_registration($on);
}
return $prev;
}
# First query
open(F, "$file") or die "Failed to open $file for reading: $!";
$result = <F>;
chomp $result;
close F;
if(defined($on) and $on ne $result) { # Now change
open(F, ">$file") or die "Failed to open $file for writing: $!";
print F ($on)?"1":"0";
if(!close(F)) {
if($! == 17) { # EEXISTS
# good
} else {
undef $result;
}
}
}
return $result;
}
sub pretty_xpds($) {
my $xbus = shift;
my @xpds = sort { $a->id <=> $b->id } $xbus->xpds();

View File

@@ -41,18 +41,25 @@ ab_list() {
}
ab_serial_nums() {
ab_list | \
sed 's,$,/serial,' | \
xargs grep -H '' 2>/dev/null | \
sed 's,.*/serial:,,' | \
sed 's/^$/NO-SERIAL/' | \
sort -u
for i in `ab_list`; do
s=`cat "$i/serial" 2>/dev/null` || :
if [ "$s" = '' ]; then
echo "NO-SERIAL"
else
echo "$s"
fi
done | sort -u || :
}
detected_serial_nums() {
cat /sys/bus/astribanks/devices/*/transport/serial 2> /dev/null | \
sed 's/^$/NO-SERIAL/' | \
sort -u || :
for i in `ls -1d /sys/bus/astribanks/devices/*/transport 2>/dev/null`; do
s=`cat "$i/serial" 2>/dev/null` || :
if [ "$s" = '' ]; then
echo "NO-SERIAL"
else
echo "$s"
fi
done | sort -u || :
}
calc_union() {
@@ -72,6 +79,10 @@ waitfor_ab_initialization() {
fi
test "$oldab" != "$ab"
do
if [ "$ab" = '' ]; then
echo >&2 "Astribanks disappeared"
break
fi
oldab="$ab"
cat $ab
#echo -n 1>&2 "_"
@@ -83,17 +94,24 @@ if ! dahdi_hardware="`which dahdi_hardware 2>/dev/null`"; then
echo >&2 "$0: Missing dahdi_hardware"
exit 0
fi
if ! astribank_is_starting="`which astribank_is_starting 2>/dev/null`"; then
echo >&2 "$0: Missing astribank_is_starting"
exit 0
fi
# Just make sure
if [ "`$dahdi_hardware | grep xpp_usb`" != "" ]; then
astribank_is_starting -v -a
fi
if ! astribank_is_starting; then
# No Astribanks ever seen -- nothing to do
exit 0
fi
# Sanity check
for i in `ab_list`; do
s=`cat "$i/serial" 2>/dev/null` || :
if [ "$s" = '' ]; then
echo >&2 "WARNING! Astribank without serial number: $i"
fi
done
serial_nums=`ab_serial_nums`
# Loop until detected (hopefully) all astribanks and they are initialized
@@ -130,13 +148,16 @@ cat /sys/bus/astribanks/devices/*/waitfor_xpds 2> /dev/null || :
# Wait for device to stabilize and XPD's to finish initalizations
echo 1>&2 "Astribanks initializing spans"
if [ "$XPP_HOTPLUG_DAHDI" = yes ]; then
if [ "$CALLED_FROM_ATRIBANK_HOOK" = '' ]; then
if [ "$XPP_HOTPLUG_DAHDI" = yes -a "$CALLED_FROM_ATRIBANK_HOOK" = '' -a \
"$ASTERISK_SUPPORTS_DAHDI_HOTPLUG" != 'yes' ]; then
if [ -f /etc/dahdi/xpp_order ]; then
# Now we can wait until the hotplug run would remove the semaphore
echo -n 1>&2 "Other DAHDI initializations... "
astribank_is_starting -v -w 1>&2
else
echo 1>&2 "WARNING: No ASTERISK_SUPPORTS_DAHDI_HOTPLUG" \
" and no /etc/dahdi/xpp_order"
fi
else
# Non-hotplug -- Sequential initialization, remove semaphore
astribank_is_starting -v -r 1>&2
fi
# All Astribanks initialized -- remove semaphore
astribank_is_starting -v -r 1>&2

View File

@@ -68,6 +68,7 @@ FIRMWARE_DIR="${FIRMWARE_DIR:-/usr/share/dahdi}"
ASTRIBANK_HEXLOAD=${ASTRIBANK_HEXLOAD:-/usr/sbin/astribank_hexload}
ASTRIBANK_TOOL=${ASTRIBANK_TOOL:-/usr/sbin/astribank_tool}
XPP_CONFIG="${XPP_CONFIG:-/etc/dahdi/xpp.conf}"
SPAN_TYPES_CONFIG="${SPAN_TYPES_CONFIG:-/etc/dahdi/span-types.conf}"
XPP_UDEV_SLEEP_TIME="${XPP_UDEV_SLEEP_TIME:-15}"
USB_RECOV="${USB_RECOV:-USB_RECOV.hex}"
@@ -270,6 +271,15 @@ usb_firmware_all_devices() {
wait_renumeration $numdevs 'e4e4/11[3456]1/*' "usb_firmware_all_devices"
}
filter_span_types() {
l="$1"
sed < "$SPAN_TYPES_CONFIG" 2>/dev/null \
-e 's/#.*//' \
-e 's/[ \t]*$//' \
-e 's/^[ \t]*//' \
-e '/^$/d' | awk -vlabel="$l" '$1 == label { print $2 }' | tr -s ', \t\n' ','
}
load_fw_device() {
dev="$1"
fw="$2"
@@ -279,33 +289,62 @@ load_fw_device() {
FPGA_1161*.hex)
echo_file="$FIRMWARE_DIR/OCT6104E-256D.ima"
law=''
law_str='uLaw'
dev_short=`echo "$dev" | sed -e 's,.*/usb/*,,'`
abtool_output=`$ASTRIBANK_TOOL -D "$dev" -Q 2>&1`
ec_card_type=`echo "$abtool_output" | grep 'CARD 4' | sed -e 's/.*type=//' -e 's/\..*//'`
caps_num=`echo "$abtool_output" | grep 'ECHO ports' | sed -e 's/.*: *//'`
if [ "$ec_card_type" = '5' ]; then
debug "ECHO burning into $dev: $echo_file"
debug "ECHO($dev_short): Firmware $echo_file"
card_type=`echo "$abtool_output" | grep 'CARD 0' | sed -e 's/.*type=//' -e 's/\..*//'`
case "$card_type" in
3) law="-A";;
4)
pri_protocol=''
if [ -r "$XPP_CONFIG" ]; then
pri_protocol=`awk '/^pri_protocol/ {print $2}' $XPP_CONFIG`
dev_lsusb=`echo "$dev_short" | tr '/' ':'`
# Try modern configuration
if [ -r "$SPAN_TYPES_CONFIG" ]; then
# Try exact match by label
label=`lsusb -s "$dev_lsusb" -v 2>/dev/null | awk '$1 == "iSerial" && $2 == 3 { print $3 }'`
if [ "$label" != '' ]; then
label="usb:$label"
debug "ECHO($dev_short): Search span-types.conf for [$label]"
pri_spec=`filter_span_types "${label}"`
if [ "$pri_spec" != '' ]; then
debug "ECHO($dev_short): Found definitions for [$label] -- '$pri_spec'"
fi
else
debug "ECHO($dev_short): Device without a label"
fi
# Check wildcard match
pri_spec_wildcard=`filter_span_types '*'`
if [ "$pri_spec_wildcard" != '' ]; then
debug "ECHO($dev_short): Found definitions for wildcard -- $pri_spec_wildcard"
fi
pri_spec_params=""
if [ "$pri_spec$pri_spec_wildcard" != '' ]; then
pri_spec=`echo "$pri_spec_wildcard $pri_spec" | tr -s ' \t\n' ','`
pri_spec_params="-S $pri_spec"
debug "ECHO($dev_short): pri_spec_params='$pri_spec_params'"
fi
fi
# "E1" or empty (implied E1) means aLaw
if [ "$pri_protocol" != 'T1' ]; then
law='-A'
# Fallback to legacy xpp.conf
default_pri_protocol=''
law=''
if [ -r "$XPP_CONFIG" ]; then
default_pri_protocol=`awk '/^pri_protocol/ {print $2}' $XPP_CONFIG`
if [ "$default_pri_protocol" != '' ]; then
debug "ECHO($dev_short): Found legacy xpp.conf setting -- $default_pri_protocol"
# "E1" or empty (implied E1) means aLaw
if [ "$default_pri_protocol" != 'T1' ]; then
law='-A'
fi
fi
fi
;;
esac
if [ "$law" = '-A' ]; then
law_str="aLaw"
fi
caps_num=`echo "$abtool_output" | grep 'ECHO ports' | sed -e 's/.*: *//'`
debug "ECHO: 1st module is $law_str, $caps_num channels allowed."
debug "ECHO($dev_short): $caps_num channels allowed."
if [ "$caps_num" != '0' ]; then
run_astribank_hexload -D "$dev" -O $law "$echo_file"
run_astribank_hexload -D "$dev" -O $law $pri_spec_params "$echo_file"
else
echo "WARNING: ECHO burning was skipped (no capabilities)"
fi

View File

@@ -61,6 +61,23 @@ struct xusb {
static void xusb_init();
/*
* XTALK_OPTIONS:
* A white-space separated list of options, read from the environment
* variable of that name. Existing options:
*
* - "use-clear-halt" -- force USB "clear_halt" operation during
* device initialization (this is the default)
* - "no-use-clear-halt" -- force no USB "clear_halt" operation during
* device initialization
* - "no-lock" -- prevent using global sempahore to serialize libusb
* initialization. Previously done via "XUSB_NOLOCK"
* environment variable.
*/
int xtalk_parse_options(void);
int xtalk_option_use_clear_halt(void);
int xtalk_option_no_lock(void);
void xusb_init_spec(struct xusb_spec *spec, char *name,
uint16_t vendor_id, uint16_t product_id,
int nifaces, int iface, int nep, int ep_out, int ep_in)
@@ -257,13 +274,16 @@ int xusb_claim_interface(struct xusb *xusb)
xusb->iProduct,
xusb->iSerialNumber,
xusb->iInterface);
if (usb_clear_halt(xusb->handle, EP_OUT(xusb)) != 0) {
ERR("Clearing output endpoint: %s\n", usb_strerror());
return 0;
}
if (usb_clear_halt(xusb->handle, EP_IN(xusb)) != 0) {
ERR("Clearing input endpoint: %s\n", usb_strerror());
return 0;
if (xtalk_option_use_clear_halt()) {
DBG("Using clear_halt()\n");
if (usb_clear_halt(xusb->handle, EP_OUT(xusb)) != 0) {
ERR("Clearing output endpoint: %s\n", usb_strerror());
return 0;
}
if (usb_clear_halt(xusb->handle, EP_IN(xusb)) != 0) {
ERR("Clearing input endpoint: %s\n", usb_strerror());
return 0;
}
}
ret = xusb_flushread(xusb);
if (ret < 0) {
@@ -857,13 +877,67 @@ static int initizalized;
static void xusb_init()
{
if (!initizalized) {
if (!getenv("XUSB_NOLOCK"))
xtalk_parse_options();
if (!xtalk_option_no_lock())
xusb_lock_usb();
usb_init();
usb_find_busses();
usb_find_devices();
initizalized = 1;
if (!getenv("XUSB_NOLOCK"))
if (!xtalk_option_no_lock())
xusb_unlock_usb();
}
}
/* XTALK option handling */
static int use_clear_halt = 1;
static int libusb_no_lock = 0;
static int xtalk_one_option(const char *option_string)
{
if (strcmp(option_string, "use-clear-halt") == 0) {
use_clear_halt = 1;
return 0;
}
if (strcmp(option_string, "no-use-clear-halt") == 0) {
use_clear_halt = 0;
return 0;
}
if (strcmp(option_string, "no-lock") == 0) {
libusb_no_lock = 1;
return 0;
}
ERR("Unknown XTALK_OPTIONS content: '%s'\n", option_string);
return -EINVAL;
}
int xtalk_option_use_clear_halt(void)
{
return use_clear_halt;
}
int xtalk_option_no_lock(void)
{
return libusb_no_lock;
}
int xtalk_parse_options(void)
{
char *xtalk_options;
char *saveptr;
char *token;
int ret;
xtalk_options = getenv("XTALK_OPTIONS");
if (!xtalk_options)
return 0;
token = strtok_r(xtalk_options, " \t", &saveptr);
while (token) {
ret = xtalk_one_option(token);
if (ret < 0)
return ret;
token = strtok_r(NULL, " \t", &saveptr);
}
return 0;
}

View File

@@ -59,11 +59,18 @@ struct tone_zone builtin_zones[] =
.description = "Australia",
.ringcadence = { 400, 200, 400, 2000 },
.tones = {
{ DAHDI_TONE_DIALTONE, "413+438" },
{ DAHDI_TONE_DIALTONE, "415+440" },
{ DAHDI_TONE_BUSY, "425/375,0/375" },
{ DAHDI_TONE_RINGTONE, "413+438/400,0/200,413+438/400,0/2000" },
/* XXX Congestion: Should reduce by 10 db every other cadence XXX */
{ DAHDI_TONE_CONGESTION, "425/375,0/375,420/375,0/375" },
/* The Australian congestion tone is 425Hz, 375ms On, 375ms Off, with the
* second cadence being half the amplitude of the first; so the first cadence
* is approximately -10dB with the second one being -20dB. Using the update
* ToneZone.c file, this can be accomplished by adding the "@" symbol in front
* of the frequency to reduce amplification, as in the following entry for
* Congestion:
*/
{ DAHDI_TONE_CONGESTION, "425/375,0/375,425@/375,0/375" },
{ DAHDI_TONE_CALLWAIT, "425/100,0/200,425/200,0/4400" },
{ DAHDI_TONE_DIALRECALL, "413+428" },
{ DAHDI_TONE_RECORDTONE, "!425/1000,!0/15000,425/360,0/15000" },
@@ -928,6 +935,8 @@ struct tone_zone builtin_zones[] =
{ DAHDI_TONE_RECORDTONE, "1400/400,0/15000" },
{ DAHDI_TONE_INFO, "950/330,1440/330,1800/330,0/1000" },
{ DAHDI_TONE_STUTTER, "!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425" },
/* DIALRECALL - not specified */
{ DAHDI_TONE_DIALRECALL, "!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440" },
},
.dtmf_high_level = -10,
.dtmf_low_level = -10,
@@ -948,6 +957,8 @@ struct tone_zone builtin_zones[] =
/* This should actually be 950+1400+1800, but we only support 2 tones at a time */
{ DAHDI_TONE_INFO, "!950+1400/300,!0/1000,!950+1400/300,!0/1000,!950+1400/1000,0" },
{ DAHDI_TONE_STUTTER, "!450/100,!0/100,!450/100,!0/100,!450/100,!0/100,!450/100,!0/100,!450/100,!0/100,!450/100,!0/100,450" },
/* DIALRECALL - not specified */
{ DAHDI_TONE_DIALRECALL, "!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440" },
},
.dtmf_high_level = -10,
.dtmf_low_level = -10,
@@ -996,6 +1007,8 @@ struct tone_zone builtin_zones[] =
{ DAHDI_TONE_INFO, "950/333,1400/333,1800/333,0/1000" },
/* STUTTER TONE - not specified */
{ DAHDI_TONE_STUTTER, "!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425" },
/* DIALRECALL - not specified */
{ DAHDI_TONE_DIALRECALL, "!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440" },
},
.dtmf_high_level = -10,
.dtmf_low_level = -10,
@@ -1044,6 +1057,8 @@ struct tone_zone builtin_zones[] =
{ DAHDI_TONE_INFO, "950/330,1450/330,1850/330,0/1000" },
/* STUTTER TONE */
{ DAHDI_TONE_STUTTER, "380+420" },
/* DIALRECALL - not specified */
{ DAHDI_TONE_DIALRECALL, "!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440" },
},
.dtmf_high_level = -10,
.dtmf_low_level = -10,