- switch( *(int*)nla_data( tb[CEGW_CMD_INFO] ) )
- {
- case CEGW_LISTEN:
- if( !tb[CEGW_ETH_IP] || !tb[CEGW_ETH_PORT] )
- {
- pr_devel( "canethgw: missing attribute for CEGW_LISTEN\n" );
- return -EINVAL;
- }
-
- /* ToDo: valid listen address */
- set = kmalloc( sizeof(*set), GFP_KERNEL );
- set->eth_ip = *(struct in_addr*)nla_data( tb[CEGW_ETH_IP] );
- set->eth_port = *(unsigned short*)nla_data( tb[CEGW_ETH_PORT] );
- kthread_run( cegw_thread_start, set, "canethgw" );
- break;
- case CEGW_RULE_CAN_ETH:
- if( !tb[CEGW_ETH_IP] || !tb[CEGW_ETH_PORT] || !tb[CEGW_CAN_IFINDEX] )
- {
- pr_devel( "canethgw: missing attribute for CEGW_RULE_CAN_ETH\n" );
- return -EINVAL;
- }
-
- ifindex = *(int*)nla_data( tb[CEGW_CAN_IFINDEX] );
- ip = *(struct in_addr*)nla_data( tb[CEGW_ETH_IP] );
- port = *(unsigned short*)nla_data( tb[CEGW_ETH_PORT] );
- pr_devel( "canethgw: new can->eth rule - (%d)->(%x:%hu)\n", ifindex, ip.s_addr, port );
-
- rule = kmalloc( sizeof(struct cegw_rule), GFP_KERNEL );
- if( rule == NULL )
- {
- break;
- }
-
- rule->can_ifindex = ifindex;
- rule->eth_ip = ip;
- rule->eth_port = port;
-
- hlist_add_head_rcu( &rule->list, &cegw_rule_can_eth );
- break;
- case CEGW_RULE_ETH_CAN:
- if( !tb[CEGW_ETH_IP] || !tb[CEGW_ETH_PORT] || !tb[CEGW_CAN_IFINDEX] )
- {
- pr_devel( "canethgw: missing attribute for CEGW_RULE_ETH_CAN\n" );
- return -EINVAL;
- }
-
- ifindex = *(int*)nla_data( tb[CEGW_CAN_IFINDEX] );
- ip = *(struct in_addr*)nla_data( tb[CEGW_ETH_IP] );
- port = *(unsigned short*)nla_data( tb[CEGW_ETH_PORT] );
- pr_devel( "canethgw: new eth->can rule - (%x:%hu)->(%d)\n", ip.s_addr, port, ifindex );