This is a set of anticipated questions and the associated answer. ----------------------------------------------------------------- Q1: IAX is VoIP. Isn't it bad to run fax over VoIP? A1: Yes, generally it is. The conditions of jitter, packet loss, and other latency issues cause problems for reassembling VoIP audio streams on the receiver exactly as they were disassembled on the sender. However, these latency conditions can be controlled. For example, these conditions should not be present when communicating over the localhost address (127.0.0.1) in the case where the Asterisk server and the system running IAXmodem are the same. Other possible arrangements could be to use a dedicated network connection (e.g. a crossover cable) between the Asterisk server and the system running IAXmodem. IAXmodem should also be fine to run over a local area network (LAN) that is well-designed and controlled. The basic point is this: if you can eliminate the mitigating factors of jitter and packet loss, then you can reliably use VoIP channels for faxing. ----------------------------------------------------------------- Q2: What about T.38? Isn't T.38 the end-all solution for faxing over the internet? A2: T.38 is great, and yes, it is the end-all solution for faxing over the internet. However, IAXmodem isn't designed to be used for faxing over the internet, as the internet is not a network that can control the latency conditions enough for faxing to work. So T.38 and IAXmodem are really trying to solve two different problems. Someday the PSTN may be entirely replaced by VoIP. Someday all fax machines may have T.38 support. In that day there will be no need for fax DSPs. But that day is not now, and it's not coming in the foreseeable future. When using VoIP, someone, somewhere on that VoIP chain must have a "PSTN gateway". Likewise, when using T.38, someone, somewhere on that chain must have a "T.38 gateway" (to the PSTN). And any time fax data is passed through the PSTN it must be modulated, and that requires DSPs. IAXmodem was designed to give the fax application tight control of the DSP behavior (through the Class 1 interface) and the developers tight control of the DSP behavior (through access to the source code). As long as fax DSPs are needed and someone using those DSPs wants tight control of how they work, then there is a place for IAXmodem. ----------------------------------------------------------------- Q3: Why is IAXmodem open-source and licensed with the GPL? A3: Firstly, much of the value in IAXmodem comes from being able to control the DSP. This cannot be done as desired without having the source code to the DSP. Second, having the source code allows all users the same opporunity to improve and enhance it, and (hopefully) by contributing that work back to the community IAXmodem and the libraries that it uses also improve. Third, IAXmodem depends heavily upon libiax2 and spandsp, both of which are licensed with the GPL. Licensing IAXmodem in some other way would have been possible, although prohibitively difficult, and may not have not fostered as much community involvement and contribution. ----------------------------------------------------------------- Q4: IAX is bad and libiax2 is even worse. Why didn't you use SIP or some other channel driver? A4: The availability of libiax2 and the small set of protocol in IAX (compared to SIP) made it attractive for the purposes of getting IAXmodem running quickly. Although libiax2 has needed some bug fixes for IAXmodem to work properly, and although libiax2 probably will need more bug fixing in the future, it seemed like using it was the quickest path to a functional solution. If anyone is interested in enhancing IAXmodem to support SIP or any other channel driver, development contributions are always welcome. ----------------------------------------------------------------- Q5: What if I really want to use IAXmodem but my Asterisk server is connected to my HylaFAX server only by a lossy (e.g. internet) connection? A5: The connection between IAXmodem and Asterisk must be clean and clear. However, the connection between HylaFAX and IAXmodem need not be. For example, you could run IAXmodem on the Asterisk server communicating on the loopback adapter, and HylaFAX would communicate with IAXmodem remotely using a "remote tty" service such as termpkg's termnetd and ttyd programs. (A patch is included with IAXmodem source that will permit ttyd to be used for fax communications. You'll want to use a termnetd.conf entry like: "64570:on:/dev/ttyIAX0:B19200 CLOCAL CREAD IGNBRK;") An alternative to termpkg is interceptty, which is reported to work. ----------------------------------------------------------------- Q6: How do I set up my Asterisk dialplan for IAXmodem? A5: This will vary depending upon what you want, but in many instances it will be something like this: exten => fax,1,Dial(IAX2/ttyIAX/${EXTEN}) If you do not put ${EXTEN} there then IAXmodem will not receive DID information. In this example "fax" is your fax extension number. If you use the Asterisk "fax" extension given by zaptel fax detection then ${EXTEN} will lose its meaning, and you'll need to use a workaround to get the correct called-number passed on to IAXmodem. If you want to operate multiple IAXmodem instances (to handle more than one fax at a time) do something like this: exten => fax,1,Dial(IAX2/ttyIAX0/${EXTEN}) exten => fax,2,Dial(IAX2/ttyIAX1/${EXTEN}) exten => fax,3,Dial(IAX2/ttyIAX2/${EXTEN}) exten => fax,4,Busy exten => fax,5,Hangup Each IAXmodem instance can only handle one call at a time. Thus it will report as busy if it is already handling a call, and Asterisk will then proceed to the next entry in the dialplan. Passing ${EXTEN} or some related value in the Dial application is important, as that provides the DID indication for iaxmodem. If this application parameter is omitted then iaxmodem will not receive DID. ----------------------------------------------------------------- Q7: I start iaxmodem and then place a call to it, and I see these messages appear on output: "Unable to pass the full buffer onto the device file." What's wrong? Is this a bug? A7: IAXmodem doesn't immediately know if anything is watching the modem device or not. So when you place a call to iaxmodem it will instinctively pass RING messages and Call*ID to the pty. If nothing is watching the modem device then eventually the pty buffer will fill and the pty will begin refusing further data. This is what is happening. So basically, it's nothing to worry about if you are aware that you're not running any modem-watching process like faxgetty. However, you probably *should* be running something like faxgetty in anything other than a test scenario. ----------------------------------------------------------------- Q8: How do I set up my Asterisk iax.conf for IAXmodem? A8: Again, this will vary somewhat depending upon what you want. However, here is an example: [iaxmodem1] type=friend host=dynamic auth=md5 secret= context=outbound disallow=all allow=ulaw allow=alaw jitterbuffer=no The [context] name refers to the "peername" entry in the iaxmodem config file. The secret should match the "secret" entry in the same. The context value refers to which dialplan (extensions.conf) context should be used for handling calls which iaxmodem should initiate. The disallow and allow values ensure that the server only uses uLaw and alaw audio codecs when communicating with iaxmodem. Disabling the PBX-side jitterbuffer is quite important to prevent it from disturbing the audio. ----------------------------------------------------------------- See the TODO file for information regarding bugs, needed features, and enhancements.