$Id: TODO,v 1.74.4.2 2004/07/05 15:18:27 andrei Exp $

( - todo, x - done)

- loose_roote : use parse_orig_uri instead of parse_uri


- grep parse_uri & replace with parse_sip_msg_uri (e.g do_action!)
x update AUTHORS, debian/copyright, ser.8, ser.cfg.5 from stable
x update Makefile*  from stable
x update all package specs from stable
- add BUG checks for  fd > 0 && fd <= maxfd to all selects?
x tcp_main_loop: BUG cases should "conitnue;"
x change len_gt into and expr (e.g msg:len).
- sipit: uri == myself doesn't match tls port = 5061
- sipit: fix check_self & *_alias to work with tcp & tls
x sipit: fix ipv6 references in check_self
x regex subst on uris?
x port receive.c pre_script_cb fix from stable
- extend alias to include port numbers :
    something like alias= foo1.bar:5080 foo2.bar foo3.bar:*
- extend listen and alias to include port numbers and protocol:
       tcp foo.bar:5063, udp foo.bar:5062, foo2.bar
x added set_advertised_{address,port} -- was: add force_via, force_srcip a.s.o
(the advertised addresses should be overwritable from the script).
- ? add force_outbound_socket(ip)? (choose an apropriate socket from the
 listen list for sending the msg; works on udp only)

release:
- unlink_timer_lists -- unsafe ???
x print_cseq_num max. size fix.
x backport: tcp conn id fix to stable + destroy_tcp 
x backport: acc mem. leak fixes
x backport: dns mem. leak fixes (resolve.[ch])
x backport: id_builder receive_msg mem. leak (msg_translator.c)
x backport: check_self ipv6/case fixes (forward.c)
x change tcp timeouts to 2 or 3 min?
x check via ipv6 fixes and backport to stable
x fix kill(0, SIGTERM) on startup error (will kill also the launching shell
 if non-interactive)
- fix modules destroy (some modules will try to free uninitialized resources
   if modules_init was not called first)
x fix CC_VER bug in newer Makefile (move DEFS after CC?)
x openbsd 3.2 packages -> doc in share/doc (and not in doc)
- openbsd 3.2 -> add jabber and mysql to the package
x fix modules makefiles (so that cd modules/foo; make will also link the proper
   libs)
x fix -march=..., or compile w/ i386 for the release
x resolver should resolve [ipv6]
x remove parse_uri debugging info
- fix DBG("<%.*s>", len, _null_)
x add -t, -w, -u -g equivalents to the config file
x force add rport : force_rport()
- kill all the fprintf
see also tcp & tm



not so critical:
x replace  remaining mallocs/frees at least in msg_translator.c
- add $(INCLUDES) to the Makefiles
x make ser suncc ready
- fix parse_cseq!!! (it doesnt parse 1234\n INVITE a.s.o)
x fix 0 parameter module f. call
x better Via parsing (handle ' ' in uri, eg: foo.bar : 1234 ; received=) and
 ipv6 addresses ([fec0:aa::01]).
- fix format string vulnerability in log()
- fix alignment access problems (warning on Sun)
x (different way) add request header bitmap field for the modules
- introduce variables & function in the script language (cfg. file)
- ? variable number of params functions in script (no longer limited to 2)?
- kill bind_idx
x fix bind_address for tcp (in some  way)
x add conflict in debs/rpms/etc (conflict w/ older ser-mysql, ser-jabber)
x new packages ser-radius etc
x tcp_destroy (called on ser exit)
- BUG:?? ipv6 only and try to send to ipv4 => getsendsocket=>0 (send_ipv6=0)
  the reverse is also true
- SUBST lumps for replies (involves setting the send_socket in forward_reply, 
  before build_res_from_res, & adding it to buid_res_from_res).


High priority:
x- parse_uri should not copy anymore the uri members (and it should not 0
 terminate them anylonger).
x fix/replace T_REF/T_UNREF
x review all the tm locking
x if () {} else {}
x plugin interface
x ipv6 support
x reply ("response line")
x drop ACKs for our replies
- icmp error handling
x add To-tag (for the replies)
x add User-Agent (for the replies)

Low priority:
x fix via address someday
- fix listen=0.0.0.0 case
x forward to received= if present
- make it easier to register a statically linkable module.
x add support for -u user and -g group (not only -u uid, -g uid)
- change uid/gid after opening the sockets
- exec improvments (add format strings to it)
x command line switch for checking the config file syntax
- config file version (a la sendmail)
0 loop detection
- cfg. file reload
- flags for using names or ip adresses in Via ?

x handle SIGCHLD, SIGHUP
- use a  standard lex compatible .lex format (instead of flex)
x try & use native compiler & ld if possible

x make install
x init.d scripts (and rc.local? for *BSD or Slackware)
x man page
- autoconf scripts
x Debian package build files
x the same for rpm
- the same for FreeBSD and Slackware


x jku: branch hash computation over canonical values
0 jku: loop checking
- jku: try CRC as opposed to MD5


x freopen stdin, stdout, stderr to /dev/null
- add a section on building ser & configuring it for maximum performance
 (-DF_MALLOC, -DNO_DBG, ... sip_warning=0, a.s.o)
x add src_port, dst_port, proto to cfg.{y,lex}
x generic locking lib
x convert tm to use new locking lib

optimizations:
- better timer interface with hashes (a la openbsd)
- change lumps (flags for malloc type, recursive? see COND lumps )
- atomic ops?
- assembly for some very common used function
- getsock* cache
- fd cache for tcp_send
- dns cache? (see DNS)
- make option to use openssl MD5 (HMAC_Init(hmac_ctx, (void*)key, 16, md5_md))
 [ 0.9.7 version is really fast ]


tcp stuff:
- timeout on long sends
x tcp disable nagle 
x set TOS to minimize delay
- tcp locking/atomic ops review
- tcp fix simultaneous connects (ser process is blocked until connect timeouts
 => possible DOS)

tm optimizations:

- inline/macro/drop for: get_tm_table, set_kr, lock_hash, unlock_hash,
  set_t, get_t
- replace snprintfs int build_uac_request, *_dlg
- fix the huge param no. in this functions (use structs if neccessary):
  build_uac_request, build_uac_request_dlg, t_uac, t_uac_dlg
- uri2proxy - t_uac_dlg => extra malloc/free (no üroxy needed here)
  
dns stuff:
 - dns cache
 - support for NAPTR (naptr(domain, pref_proto)=> srv_rec + proto => srv(srv_rec, proto) => A or AAAA => A/AAAA(name))
 - support for fallback (inside the same A/AAAA record, other ip; if fails => other SRV ; if it fails too other NAPTR
[see rfc3263]
