Internal rerouting issues
Alexander Malysh
amalysh at kannel.org
Tue Jul 11 19:13:01 CEST 2006
Dziugas Baltrunas schrieb:
> Hi,
>
>> > Moreover, I noticed one more minor issue with rerouting. One would
>> > expect that both source and destination TON/NPI would remain the same
>> > in submit_sm as they were in deliver_sm, however, they are not. What
>> > is more, even if, say, destination address has TON = 1, Kannel will
>> > not treat it as an international number since there are no "+" in the
>> > beginning and as a result it will set TON to 2 (national number).
>> > Again, having dest-addr-ton = 1 in the smsc group makes a "workaround"
>> > for international numbers.
>> >
>>
>> That could be caused by receiver SMSC module if sending SMSC doesn't set
>> ton/npi values to international. It's not a kannel fault but sending
>> SMSC.
>
> No, this is not true. As I said, deliver_sm comes with TON set to
> international but after Kannel unpacks it to internal structure and
> then packs again, it gets lost since number does not have a '+'
> prefix. This is clearly seen from gw/smsc/smsc_smpp.c, pdu_to_msg and
> msg_to_pdu() functions. To be more precise, pdu_to_msg() does
>
> msg->sms.sender = pdu->u.deliver_sm.source_addr;
>
> and msg_to_pdu() does a check:
>
> /*
> * if its a international number starting with +, lets remove the
> * '+' and set number type to international instead
> */
> if (octstr_get_char(pdu->u.submit_sm.destination_addr,0) == '+') {
> octstr_delete(pdu->u.submit_sm.destination_addr, 0,1);
> pdu->u.submit_sm.dest_addr_ton = GSM_ADDR_TON_INTERNATIONAL;
> }
>
> which will never be true since '+' is only for mnemonics and it will
> rarely be put before the number. So the problem indeed is that msg
> structure does not have such a marker to store the type of src/dst
> number.
>
Did you read sources carefully?
in pdu_to_msg:
/* check source addr */
if ((*reason = convert_addr_from_pdu(smpp->conn->id,
pdu->u.deliver_sm.source_addr, ton, npi, smpp->alt_addr_charset)) !=
SMPP_ESME_ROK)
goto error;
in convert_addr_from_pdu if ton international:
/* international, insert '+' if not already here */
if (octstr_get_char(addr, 0) != '+')
octstr_insert_char(addr, 0, '+');
The same is true for destination. If sending SMSC set ton=1
(international) then your source_addr will always has '+' in front.
For the sending smpp module we check for '+' and set ton=1 international
then because it's only possibility to know that this is international
number.
Maybe you don't using fresh CVS? or maybe you disabled
addr-auto-detection? Then it's your fault...
Thanks,
Alex
More information about the devel
mailing list