*** a/config.c	Thu Aug 22 13:22:00 2013
--- b/config.c	Tue Aug 27 19:39:57 2013
***************
*** 48,54 ****
  static char	*next_word	(char **);
  static int	parse_phyint	(char *s);
  static u_int32	ifname2addr	(char *s);
! 
  extern struct rp_hold *g_rp_hold;
  
  /*
--- 48,54 ----
  static char	*next_word	(char **);
  static int	parse_phyint	(char *s);
  static u_int32	ifname2addr	(char *s);
! u_int32	 default_rmnet_mask = UCAST_DEFAULT_RMNET_MASK;
  extern struct rp_hold *g_rp_hold;
  
  /*
***************
*** 258,263 ****
--- 258,274 ----
                    v->uv_name, inet_fmt(addr, s1, sizeof(s1)), inet_fmt(v->uv_rmt_addr, s2, sizeof(s2)),
                    numvifs, v->uv_ifindex, v->uv_rate_limit);
          } else {
+                         //iface name is rmnet0, force the subnet mask to 255.255.255.248
+                         //this will allow multicast to work.
+ 		        if( ( strcmp(v->uv_name, "rmnet0") ) == 0 )
+ 		        {
+ 				  //check if supplied default rmnet mask
+                                   if(default_rmnet_mask != 0)
+                                   {
+                                     v->uv_subnetmask=default_rmnet_mask;
+                                     mask=default_rmnet_mask;
+                                   }
+                         }
              logit(LOG_INFO, 0, "Installing %s (%s on subnet %s) as vif #%u-%d - rate=%d",
                    v->uv_name, inet_fmt(addr, s1, sizeof(s1)), netname(subnet, mask),
                    numvifs, v->uv_ifindex, v->uv_rate_limit);
***************
*** 302,308 ****
  #define CONF_ALTNET				10
  #define CONF_MASKLEN				11
  #define CONF_SCOPED				12
! 
  
  /*
   * function name: wordToOption
--- 313,319 ----
  #define CONF_ALTNET				10
  #define CONF_MASKLEN				11
  #define CONF_SCOPED				12
! #define CONF_RMNET_MASK 13
  
  /*
   * function name: wordToOption
***************
*** 331,336 ****
--- 342,349 ----
          return CONF_DATA_THRESHOLD;
      if (EQUAL(word, "default_source_metric"))
          return CONF_DEFAULT_SOURCE_METRIC;
+     if (EQUAL(word, "default_rmnet_mask"))
+         return CONF_RMNET_MASK;
      if (EQUAL(word, "default_source_preference"))
          return CONF_DEFAULT_SOURCE_PREFERENCE;
      if (EQUAL(word, "altnet"))
***************
*** 1046,1051 ****
--- 1059,1092 ----
      return TRUE;
  }
  
+ /*
+  * function name: parse_rmnet_mask
+  * input: char *s
+  * output: int
+  * operation: reads and assigns the default rmnet mask.
+  *            General form:
+  *		'parse_rmnet_mask <number>'.
+  */
+ int parse_rmnet_mask(char *s)
+ {
+     char *w;
+     u_int value;
+     //vifi_t vifi;
+     //struct uvif *v;
+ 
+     value = UCAST_DEFAULT_RMNET_MASK;
+     if (EQUAL((w = next_word(&s)), "")) {
+         logit(LOG_WARNING, 0, "Missing default rmnet mask len; set default %u",
+               UCAST_DEFAULT_RMNET_MASK);
+     } else if (sscanf(w, "%u", &value) != 1) {
+         logit(LOG_WARNING, 0, "Invalid default rmnet mask len; set default %u",
+               UCAST_DEFAULT_RMNET_MASK);
+         value = UCAST_DEFAULT_RMNET_MASK;
+     }
+     default_rmnet_mask = value;
+     logit(LOG_INFO, 0, "default_rmnet_mask is %u", value);
+     return TRUE;
+ }
  
  /*
   * function name: parse_default_source_preference
***************
*** 1169,1174 ****
--- 1210,1219 ----
              case CONF_DEFAULT_SOURCE_PREFERENCE:
                  parse_default_source_preference(s);
                  break;
+             case CONF_RMNET_MASK:
+                parse_rmnet_mask(s);
+             break;
+ 
              default:
                  logit(LOG_WARNING, 0, "unknown command '%s' in %s:%d",
                        w, configfilename, line_num);
