| 2644 | } |
| 2645 | |
| 2646 | static int pv_get_proxy_protocol(struct sip_msg *msg, pv_param_t *param, |
| 2647 | pv_value_t *res) |
| 2648 | { |
| 2649 | if(msg==NULL || res==NULL) |
| 2650 | return -1; |
| 2651 | |
| 2652 | if (msg->rcv.real_ep.flags != PP_OK) |
| 2653 | return pv_get_null(msg, NULL, res); |
| 2654 | |
| 2655 | switch (param->pvn.u.isname.name.n) { |
| 2656 | case PROXY_PROTOCOL_SRC_IP_ID: |
| 2657 | res->rs.s = ip_addr2a(&msg->rcv.real_ep.src_ip); |
| 2658 | res->rs.len = strlen(res->rs.s); |
| 2659 | res->flags = PV_VAL_STR; |
| 2660 | break; |
| 2661 | case PROXY_PROTOCOL_SRC_PORT_ID: |
| 2662 | res->ri = msg->rcv.real_ep.src_port; |
| 2663 | res->rs.s = int2str((uint64_t)msg->rcv.real_ep.src_port, &res->rs.len); |
| 2664 | res->flags = PV_VAL_STR|PV_VAL_INT|PV_TYPE_INT; |
| 2665 | break; |
| 2666 | case PROXY_PROTOCOL_DST_IP_ID: |
| 2667 | res->rs.s = ip_addr2a(&msg->rcv.real_ep.dst_ip); |
| 2668 | res->rs.len = strlen(res->rs.s); |
| 2669 | res->flags = PV_VAL_STR; |
| 2670 | break; |
| 2671 | case PROXY_PROTOCOL_DST_PORT_ID: |
| 2672 | res->ri = msg->rcv.real_ep.dst_port; |
| 2673 | res->rs.s = int2str((uint64_t)msg->rcv.real_ep.dst_port, &res->rs.len); |
| 2674 | res->flags = PV_VAL_STR|PV_VAL_INT|PV_TYPE_INT; |
| 2675 | break; |
| 2676 | case PROXY_PROTOCOL_AF_ID: |
| 2677 | if (msg->rcv.real_ep.src_ip.af == AF_INET) { |
| 2678 | res->rs.s = "INET"; |
| 2679 | res->rs.len = 4; |
| 2680 | } else if (msg->rcv.real_ep.src_ip.af == AF_INET6) { |
| 2681 | res->rs.s = "INET6"; |
| 2682 | res->rs.len = 5; |
| 2683 | } else { |
| 2684 | return pv_get_null(msg, NULL, res); |
| 2685 | } |
| 2686 | res->flags = PV_VAL_STR; |
| 2687 | break; |
| 2688 | default: |
| 2689 | LM_CRIT("BUG - unsupported proxy_protocol ID %d\n", |
| 2690 | param->pvn.u.isname.name.n); |
| 2691 | return pv_get_null(NULL, NULL, res); |
| 2692 | } |
| 2693 | return 0; |
| 2694 | } |
| 2695 | |
| 2696 | |
| 2697 |
nothing calls this directly
no test coverage detected