[asterisk-commits] rizzo: branch rizzo/astobj2 r48534 -
/team/rizzo/astobj2/channels/chan_sip.c
asterisk-commits at lists.digium.com
asterisk-commits at lists.digium.com
Sun Dec 17 00:31:13 MST 2006
Author: rizzo
Date: Sun Dec 17 01:31:10 2006
New Revision: 48534
URL: http://svn.digium.com/view/asterisk?view=rev&rev=48534
Log:
replace struct sip_request with struct sip_msg_out
in all places where an outgoing message is involved.
The change is mostly mechanical (starting from add_header() and
then handling the fallout) with a few exception that denote
potential issues in the original code, as described below,
and which are definitely worth putting in trunk as well:
+ in initialize_initreq(), replace the call to copy_request()/parse_request()
with one to parse_copy() which does the right thing.
+ remove a duplicate prototype for append)date()
+ init_resp() and init_req() do a useless strlen, we can use the
return value from the previous snprintf() instead (yet to be fixed).
Modified:
team/rizzo/astobj2/channels/chan_sip.c
Modified: team/rizzo/astobj2/channels/chan_sip.c
URL: http://svn.digium.com/view/asterisk/team/rizzo/astobj2/channels/chan_sip.c?view=diff&rev=48534&r1=48533&r2=48534
==============================================================================
--- team/rizzo/astobj2/channels/chan_sip.c (original)
+++ team/rizzo/astobj2/channels/chan_sip.c Sun Dec 17 01:31:10 2006
@@ -1373,7 +1373,7 @@
static int __sip_reliable_xmit(struct sip_pvt *p, int seqno, int resp, char *data, int len, enum xmittype mode, int sipmethod);
static int __transmit_response(struct sip_pvt *p, const char *msg, const struct sip_request *req, enum xmittype reliable);
static int retrans_pkt(void *data);
-static int transmit_sip_request(struct sip_pvt *p, struct sip_request *req);
+static int transmit_sip_request(struct sip_pvt *p, struct sip_msg_out *req);
static int transmit_response_using_temp(ast_string_field callid, struct sockaddr_in *sin, int useglobal_nat, const int intended_method, const struct sip_request *req, const char *msg);
static int transmit_response(struct sip_pvt *p, const char *msg, const struct sip_request *req);
static int transmit_response_reliable(struct sip_pvt *p, const char *msg, const struct sip_request *req);
@@ -1394,8 +1394,8 @@
static int transmit_notify_with_mwi(struct sip_pvt *p, int newmsgs, int oldmsgs, char *vmexten);
static int transmit_notify_with_sipfrag(struct sip_pvt *p, int cseq, char *message, int terminate);
static int transmit_register(struct sip_registry *r, const char *auth, const char *authheader);
-static int send_response(struct sip_pvt *p, struct sip_request *req, enum xmittype reliable, int seqno);
-static int send_request(struct sip_pvt *p, struct sip_request *req, enum xmittype reliable, int seqno);
+static int send_response(struct sip_pvt *p, struct sip_msg_out *req, enum xmittype reliable, int seqno);
+static int send_request(struct sip_pvt *p, struct sip_msg_out *req, enum xmittype reliable, int seqno);
static void copy_request(struct sip_request *dst, const struct sip_request *src);
static void receive_message(struct sip_pvt *p, struct sip_request *req);
static void parse_moved_contact(struct sip_pvt *p, struct sip_request *req);
@@ -1440,7 +1440,7 @@
static void add_noncodec_to_sdp(const struct sip_pvt *p, int format, int sample_rate,
struct ast_str **m_buf, struct ast_str **a_buf,
int debug);
-static enum sip_result add_sdp(struct sip_request *resp, struct sip_pvt *p);
+static enum sip_result add_sdp(struct sip_msg_out *resp, struct sip_pvt *p);
static void do_setnat(struct sip_pvt *p, int natflags);
/*--- Authentication stuff */
@@ -1574,7 +1574,6 @@
static void sip_send_all_registers(void);
/*--- Parsing SIP requests and responses */
-static void append_date(struct sip_request *req); /* Append date to SIP packet */
static int determine_firstline_parts(struct sip_request *req);
static const struct cfsubscription_types *find_subscription_type(enum subscriptiontype subtype);
static const char *gettag(const struct sip_request *req, const char *header, char *tagbuf, int tagbufsize);
@@ -1584,7 +1583,7 @@
static const char *get_header(const struct sip_request *req, const char *name);
static const char *referstatus2str(enum referstatus rstatus) attribute_pure;
static int method_match(enum sipmethod id, const char *name);
-static void parse_copy(struct sip_request *dst, const struct sip_request *src);
+static void parse_copy(struct sip_request *dst, const struct sip_msg_out *src);
static char *get_in_brackets(char *tmp);
static const char *find_alias(const char *name, const char *_default);
static const char *__get_header(const struct sip_request *req, const char *name, int *start);
@@ -1604,12 +1603,12 @@
static int transmit_state_notify(struct sip_pvt *p, int state, int full, int timeout);
/*--- Constructing requests and responses */
-static void initialize_initreq(struct sip_pvt *p, struct sip_request *req);
-static int init_req(struct sip_request *req, int sipmethod, const char *recip);
-static int reqprep(struct sip_request *req, struct sip_pvt *p, int sipmethod, int seqno, int newbranch);
-static void initreqprep(struct sip_request *req, struct sip_pvt *p, int sipmethod);
-static int init_resp(struct sip_request *resp, const char *msg);
-static int respprep(struct sip_request *resp, struct sip_pvt *p, const char *msg, const struct sip_request *req);
+static void initialize_initreq(struct sip_pvt *p, struct sip_msg_out *req);
+static int init_req(struct sip_msg_out *req, int sipmethod, const char *recip);
+static int reqprep(struct sip_msg_out *req, struct sip_pvt *p, int sipmethod, int seqno, int newbranch);
+static void initreqprep(struct sip_msg_out *req, struct sip_pvt *p, int sipmethod);
+static int init_resp(struct sip_msg_out *resp, const char *msg);
+static int respprep(struct sip_msg_out *resp, struct sip_pvt *p, const char *msg, const struct sip_request *req);
static const struct sockaddr_in *sip_real_dst(const struct sip_pvt *p);
static void build_via(struct sip_pvt *p);
static int create_addr_from_peer(struct sip_pvt *r, struct sip_peer *peer);
@@ -1618,18 +1617,18 @@
static void build_callid_pvt(struct sip_pvt *pvt);
static void build_callid_registry(struct sip_registry *reg, struct in_addr ourip, const char *fromdomain);
static void make_our_tag(char *tagbuf, size_t len);
-static int add_header(struct sip_request *req, const char *var, const char *value);
-static int add_header_contentLength(struct sip_request *req, int len);
-static int add_line(struct sip_request *req, const char *line);
-static int add_text(struct sip_request *req, const char *text);
-static int add_digit(struct sip_request *req, char digit);
-static int add_vidupdate(struct sip_request *req);
-static void add_route(struct sip_request *req, struct sip_route *route);
-static int copy_header(struct sip_request *req, const struct sip_request *orig, const char *field);
-static int copy_all_header(struct sip_request *req, const struct sip_request *orig, const char *field);
-static int copy_via_headers(struct sip_pvt *p, struct sip_request *req, const struct sip_request *orig, const char *field);
+static int add_header(struct sip_msg_out *req, const char *var, const char *value);
+static int add_header_contentLength(struct sip_msg_out *req, int len);
+static int add_line(struct sip_msg_out *req, const char *line);
+static int add_text(struct sip_msg_out *req, const char *text);
+static int add_digit(struct sip_msg_out *req, char digit);
+static int add_vidupdate(struct sip_msg_out *req);
+static void add_route(struct sip_msg_out *req, struct sip_route *route);
+static int copy_header(struct sip_msg_out *req, const struct sip_request *orig, const char *field);
+static int copy_all_header(struct sip_msg_out *req, const struct sip_request *orig, const char *field);
+static int copy_via_headers(struct sip_pvt *p, struct sip_msg_out *req, const struct sip_request *orig, const char *field);
static void set_destination(struct sip_pvt *p, char *uri);
-static void append_date(struct sip_request *req);
+static void append_date(struct sip_msg_out *req);
static void build_contact(struct sip_pvt *p);
static void build_rpid(struct sip_pvt *p);
@@ -1823,8 +1822,11 @@
/*! \brief Initialize the initital request packet in the pvt structure.
This packet is used for creating replies and future requests in
- a dialog */
-static void initialize_initreq(struct sip_pvt *p, struct sip_request *req)
+ a dialog.
+ * We use this only for outgoing packets, because transactions initiated
+ * by an incoming packet already have p->initreq set on reception.
+ */
+static void initialize_initreq(struct sip_pvt *p, struct sip_msg_out *req)
{
if (option_debug) {
if (p->initreq.headers)
@@ -1833,8 +1835,7 @@
ast_log(LOG_DEBUG, "Initializing initreq for method %s - callid %s\n", sip_methods[req->method].text, p->callid);
}
/* Use this as the basis */
- copy_request(&p->initreq, req);
- parse_request(&p->initreq);
+ parse_copy(&p->initreq, req); /* XXX check this */
if (ast_test_flag(req, SIP_PKT_DEBUG))
ast_verbose("Initreq: %d headers, %d lines\n", p->initreq.headers, p->initreq.lines);
}
@@ -2386,8 +2387,9 @@
/*! \brief Copy SIP request, parse it.
* It is only used in two places to produce 'history' output.
+ * XXX be very careful with this when struct sip_msg_out will change.
*/
-static void parse_copy(struct sip_request *dst, const struct sip_request *src)
+static void parse_copy(struct sip_request *dst, const struct sip_msg_out *src)
{
memset(dst, 0, sizeof(*dst));
memcpy(dst->data, src->data, sizeof(dst->data));
@@ -2396,7 +2398,7 @@
}
/*! \brief add a blank line if no body */
-static void add_blank(struct sip_request *req)
+static void add_blank(struct sip_msg_out *req)
{
if (!req->lines) {
/* Add extra empty return. add_header() reserves 4 bytes so cannot be truncated */
@@ -2406,7 +2408,7 @@
}
/*! \brief Transmit response on SIP request*/
-static int send_response(struct sip_pvt *p, struct sip_request *req, enum xmittype reliable, int seqno)
+static int send_response(struct sip_pvt *p, struct sip_msg_out *req, enum xmittype reliable, int seqno)
{
int res;
@@ -2437,7 +2439,7 @@
* XXX this is basically the same as send_response apart from the history tag
* and the third argument to __sip_reliable_xmit()
*/
-static int send_request(struct sip_pvt *p, struct sip_request *req, enum xmittype reliable, int seqno)
+static int send_request(struct sip_pvt *p, struct sip_msg_out *req, enum xmittype reliable, int seqno)
{
int res;
@@ -5681,7 +5683,7 @@
/*! \brief Add header to SIP message */
-static int add_header(struct sip_request *req, const char *var, const char *value)
+static int add_header(struct sip_msg_out *req, const char *var, const char *value)
{
int maxlen = sizeof(req->data) - 4 - req->len; /* 4 bytes are for two \r\n ? */
char *dst;
@@ -5718,7 +5720,7 @@
}
/*! \brief Add 'Content-Length' header to SIP message */
-static int add_header_contentLength(struct sip_request *req, int len)
+static int add_header_contentLength(struct sip_msg_out *req, int len)
{
char clen[10];
@@ -5727,7 +5729,7 @@
}
/*! \brief Add content (not header) to SIP message */
-static int add_line(struct sip_request *req, const char *line)
+static int add_line(struct sip_msg_out *req, const char *line)
{
if (req->lines == SIP_MAX_LINES) {
ast_log(LOG_WARNING, "Out of SIP line space\n");
@@ -5750,7 +5752,7 @@
}
/*! \brief Copy one header field from one request to another */
-static int copy_header(struct sip_request *req, const struct sip_request *orig, const char *field)
+static int copy_header(struct sip_msg_out *req, const struct sip_request *orig, const char *field)
{
const char *tmp = get_header(orig, field);
@@ -5761,7 +5763,7 @@
}
/*! \brief Copy all headers from one request to another */
-static int copy_all_header(struct sip_request *req, const struct sip_request *orig, const char *field)
+static int copy_all_header(struct sip_msg_out *req, const struct sip_request *orig, const char *field)
{
int start = 0;
int copied = 0;
@@ -5783,7 +5785,7 @@
add the port number (from our point of view) to that parameter.
We always add ;received=<ip address> to the topmost via header.
Received: RFC 3261, rport RFC 3581 */
-static int copy_via_headers(struct sip_pvt *p, struct sip_request *req, const struct sip_request *orig, const char *field)
+static int copy_via_headers(struct sip_pvt *p, struct sip_msg_out *req, const struct sip_request *orig, const char *field)
{
int copied = 0;
int start = 0;
@@ -5842,7 +5844,7 @@
}
/*! \brief Add route header into request per learned route */
-static void add_route(struct sip_request *req, struct sip_route *route)
+static void add_route(struct sip_msg_out *req, struct sip_route *route)
{
char r[BUFSIZ*2], *p;
int n, rem = sizeof(r);
@@ -5934,26 +5936,28 @@
}
/*! \brief Initialize SIP response, based on SIP request */
-static int init_resp(struct sip_request *resp, const char *msg)
+static int init_resp(struct sip_msg_out *resp, const char *msg)
{
/* Initialize a response */
memset(resp, 0, sizeof(*resp));
resp->method = SIP_RESPONSE;
resp->header[0] = resp->data;
snprintf(resp->header[0], sizeof(resp->data), "SIP/2.0 %s\r\n", msg);
+ /* XXX no need to do a strlen, sprintf tells us what the size is */
resp->len = strlen(resp->header[0]);
resp->headers++;
return 0;
}
/*! \brief Initialize SIP request */
-static int init_req(struct sip_request *req, int sipmethod, const char *recip)
+static int init_req(struct sip_msg_out *req, int sipmethod, const char *recip)
{
/* Initialize a request */
memset(req, 0, sizeof(*req));
req->method = sipmethod;
req->header[0] = req->data;
snprintf(req->header[0], sizeof(req->data), "%s %s SIP/2.0\r\n", sip_methods[sipmethod].text, recip);
+ /* XXX no need to do a strlen, sprintf tells us what the size is */
req->len = strlen(req->header[0]);
req->headers++;
return 0;
@@ -5961,7 +5965,7 @@
/*! \brief Prepare SIP response packet */
-static int respprep(struct sip_request *resp, struct sip_pvt *p, const char *msg, const struct sip_request *req)
+static int respprep(struct sip_msg_out *resp, struct sip_pvt *p, const char *msg, const struct sip_request *req)
{
char newto[256];
const char *ot;
@@ -6008,7 +6012,7 @@
}
/*! \brief Initialize a SIP request message (not the initial one in a dialog) */
-static int reqprep(struct sip_request *req, struct sip_pvt *p, int sipmethod, int seqno, int newbranch)
+static int reqprep(struct sip_msg_out *req, struct sip_pvt *p, int sipmethod, int seqno, int newbranch)
{
struct sip_request *orig = &p->initreq;
char stripped[80];
@@ -6113,7 +6117,7 @@
/*! \brief Base transmit response function */
static int __transmit_response(struct sip_pvt *p, const char *msg, const struct sip_request *req, enum xmittype reliable)
{
- struct sip_request resp;
+ struct sip_msg_out resp;
int seqno = 0;
if (reliable && (sscanf(get_header(req, "CSeq"), "%d ", &seqno) != 1)) {
@@ -6203,7 +6207,7 @@
/*! \brief Transmit response, no retransmits */
static int transmit_response_with_unsupported(struct sip_pvt *p, const char *msg, const struct sip_request *req, const char *unsupported)
{
- struct sip_request resp;
+ struct sip_msg_out resp;
respprep(&resp, p, msg, req);
append_date(&resp);
add_header(&resp, "Unsupported", unsupported);
@@ -6219,7 +6223,7 @@
}
/*! \brief Append date to SIP message */
-static void append_date(struct sip_request *req)
+static void append_date(struct sip_msg_out *req)
{
char tmpdat[256];
struct tm tm;
@@ -6233,7 +6237,7 @@
/*! \brief Append date and content length before transmitting response */
static int transmit_response_with_date(struct sip_pvt *p, const char *msg, const struct sip_request *req)
{
- struct sip_request resp;
+ struct sip_msg_out resp;
respprep(&resp, p, msg, req);
append_date(&resp);
add_header_contentLength(&resp, 0);
@@ -6243,7 +6247,7 @@
/*! \brief Append Accept header, content length before transmitting response */
static int transmit_response_with_allow(struct sip_pvt *p, const char *msg, const struct sip_request *req, enum xmittype reliable)
{
- struct sip_request resp;
+ struct sip_msg_out resp;
respprep(&resp, p, msg, req);
add_header(&resp, "Accept", "application/sdp");
add_header_contentLength(&resp, 0);
@@ -6253,7 +6257,7 @@
/*! \brief Respond with authorization request */
static int transmit_response_with_auth(struct sip_pvt *p, const char *msg, const struct sip_request *req, const char *randdata, enum xmittype reliable, const char *header, int stale)
{
- struct sip_request resp;
+ struct sip_msg_out resp;
char tmp[512];
int seqno = 0;
@@ -6272,7 +6276,7 @@
}
/*! \brief Add text body to SIP message */
-static int add_text(struct sip_request *req, const char *text)
+static int add_text(struct sip_msg_out *req, const char *text)
{
/* XXX Convert \n's to \r\n's XXX */
add_header(req, "Content-Type", "text/plain");
@@ -6283,7 +6287,7 @@
/*! \brief Add DTMF INFO tone to sip message */
/* Always adds default duration 250 ms, regardless of what came in over the line */
-static int add_digit(struct sip_request *req, char digit)
+static int add_digit(struct sip_msg_out *req, char digit)
{
char tmp[256];
@@ -6296,7 +6300,7 @@
/*! \brief add XML encoded media control with update
\note XML: The only way to turn 0 bits of information into a few hundred. (markster) */
-static int add_vidupdate(struct sip_request *req)
+static int add_vidupdate(struct sip_msg_out *req)
{
const char *xml_is_a_huge_waste_of_space =
"<?xml version=\"1.0\" encoding=\"utf-8\" ?>\r\n"
@@ -6391,7 +6395,7 @@
}
/*! \brief Add T.38 Session Description Protocol message */
-static int add_t38_sdp(struct sip_request *resp, struct sip_pvt *p)
+static int add_t38_sdp(struct sip_msg_out *resp, struct sip_pvt *p)
{
int len = 0;
int x = 0;
@@ -6530,7 +6534,7 @@
#define SDP_SAMPLE_RATE(x) (x == AST_FORMAT_G722) ? 16000 : 8000
/*! \brief Add Session Description Protocol message */
-static enum sip_result add_sdp(struct sip_request *resp, struct sip_pvt *p)
+static enum sip_result add_sdp(struct sip_msg_out *resp, struct sip_pvt *p)
{
int len = 0;
int alreadysent = 0;
@@ -6750,7 +6754,7 @@
/*! \brief Used for 200 OK and 183 early media */
static int transmit_response_with_t38_sdp(struct sip_pvt *p, char *msg, struct sip_request *req, int retrans)
{
- struct sip_request resp;
+ struct sip_msg_out resp;
int seqno;
if (sscanf(get_header(req, "CSeq"), "%d ", &seqno) != 1) {
@@ -6786,7 +6790,7 @@
/*! \brief Used for 200 OK and 183 early media */
static int transmit_response_with_sdp(struct sip_pvt *p, const char *msg, const struct sip_request *req, enum xmittype reliable)
{
- struct sip_request resp;
+ struct sip_msg_out resp;
int seqno;
if (sscanf(get_header(req, "CSeq"), "%d ", &seqno) != 1) {
ast_log(LOG_WARNING, "Unable to get seqno from '%s'\n", get_header(req, "CSeq"));
@@ -6860,7 +6864,7 @@
*/
static int transmit_reinvite_with_sdp(struct sip_pvt *p, int t38version)
{
- struct sip_request req;
+ struct sip_msg_out req;
reqprep(&req, p, ast_test_flag(&p->flags[0], SIP_REINVITE_UPDATE) ? SIP_UPDATE : SIP_INVITE, 0, 1);
@@ -6983,7 +6987,7 @@
}
/*! \brief Initiate new SIP request to peer/user */
-static void initreqprep(struct sip_request *req, struct sip_pvt *p, int sipmethod)
+static void initreqprep(struct sip_msg_out *req, struct sip_pvt *p, int sipmethod)
{
struct ast_str *invite = ast_str_alloca(256);
char from[256];
@@ -7123,7 +7127,7 @@
*/
static int transmit_invite(struct sip_pvt *p, int sipmethod, int sdp, int init)
{
- struct sip_request req;
+ struct sip_msg_out req;
req.method = sipmethod;
if (init) { /* Bump branch even on initial requests */
@@ -7216,7 +7220,7 @@
struct ast_str *tmp = ast_str_alloca(4000);
char from[256], to[256];
char *c, *mfrom, *mto;
- struct sip_request req;
+ struct sip_msg_out req;
char hint[AST_MAX_EXTENSION];
char *statestring = "terminated";
const struct cfsubscription_types *subscriptiontype;
@@ -7378,7 +7382,7 @@
*/
static int transmit_notify_with_mwi(struct sip_pvt *p, int newmsgs, int oldmsgs, char *vmexten)
{
- struct sip_request req;
+ struct sip_msg_out req;
struct ast_str *out = ast_str_alloca(500);
initreqprep(&req, p, SIP_NOTIFY);
@@ -7405,7 +7409,7 @@
}
/*! \brief Transmit SIP request unreliably (only used in sip_notify subsystem) */
-static int transmit_sip_request(struct sip_pvt *p, struct sip_request *req)
+static int transmit_sip_request(struct sip_pvt *p, struct sip_msg_out *req)
{
if (!p->initreq.headers) /* Initialize first request before sending */
initialize_initreq(p, req);
@@ -7415,7 +7419,7 @@
/*! \brief Notify a transferring party of the status of transfer */
static int transmit_notify_with_sipfrag(struct sip_pvt *p, int cseq, char *message, int terminate)
{
- struct sip_request req;
+ struct sip_msg_out req;
char tmp[BUFSIZ/2];
reqprep(&req, p, SIP_NOTIFY, 0, 1);
@@ -7543,7 +7547,7 @@
*/
static int transmit_register(struct sip_registry *r, const char *auth, const char *authheader)
{
- struct sip_request req;
+ struct sip_msg_out req;
char from[256];
char to[256];
char tmp[80];
@@ -7729,7 +7733,7 @@
/*! \brief Transmit text with SIP MESSAGE method */
static int transmit_message_with_text(struct sip_pvt *p, const char *text)
{
- struct sip_request req;
+ struct sip_msg_out req;
reqprep(&req, p, SIP_MESSAGE, 0, 1);
add_text(&req, text);
@@ -7760,7 +7764,7 @@
*/
static int transmit_refer(struct sip_pvt *p, const char *dest)
{
- struct sip_request req = {
+ struct sip_msg_out req = { /* XXX do we need to init it ? */
.headers = 0,
};
char from[256];
@@ -7831,7 +7835,7 @@
/*! \brief Send SIP INFO dtmf message, see Cisco documentation on cisco.com */
static int transmit_info_with_digit(struct sip_pvt *p, const char digit)
{
- struct sip_request req;
+ struct sip_msg_out req;
reqprep(&req, p, SIP_INFO, 0, 1);
add_digit(&req, digit);
@@ -7841,7 +7845,7 @@
/*! \brief Send SIP INFO with video update request */
static int transmit_info_with_vidupdate(struct sip_pvt *p)
{
- struct sip_request req;
+ struct sip_msg_out req;
reqprep(&req, p, SIP_INFO, 0, 1);
add_vidupdate(&req);
@@ -7851,7 +7855,7 @@
/*! \brief Transmit generic SIP request */
static int transmit_request(struct sip_pvt *p, int sipmethod, int seqno, enum xmittype reliable, int newbranch)
{
- struct sip_request resp;
+ struct sip_msg_out resp;
if (0 && sipmethod == SIP_ACK)
p->invitestate = INV_CONFIRMED;
@@ -7879,7 +7883,7 @@
/*! \brief Transmit SIP request, auth added */
static int transmit_request_with_auth(struct sip_pvt *p, int sipmethod, int seqno, enum xmittype reliable, int newbranch)
{
- struct sip_request resp;
+ struct sip_msg_out resp;
reqprep(&resp, p, sipmethod, seqno, newbranch);
if (!ast_strlen_zero(p->realm)) {
@@ -11508,7 +11512,7 @@
for (i = 3; i < argc; i++) {
struct sip_pvt *p;
- struct sip_request req;
+ struct sip_msg_out req;
struct ast_variable *var;
if (!(p = sip_alloc(NULL, NULL, 0, SIP_NOTIFY))) {
More information about the asterisk-commits
mailing list