⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test_radius_acct.c

📁 The Kannel Open Source WAP and SMS gateway works as both an SMS gateway, for implementing keyword b
💻 C
字号:
/* ====================================================================  * The Kannel Software License, Version 1.0  *  * Copyright (c) 2001-2004 Kannel Group   * Copyright (c) 1998-2001 WapIT Ltd.    * All rights reserved.  *  * Redistribution and use in source and binary forms, with or without  * modification, are permitted provided that the following conditions  * are met:  *  * 1. Redistributions of source code must retain the above copyright  *    notice, this list of conditions and the following disclaimer.  *  * 2. Redistributions in binary form must reproduce the above copyright  *    notice, this list of conditions and the following disclaimer in  *    the documentation and/or other materials provided with the  *    distribution.  *  * 3. The end-user documentation included with the redistribution,  *    if any, must include the following acknowledgment:  *       "This product includes software developed by the  *        Kannel Group (http://www.kannel.org/)."  *    Alternately, this acknowledgment may appear in the software itself,  *    if and wherever such third-party acknowledgments normally appear.  *  * 4. The names "Kannel" and "Kannel Group" must not be used to  *    endorse or promote products derived from this software without  *    prior written permission. For written permission, please   *    contact org@kannel.org.  *  * 5. Products derived from this software may not be called "Kannel",  *    nor may "Kannel" appear in their name, without prior written  *    permission of the Kannel Group.  *  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE  * DISCLAIMED.  IN NO EVENT SHALL THE KANNEL GROUP OR ITS CONTRIBUTORS  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,   * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT   * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR   * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,   * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE   * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,   * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  * ====================================================================  *  * This software consists of voluntary contributions made by many  * individuals on behalf of the Kannel Group.  For more information on   * the Kannel Group, please see <http://www.kannel.org/>.  *  * Portions of this software are based upon software originally written at   * WapIT Ltd., Helsinki, Finland for the Kannel project.   */ /* * test_radius_acct.c - program to test RADIUS accounting proxy thread * * Stipe Tolj <tolj@wapme-systems.de> */#include <unistd.h>#include <string.h>#include "gwlib/gwlib.h"#include "radius/radius_pdu.h"/* * Updates the internal RADIUS mapping table. Returns 1 if the  * mapping has been new and put into the table, otherwise if it's  * a duplicate returns 0. */static int update_table(RADIUS_PDU *pdu, Dict **table){    Octstr *client_ip, *msisdn;    Octstr *type;    int ret = 0;        client_ip = msisdn = NULL;    /* only add if we have a Accounting-Request PDU */    if (pdu->type == 0x04) {        /* check if we have a START or STOP event */        type = dict_get(pdu->attr, octstr_imm("Acct-Status-Type"));                /* grep the needed data */        client_ip = dict_get(pdu->attr, octstr_imm("Framed-IP-Address"));        msisdn = dict_get(pdu->attr, octstr_imm("Calling-Station-Id"));        if (octstr_compare(type, octstr_imm("1")) == 0) {            /* START */            if (dict_get(*table, client_ip) == NULL) {                dict_put(*table, client_ip, msisdn);                 info(0, "RADIUS: Mapping `%s <-> %s' added.",                     octstr_get_cstr(client_ip), octstr_get_cstr(msisdn));                ret = 1;            } else {                warning(0, "RADIUS: Duplicate mapping for `%s <-> %s' received",                        octstr_get_cstr(client_ip), octstr_get_cstr(msisdn));            }        }        else if (octstr_compare(type, octstr_imm("2")) == 0) {            /* STOP */            msisdn = dict_get(*table, client_ip);            dict_remove(*table, client_ip);        }        else {            error(0, "RADIUS: unknown Acct-Status-Type `%s' received.",                   octstr_get_cstr(type));        }    }    octstr_destroy(client_ip);    octstr_destroy(msisdn);    return ret;}static void server(int lport, int pport) {	int i;    int ss, cs; /* server and client socket */	Octstr *data, *from, *addr;    /* pid_t pid = getpid(); */    Dict *radius_table;   	/* create client binding */	cs = udp_client_socket();	addr = udp_create_address(octstr_create("localhost"), pport);    /* create server binding */	ss = udp_bind(lport, "0.0.0.0");	if (ss == -1)		panic(0, "Couldn't set up server socket for port %d.", lport);    /* init hash table */    radius_table = dict_create(30, (void (*)(void *))octstr_destroy);    i = 1;	while (1) {        RADIUS_PDU *pdu, *r;        Octstr *rdata;        int forward = 0;        /* get request */		if (udp_recvfrom(ss, &data, &from) == -1)			panic(0, "Couldn't receive request data from NAS");		info(0, "Got data from NAS <%s:%d>",              octstr_get_cstr(udp_get_ip(from)), udp_get_port(from));        /*        debug("",0,"Saving PDU packet");        f = fopen(octstr_get_cstr(octstr_format("/tmp/radius-pdu.%ld.%d", pid, i)), "w");        octstr_print(f, data);        fclose(f);        */                pdu = radius_pdu_unpack(data);        info(0, "PDU type: %s", pdu->type_name);        /* XXX authenticator md5 check does not work?! */        /* radius_authenticate_pdu(pdu, data, octstr_imm("radius")); */        /* store to hash table if not present yet */        forward = update_table(pdu, &radius_table);        /* create response PDU for NAS */        r = radius_pdu_create(0x05, pdu);        /*          * create response authenticator          * code+identifier(req)+length+authenticator(req)+(attributes)+secret          */        r->u.Accounting_Response.identifier = pdu->u.Accounting_Request.identifier;        r->u.Accounting_Response.authenticator =             octstr_duplicate(pdu->u.Accounting_Request.authenticator);        rdata = radius_pdu_pack(r);        /* creates response autenticator in encoded PDU */        radius_authenticate_pdu(r, &rdata, octstr_imm("radius"));        /* forward request to remote RADIUS server only if table updated */        if (forward) {            if (udp_sendto(cs, data, addr) == -1)                panic(0, "Couldn't send to remote RADIUS.");            if (udp_recvfrom(cs, &data, &from) == -1)                panic(0, "Couldn't receive from remote RADIUS.");            info(0, "Got data from remote RADIUS <%s:%d>",                  octstr_get_cstr(udp_get_ip(from)), udp_get_port(from));        }        /* send response to NAS */        if (udp_sendto(ss, rdata, from) == -1)			panic(0, "Couldn't send response data to NAS.");        radius_pdu_destroy(pdu);        radius_pdu_destroy(r);        octstr_destroy(rdata);        i++;        debug("",0,"Mapping table contains %ld elements",               dict_key_count(radius_table)); 	}}int main(int argc, char **argv) {	int lport, pport;		gwlib_init();	if (argc != 3)		panic(0, "usage: test_radius_acct <your RADIUS acct port> <remote RADIUS port>");		lport = atoi(argv[1]);    pport = atoi(argv[2]);    server(lport, pport);	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -